我正在运行:
$("*: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>
...
所以我要做的就是附上那个功能&amp;事件到不在#boo
内的每个输入元素。
这是有效的,但问题是这样做是一遍又一遍,浏览器会冻结。
我需要livequery,因为html有时会更新,我需要再次将事件附加到新元素。
那么如何检查blah()
是否已经应用于输入元素并停在那里?
答案 0 :(得分:2)
说实话,我不这样做。您的第一个语句是一个很大的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();
答案 1 :(得分: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);
...以便仅绑定函数(如果尚未绑定)。