classNameの効率的なマッチング
2246 ワード
クラスをマッチングする場合、jQueryは、ターゲットノードのクラス名でも式でも処理しなければならない比較的不器用な方法に使用されます.
matchなら.aaaは、matchが.aaa.bbbは?!では、もっと速い方法はありませんか.あります.私たちが必要とするクラス名を同時に一致させるために、強力な正則を構築する必要があります.1つかもしれませんが、複数かもしれません.順序をつけません.群の中の達人の賜物を拝んで、これは正則的にすぐに解決しました(私は私のこの強大なシンクタンクのために誇りに思って、それから51 js、javaeye、blueideaに行く必要はありません......).
たとえば、aaaとbbbを同時に持つこれらのLI要素をマッチングするには、式を正規化し、直接test検証すればいいので、要素上のclassNameを処理する必要はありません.
2011.1.27より良い案
match = " " + match[1].replace(/\\/g, "") + " ";
for (var i = 0, elem;(elem = curLoop[i]) != null; i++) {
if ((elem.className && (" " + elem.className + " ").replace(/[\t
\r]/g, " ").indexOf(match) >= 0)) {
//*******************
}
}
matchなら.aaaは、matchが.aaa.bbbは?!では、もっと速い方法はありませんか.あります.私たちが必要とするクラス名を同時に一致させるために、強力な正則を構築する必要があります.1つかもしれませんが、複数かもしれません.順序をつけません.群の中の達人の賜物を拝んで、これは正則的にすぐに解決しました(私は私のこの強大なシンクタンクのために誇りに思って、それから51 js、javaeye、blueideaに行く必要はありません......).
<ul>
<li class="aaa bbb"> </li>
<li class="bbb aaa"> </li>
<li class="aaa ccc bbb"> </li>
<li class="aaa"> </li>
<li class="bbb"> </li>
</ul>
たとえば、aaaとbbbを同時に持つこれらのLI要素をマッチングするには、式を正規化し、直接test検証すればいいので、要素上のclassNameを処理する必要はありません.
var src = ""
var escape = /([-.*+?^${}()|[\]\/\\])/g
"aaa.bbb".replace(/[^.]+/g,function($){
src += '(?=[\\s\\S]*(?:^|\\s)'+$.replace(escape, '\\$1')+'(?:\\s|$))'
})
var reg = new RegExp(src);
var t1 = "aaa bbb"
var t2 = "bbb aaa"
var t3 = "aaa ccc bbb"
var t4 = "aaa"
var t5 = "bbb"
alert(reg.test(t1))//true
alert(reg.test(t2))//true
alert(reg.test(t3))//true
alert(reg.test(t4))//false
alert(reg.test(t5))//false
2011.1.27より良い案
var src = ".aaa.bbb".replace(/([\/\[\]\:])/g,'\\$1')// className
.replace(/\.([^.]+)/g,'(?=[\\s\\S]*(?:^|\\s)$1(?:\\s|$))');//
var reg = new RegExp('^'+src);// ^ , n (n ) by abcd
var t1 = "aaa bbb"
var t2 = "bbb aaa"
var t3 = "aaa ccc bbb"
var t4 = "aaa"
var t5 = "bbb"
alert(reg.test(t1))//true
alert(reg.test(t2))//true
alert(reg.test(t3))//true
alert(reg.test(t4))//false
alert(reg.test(t5))//false