2012-03-02 12 views
1

現在、私はjQueryを学ぶために最善を尽くしており、以下のコードを作成しています。それは、ページ上の特定のポイントでクラスを削除して変更することだけです。私の質問は、マウスのスクロールごとに文が実行されるか無視できることを意識しているので、このコードがパフォーマンスにどれだけ影響を与えるかです。if else文を使用したJqueryのパフォーマンス

ご協力いただきありがとうございます。

マイコード:

function removeActive() { 
    $('#vtop ul li').each(function() { 
     $(this).children('a').removeClass('active'); 
    }); 
} 
$(window).scroll(function() { 
    var pos = $(window).scrollTop(); 
    if (pos <= '521') { 
     removeActive(); 
     $('#m-intro a').addClass('active'); 
    } else if (pos >= '1108' && pos <= '1626') { 
     removeActive(); 
     $('#m-nosales a').addClass('active'); 
    } else if (pos >= '2220' && pos <= '2742') { 
     removeActive(); 
     $('#m-crates a').addClass('active'); 
    } else if (pos >= '3332' && pos <= '3860') { 
     removeActive(); 
     $('#m-packages a').addClass('active'); 
    } else if (pos >= '4444' && pos <= '4966') { 
     removeActive(); 
     $('#m-signup a').addClass('active'); 
    } else if (pos >= '5556') { 
     removeActive(); 
     $('#m-contact a').addClass('active'); 
    } 
    $('#divd').text(pos); 
}); 
+0

このjqueryが実行されているページを開き、上下にスクロールしてパフォーマンスヒットが無視できるかどうかを確認してください。私はそれが私たちに求めるよりも信頼できると思う。 –

+0

はい、私はそれを試してみました。しかし、世界に複数のコンピュータがあるので、私は何声明があまりにも多かったのか、何も心配していないのかという一般化を求めていました。しかし、ありがとう。 – jhodgson4

答えて

1

私は、必要がないときにチェックしていないことを確認する状態を追加します。それ以外の場合は、いずれかの領域にあるすべてのピクセルがクリアされ、アクティブな状態が設定されます。これは単純な境界チェックを行うよりも高価です。また、状態の比較を最初に行います。これは、誤っている可能性がより高いためです。

function removeActive() { 
    $('#vtop ul li > a').removeClass('active'); 
} 

var active = ''; 
$(window).scroll(function() { 
    var pos = $(window).scrollTop(); 
    if (active != 'intro' && pos <= '521') { 
     removeActive(); 
     active = 'intro'; 
     $('#m-intro a').addClass('active'); 
    } else if (active != 'nosales' && pos >= '1108' && pos <= '1626') { 
     removeActive(); 
     active = 'nosales'; 
     $('#m-nosales a').addClass('active'); 
    } else if (active != 'crates' && pos >= '2220' && pos <= '2742') { 
     removeActive(); 
     active = 'crates'; 
     $('#m-crates a').addClass('active'); 
    } else if (active != 'packages' && pos >= '3332' && pos <= '3860') { 
     removeActive(); 
     active = 'packages'; 
     $('#m-packages a').addClass('active'); 
    } else if (active != 'signup' && pos >= '4444' && pos <= '4966') { 
     removeActive(); 
     active = 'signup'; 
     $('#m-signup a').addClass('active'); 
    } else if (active != 'contact' && pos >= '5556') { 
     removeActive(); 
     active = 'contact'; 
     $('#m-contact a').addClass('active'); 
    } else if (active != '') { 
     active = ''; 
    } 
    $('#divd').text(pos); 
}); 

また、リッテを簡素化することができます:

var active = ''; 
var prevActive = ''; 

$(window).scroll(function() { 
    var pos = $(window).scrollTop(); 
    if (pos <= 521) { 
     active = 'intro'; 
    } else if (pos <= 1107) { 
     active = ''; 
    } else if (pos <= 1626) { 
     active = 'nosales'; 
    } else if (pos <= 2219) { 
     active = ''; 
    } else if (pos <= 2742) { 
     active = 'crates'; 
    } else if (pos <= 3331) { 
     active = ''; 
    } else if (pos <= 3860) { 
     active = 'packages'; 
    } else if (pos <= 4443) { 
     active = ''; 
    } else if (pos <= 4966) { 
     active = 'signup'; 
    } else if (pos <= 5555) { 
     active = ''; 
    } else { 
     active = 'contact'; 
    } 

    if(active != prevActive) { 
     $('#vtop ul li > a').removeClass('active'); 
     if(active != '') { 
      $('#m-'+active+' a').addClass('active'); 
     } 
     prevActive = active; 
    } 

    $('#divd').text(pos); 
}); 

