classNameの効率的なマッチング

2246 ワード

クラスをマッチングする場合、jQueryは、ターゲットノードのクラス名でも式でも処理しなければならない比較的不器用な方法に使用されます.


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