1

私が取り組んでいるアプリケーションでは、プロトタイプの $$ 関数を使用して、ページ上のすべての A HREF 要素を取得し、javascript を介してそれらのリンクを変更します。ページに適切な量のリンクがある限り、これは問題なく機能します。

一部のまれなユースケースでは、$$ 関数は 5K 以上のヒットを返します (恐ろしい :)) その動作を最適化する方法、またはパフォーマンスを向上させるために完全に取り除く方法はありますか?

編集— コメントからの重要な詳細

具体的なコードは次のとおりです。

$$('a:not([href="#"])').each(function(item){});

私はprototypejs 1.7.1を使用しています

4

2 に答える 2

2

セレクターが少し遅い場合は、おそらくそれ:not()を行っているのは です。<a>すべての要素のリストから始めて、明示的なコードを含むものを除外できます。

var anchors = $$('a').reject(function(a) { return a.href === '#'; });

(私のプロトタイプはかなり錆びています :) これは、Sizzle を使用する最新のライブラリに当てはまります。のような疑似セレクタ演算子:notはあまり効率的ではありません。状況に大規模な要因が含まれていない場合は、速記として役立ちますが、あなたのような場合には優れたアイデアではありません。<a>ドキュメント内のすべての要素を見つけるのは非常に高速であり、そのリストを繰り返し処理するのも非常に高速です。

于 2013-08-01T15:00:14.207 に答える
2

これについては、まったく異なる方法で行うことができます。

たとえば、5000 レコードのテーブルがあるとします。

<table id="recordtable">
<tr>
    <td>Record 1</td>
    <td><a href="#link1">click here</a></td>
</tr>
......//snip
<tr>
    <td>Record 100</td>
    <td><a href="#link100">click here</a></td>
</tr>
.......//snip
</table>

リンクのクリックを監視するオブザーバーをテーブルに配置します

$('recordtable').on('click','a:not([href="#"])',function(e){
    //FYI 'this' points to the table element
    //e is the event object passed in-------------------^^^
    //use e.findElement() to get the element that the click originated on
    var el = e.findElement();
    if(el.readAttribute('href') != "something")
    {
        window.location.href = 'some other link';
    }
    //most importantly stop the event so that the link doesn't fire
    e.stop();
});
于 2013-08-01T15:00:17.473 に答える