2

私はこれを実行しています:

$("*:not(#boo) .content").livequery(function(){  
  $("input, select").blah();
});

blah()このように見えます:

(function( $ ) {
  $.fn.blah = function(){
    var that = this;
    return this.each(function(){
       $(this).bind('change', function(){
           // do some stuff here

           return true;
        }).change();

   });
 };

})(jQuery);

HTMLは次のようになります。

<div id="boo">
 <div class="content">
  <input type="text" />
  <input type="text" />
  ...
 </div>
</div>

<div class="content">    
 <input type="text" />
 <input type="text" />
</div>
...

だから私がやろうとしているのは、その関数とイベントを内部にないすべての入力要素にアタッチすることです#boo。これは機能しますが、問題は毎秒のように何度も何度もそれを実行し、ブラウザがフリーズすることです。

HTMLが時々更新されるため、livequeryが必要です。また、イベントを新しい要素に再度アタッチする必要があります。

blah()では、入力要素にすでに適用されているかどうかを確認して、そこで停止するにはどうすればよいですか?

4

2 に答える 2

2

正直なところ、私はそのようにはしません。最初のステートメントは、マークアップ内のすべてのノードに対してクエリを実行し、必要な要素を THEN で除外することにより、大きな NoNo になります。なぜこのようにしないのですか:

$('input').filter(function() { return !!$(this).closest('#boo').length } )
          .live('change', function() {
              // do some stuff here
          }).change();

もちろん、これは、ここでの私の範囲外で行うべきことが他にない場合にのみ意味があります。しかし、ここでさえ必要ないようです.livequery

アップデート

上記のコードは機能しませんでした。しかし、これでうまくいくはずです:

$('input').live('change', function() {
    if(!$(this).closest('#boo').length) {
        // do some stuff here
    }
}).change();
于 2011-01-31T09:53:32.283 に答える
1

クエリを実行$.data( object, 'events' )すると、イベントのプロパティがアタッチされたオブジェクトが返されます。したがって、あなたの場合、この条件を追加することができます:

(function( $ ) {
  $.fn.blah = function(){
    var that = this;
    return this.each(function(){
       if ($.data( $(this).get(0), 'events' ) !== void(0) &&
           $.data( $(this).get(0), 'events' ).change === void(0)) {
           $(this).bind('change', function(){
               // do some stuff here
               return true;
           }).change();
       }
   });
 };
})(jQuery);

...まだバインドされていない場合にのみ関数をバインドするため。

于 2011-01-31T10:03:26.527 に答える