2009-08-25 3 views
2

このJSは、多くのフィールドがあるページで実行されます。とにかくこのコードの速度を向上させるために見ることができますか?もしそうなら、あなたが見つけたものを説明できますか?私はあなたが属性を使用していることがわかりますこのJavaScriptを最適化することができますか?

var _TextInputs = null; 
function GetTextInputs() 
{ 
    if (_TextInputs == null) 
    { 
     _TextInputs = jq('input[type=text]'); 
    } 

    return _TextInputs; 
} 

var _Spans = null; 
function GetSpans() 
{ 
    if (_Spans == null) 
    { 
     _Spans = jq('span'); 
    } 

    return _Spans; 
} 


function UpdateRate(ratefield, name) 
{ 
    GetTextInputs().filter('[' + name + ']').each(function() 
    { 
     this.value = FormatCurrencyAsString(FormatCurrencyAsFloat(ratefield.value)); 
     CalculateCharge(name.replace('Rate', ''), jq(this).attr(name)); 
    }); 
} 

function CalculateCharge(name, activity_id) 
{ 
    var inputs = GetTextInputs(); 
    var bill_field = inputs.filter('[' + name + 'Bill=' + activity_id + ']'); 
    var rate_field = inputs.filter('[' + name + 'Rate=' + activity_id + ']'); 
    var charge_field = GetSpans().filter('[' + name + 'Charge=' + activity_id + ']'); 

    charge_field.text(FormatCurrencyAsString(FormatCurrencyAsFloat(bill_field.val()) * FormatCurrencyAsFloat(rate_field.val()))); 
} 
+4

Firebugには素晴らしいjavascriptプロファイラーがあります。時間が実際に費やされている場所が表示されます。 – harpo

+0

Firefoxはこれをすばやく実行します。問題はIEにあります。 – ChaosPandion

+0

IE 8には素晴らしいJavaScriptプロファイラが組み込まれています。F12キーを押します。 –

答えて

5

することはでき:

    私は、私はあなたがより多くのIDとクラス、例えばを使用することが示唆されできる最善のように、任意のマークアップを見ることができません
  • eachwhile
  • と置き換えてください。val().valueと置き換えてください(これらのフィールドはプレーンテキストのものです)
  • 名前/タイプではなくクラス別にアクセスします。
  • attr()をプレーンプロパティアクセスで置き換えます。例えば:this.attr(name) - >this.name

これらは、すべての原因の関数呼び出しを減らし主に物事をスピードアップする必要があり、むしろ控えめな変化です。

すべての関数呼び出しで要素を照会しないでください()。これらの要素が静的である(つまり、アプリのライフサイクル中に変更されていない)場合は、を呼び出してください。代わりに、ループの外にそれらを格納します。

+0

Firebugプロファイラーと明白な一時変数の間で、私はこのコードを "うまくいく"ように管理しました。おかげさまで – ChaosPandion

4

_TextInputs = jq('input[type=text]'); 

inputs.filter('[' + name + 'Bill=' + activity_id + ']'); 

属性フィルタが便利です。:、どこでも例えばをフィルタリングしますが、より直接的なクラスやIDセレクタと比較した場合、特に「てき​​ぱき」ではありません。

jq('input.textInput'); 

の代わり:

jq('input[type=text]'); 
0

少し話題はありませんが、私はJavascript Rocksを使用しています。この本は、Scriptaculousの作成者による素晴らしいJS最適化アドバイスのTONを含んでいます。 DOM Monsterというツールもあります。これは、パフォーマンスのボトルネックを追跡するのに役立ちます。ヒューリスティックとDOMの複雑さに基づいて非効率を探してDOMを実際に追跡するので、Firebugには素晴らしい補完物です。

関連する問題