0

そのリンクのhrefが特定の拡張子を持つファイルを指している場合、ページ上のすべてのリンクにclick()イベントを適用したいと思います。適用可能な拡張機能のリストは30前後で推移しており、将来的に少し増える可能性があります(ただし、100を超えることはありません)。

私の最初の傾向は、イベントバインディングを次のように構成することです。

$("a[href$=avi],
   a[href$=ppt],
   a[href$=rtf],

// ...snip a bunch more of these....

   a[href$=pdf],
   a[href$=xml]").click(function() {
      // Do something
 });

これはクレイジーですか?

4

3 に答える 3

6

すべてのリンクを選択してから、クリック関数内でフィルタリングします。たとえば、次のようになります。

$('a').click(function() {
    var ext = /[^.]+$/.exec($(this).attr('href'));
    switch(ext) {
        case 'avi':
        case 'ppt':
        ...
        case 'xml':
            // Do something
            break;
    }
});

多くのトラバースを節約し、さらにきれいになります。

このアプローチの悪い点は、jQueryが各セレクターを個別に処理する可能性があるため、最初のセレクターの検索が終了した後、他に見つかったものを完全に忘れて、ドキュメント全体を再度検索して次のセレクターを探すことです。この方法では、jQueryはすべてのリンクを1回検索するだけで済み、関数内でswitch-caseを使用するのはおそらく非常に高速なので、パフォーマンスの問題に悩まされる必要はありません。

于 2009-12-03T20:06:10.360 に答える
3

ヒントをお伝えします-ほぼ間違いなく。私はこのようなことをしました、そしてそれは非常に苦痛でした。別のアプローチを試しました。各セレクターの結果を配列に格納してから、$(array).click()を実行する方がはるかに高速でした(特にIE6 / P3 900 mHzで)

とはいえ、ベンチマークを実行して、アプリケーションの最速の方法を見つける必要があります。 IE6を搭載した古い安っぽいコンピューターを見つけるか、IE6を搭載したVMを入手して、そのタイミングをテストします。セレクターの調整(およびどれが遅いか、どのようにそれらを呼び出さないようにするかを確認すること)は、JavaScriptの最適化の最初の目的です。

于 2009-12-03T20:11:21.940 に答える
2

セレクターのセットではなく、フィルター関数の使用を検討します。

$('a').filter( function() {
           return $(this).attr('href').match( /(avi|ppt|...|xml)$/ ) != null;
       })
      .click( function() {
           // do something
       });
于 2009-12-03T20:19:03.397 に答える