2011-09-12 11 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

あなたは比較が正しいです。 9.5のfontSizeは10に戻っています。 – Joe

+0

ありがとう!それはそれをするだろう! – rpophessagr

+0

問題はない、私はそこに行った。同じコードをあまりにも長く見て、それは私が見ることができない何かを知っている。その男があなたの仕事をやめるように言ったとは信じられません。それほど上品ではありません。お役に立てて嬉しいです。 – Joe

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

あなたがfont-sizeから取得単位は、あなたが入れとして必ずしも(a)のピクセルではなく、また(b)は同ユニット。

それは、長さを返すために使用されるものを単位指定されていないのですが、多くのブラウザでは、現在ポイントです。点はピクセルよりも小さいので、整数の長さは長くなるので、非常に簡単にを続けることができます。

ピクセルであっても、ブラウザーはサイズを最も近いピクセルに丸めて、読み取ったときに95%のサイズを100%と同じサイズにすることができます。または、font-sizeの最小設定に達しても、それを減らすことはできません。

各ステップで現在のフォントサイズを読み返す代わりに、必要なピクセルサイズを変数に保存し、毎回その変数を減らします。次に、その変数の値の所定の下限に達した場合は、あきらめてください。

+0

"あなたがfont-sizeから得る単位は必ずしもピクセルではなく、(b)あなたが入れた単位と同じでもありません。私がフォントを100%に設定していたとしても、私はそれをpxで表していました。これはサイトごとに異なりますか? – rpophessagr

3

デバッガでコードをステップ実行し、実際に条件の値を確認して、期待通りの状態になっていることを確認する必要があります。私の推測は_elm.clientHieghtで、_elm.clientWidthは実際には変更されていません。

+0

コードが変更され、コードはループの代わりに条件で処理されました。 – rpophessagr

1

フォントサイズが実際に変更されないため、おそらく無限ループに陥っています。例えば。見つかったフォントサイズが10pxの場合、それを9.5pxに更新します。これはおそらくブラウザによって10pxに丸められます。その場合は何も変わらず、機能は永遠に続くでしょう。

+0

私は助けに感謝します、それは答えです。 @abstractは実際の例のために緑色のチェックを得ました。 – rpophessagr

1

あなたは

$('div').fontBefitting() 

を行うときにこれが最初と同じ他のすべてのdivのフォントサイズを作り、その後、最初のdiv内のテキストは、それのボックスに収まるようになります無関係な問題を持っています。これは、意図された動作のようには聞こえません。それぞれの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

関連する問題