2011-09-12 8 views
2

나는 이것을하는 것을 싫어한다. 이것은 큰 프로젝트를 끝내기위한 작은 조각이며 내 마음은 튀김입니다. ...왜 JavaScript 루프가 무한대입니까?

다음은 코드입니다. 요소가 넘치고 글꼴 크기가 조정되는지 확인합니다. 오버플로가되지 않을 때까지 크기를 조정해야합니다. 루프의 조건이 무시되고 브라우저가 정지 된 것처럼 보입니다 ... jQuery의 작동 방식에 중요한 부분을 놓친 것 같습니다.

$.fn.fontBefitting = function() { 
    var _elm = $(this)[0]; 
    var _hasScrollBar = false; 
    while ((_elm.clientHeight < _elm.scrollHeight) || (_elm.clientWidth < _elm.scrollWidth)) { 
     var fontSize = $(this).css('fontSize'); 
     fontSize = parseInt(fontSize.substring(0,fontSize.length-2))*0.95; 
     $(this).css('fontSize',fontSize+'px');   
    } 

} 

미리 감사드립니다.

+6

'while'루프는 어디에 있습니까? –

+0

while 루프가 없습니까? 이것이 매트릭스입니까? –

+0

와우, 나는 조건으로 그것을 게시했다. 편집 됨 ... – rpophessagr

답변

4

변경 :

fontSize = parseInt(fontSize.substring(0,fontSize.length-2))*0.95; 

에 :

fontSize = parseInt(fontSize.substring(0,fontSize.length-2))-1; 

가 여기 Working Demo입니다. 글꼴 크기가 10px에 도달하면 10 * .95가 9.5로 브라우저가 최대 10px로 반올림되었습니다. 따라서 무한 루프. 그들은 당신이 글꼴 크기를 감소하는 경우

+0

비교가 정확합니다. fontSize가 9.5이면 10으로 되돌아갑니다. – Joe

+0

고마워요! 그럴거야! – rpophessagr

+0

문제 없습니다, 저도 거기에갔습니다. 같은 코드를 너무 오랫동안 보면서, 내가 볼 수없는 것임을 알았습니다. 그 남자가 네 일을 그만두라고 말한 걸 믿을 수가 없어. 그것은 매우 고상하지 않습니다. 다행히 도울 수있어. – Joe

1
var fontSize = $(this).css('fontSize'); 
fontSize = parseInt(fontSize, ... 

당신이 font-size에서 얻는 장치가 필요하지 않다 (A) 픽셀 않으며, (b)는 당신이 넣어 동일한 단위.

길이를 반환하는 데 사용됩니다 어떤 단위를 지정하지,하지만 많은 브라우저에서 현재 포인트입니다. 점은 픽셀보다 작기 때문에 정수 길이가 더 길어집니다. 따라서 쉽게 영속적으로 을 계속 사용할 수 있습니다.

픽셀 인 경우에도 브라우저는 크기를 가장 가까운 픽셀까지 반올림하여 다시 읽을 때 95 % - 크기를 100 %와 동일한 크기로 만들 수 있습니다. 또는 최소 글꼴 크기 설정에 도달 할 수 있으며 더 이상 글꼴 크기를 줄일 수 없습니다.

각 단계에서 현재 글꼴 크기를 다시 읽지 않고 원하는 픽셀 크기를 변수에 유지하고 매번 그 변수를 줄입니다. 그런 다음 해당 변수의 값에 대해 미리 결정된 하한값에 도달하면 포기합니다.

+0

"글꼴 크기에서 가져 오는 단위는 꼭 픽셀 일 필요는 없습니다. 또한 (b) 같은 단위로 넣는 것도 아닙니다." 글꼴을 100 %로 설정 했더라도 솔루션을 디버깅 할 때 px로 표시되었습니다. 이것이 사이트마다 다를 수 있습니까? – rpophessagr

3

디버거에서 코드를 단계별로 실행하고 조건 값을 실제로 확인하여 예상 한대로 변경해야합니다. 내 생각 엔 _elm.clientHieght이고 _elm.clientWidth은 실제로 변경되지 않습니다.

+0

코드가 바뀌고 코드가 루프 대신 조건으로 작동했습니다. – rpophessagr

1

글꼴 크기가 실제로 변경되지 않으므로 무한 루프가 발생했을 가능성이 큽니다. 예 : 발견 된 글꼴 크기가 10px라면 9.5px로 업데이트되어 브라우저에서 10px로 반올림됩니다. 이 경우 아무 변화가 없으며 기능은 영원히 계속 실행됩니다.

+0

도움을 주시면 감사하겠습니다. @abstract는 작동 예제로 인해 녹색 체크를 얻었습니다. – rpophessagr

1

당신은 당신이 첫 번째 DIV의 텍스트가 다음, 그것의 상자에 맞게 처음과 같은 다른 모든 div의의 글꼴 크기를 만들 것

$('div').fontBefitting() 

을 수행 할 때 관련이없는 문제가 생겼어요. 이것은 의도 한 동작처럼 들리지 않습니다. 각 div가 텍스트의 크기를 조정하고 텍스트 만 맞춰지기를 바랍니다.

당신이 당신의 코드를 변경해야합니다

$.fn.fontBefitting = function() { 
    /* $.fn.* runs on a jQuery object. Make sure to return it for chaining */ 
    return this.each(function() { 
     var fontSize = parseInt($(this).css('fontSize')); 
     while (this.clientHeight < this.scrollHeight || 
       this.clientWidth < this.scrollWidth) { 
      fontSize--; 
      $(this).css('fontSize', fontSize + 'px');   
     } 
    }); 
} 
+0

왜 downvote? OP의 코드는'$ .fn'의 작동 방식과 브라우저가 글꼴 크기를 처리하는 방법에 대해 잘못된 가정을하고있었습니다. – Eric

+0

귀하의 노력과 최적화에 감사드립니다. 그러나 귀하의 구두로 인해 투표를 거절했다고 상상합니다. 앞으로 편집 할 때 "코드를 최적화 할 수있는 몇 가지 방법이 있습니다."라고 권하고 싶습니다. 대신 "코드가 잘못 작성되었습니다." 내 코드를 기꺼이 사용하여 개선 할 것입니다. 감사합니다 – rpophessagr

+0

@rpophessagr : 그것은 단지 최적화가 아니므로 코드가 잘못 작동했습니다 -'$ ('div'). fontBefitting()을 호출하면 첫 번째 div의 텍스트가 상자에 맞게 만들어지고 다른 모든 글꼴의 글꼴 크기가 만들어집니다. 첫 번째 것과 같은 divs. 아마 의도 한 행동이 아닙니다. – Eric

0

당신은 clientHeight 또는 clientWidthscrollHeight 또는 scrollWidth 댄 적은 있는지 확인하고있어?그것은 그러한 상황 하에서 결코 수렴하지 않을 것입니다. 글꼴 크기를 늘리려는 경우

+0

오버플로가 발생하지 않도록 글꼴 크기를 줄입니다. – rpophessagr

관련 문제