私は一緒に同じようなことを行う例をハッキング。これは、同じHTML構造を持っていませんが、それは、スクロールの挙動を示しています

http://jsfiddle.net/z7YHX/

+0

変数がどのようにチェックされているのかわかりませんが、あまりにも遅く設定されているように見えますか? – jhodgson4

+0

ポイントは、初めてスルーすると設定されません。次に、現在の範囲(イントロ)に設定します。つまり、1ピクセル下にスクロールすると、すでにそこにいるため、再び「イントロ」の範囲をチェックしません。これにより、1ピクセル下にスクロールしたり、アクティブな状態をクリアしたり、同じアイテムに設定したり、再びすべてのことを行うことができなくなります。あなたの「イントロ」の範囲では、520回のクリア/セッティングを終えることができます!これを行うには、範囲を離れるまで一度だけ行います。 –

+0

これは素晴らしいことですが、どれがボーナスなのか分かります。私は少し前に私が少し見ることができるようにジャーキネスがないので、より効率的なことを伝えることができます。まだ進行中ですが、ここでサイトが働いていれば、見てみたいと思っています。http://www.surebill.co.uk ..あなたの入力をもう一度おねがいします。 – jhodgson4

1
$('#vtop ul li').each(function(){ 
    $(this).children('a').removeClass('active'); 
}); 

は限り

$('#vtop ul li > a').removeClass('active'); 

に単純化することができるようにスクロールイベント中の文は、私はそれまたはそれと間違って何も表示されない場合深刻な減速を引き起こすでしょう。

+0

ああ、OKですので、 '>'は指定されたすべての子要素を選択します。これは素晴らしいことです。あなたの経験にはどれくらいのステートメントがあまりにも多いのですか?もう一度ありがとう – jhodgson4

+0

まあ、非モバイル環境では、あなたがヒットする現実的な制限はありません。あなたのセレクタでたくさんの '、'を使うとIEの速度が低下します。ただし、モバイル環境では、ダイレクトセレクタを使用する方が効率的であるため、テキストセレクタはできるだけ避けたいと考えています。 –

+0

私は読んだり、保守したりするのが一番簡単な道に執着する傾向があります(例えば、 '$("#vtop ")、children()、children()、children()、removeClass絶対的な最速のセレクタに行くよりもむしろ。 –

1

パフォーマンスについてはわかりませんが、このようなものは読みやすいです。それを試してみませんでしたが、あなたは考えを得る...別のオプションは、switchステートメントを代わりに使用することです。

var elms = { 
    intro: { min: 0, max: 521 }, 
    nosales: { min: 1108, max: 1626 }, 
    crates: { min: 2220, max: 2742 }, 
    packages: { min: 3332, max: 3860 }, 
    signup: { min: 4444, max: 4966 }, 
    contact: { min: 5556, max: $(window).height() } 
}; 
$(window).scroll(function() { 
    var pos = $(window).scrollTop(); 
    for (var el in elms) { 
     var min = elms[el].min, 
      max = elms[el].max; 
     if (pos >= min && pos <= max) { 
      $('#vtop ul li > a').removeClass('active'); 
      $('#m-' + elms[el]).addClass('active'); 
      break; 
     } 
    } 
}); 
+0

posは$(window).scrollの内側で決定する必要がありますか? –

+0

ええ、あなたは正しい、固定されています。 – elclanrs

0

その良いコードが、私はこのコードを書くより保守方法があると思います - オブジェクトリテラルを使用しては - そのダウンロードも少なくなります。

var bands = { 
    intro: [0,521], 
    nosales:[1108,1626], 
    crates:[2220,2742], 
    packages:[3332,3860], 
    signup: [4444, 4966], 
    contact: [5556, 99999]}; 

var win = $(window); //Cache for speed 

win.scroll(function() { 
    var pos = win.scrollTop(); 

    for (var key in bands) { 
     var band = bands[key]; 
     if (pos >= band[0] && pos <= band[1]) { 
      $('#vtop ul li > a').removeClass('active'); 
      $('#m-' + key + ' a').addClass('active'); 
      break; 
     } 
    } 
}); 
+0

これを試して理解するループを探しています... – jhodgson4

+0

ええ、私はこれが行く方法だと思います。私は同様のソリューションを投稿しました。 – elclanrs