【发布时间】:2010-11-29 19:08:24
【问题描述】:
我正在尝试创建一个 jQuery 特殊事件,该事件在绑定的内容发生更改时触发。我的方法是使用 setInterval 检查内容并检查内容是否与上次相比发生了变化。如果你有更好的方法,请告诉我。另一个问题是我似乎无法清除间隔。无论如何,我需要的是使用 event.special 检查内容更改的最佳方式。
(function(){
var interval;
jQuery.event.special.contentchange = {
setup: function(data, namespaces) {
var $this = $(this);
var $originalContent = $this.text();
interval = setInterval(function(){
if($originalContent != $this.text()) {
console.log('content changed');
$originalContent = $this.text();
jQuery.event.special.contentchange.handler();
}
},500);
},
teardown: function(namespaces){
clearInterval(interval);
},
handler: function(namespaces) {
jQuery.event.handle.apply(this, arguments)
}
};
})();
并像这样绑定它:
$('#container').bind('contentchange', function() {
console.log('contentchange triggered');
});
我得到了 console.log '内容更改',但没有得到 console.log '内容更改触发'。所以很明显,回调永远不会被触发。
我只是使用 Firebug 来更改内容并触发事件,进行测试。
更新
我认为我说得不够清楚,我的代码实际上不起作用。我正在寻找我做错了什么。
这里是所有感兴趣的人的完成代码
(function(){
var interval;
jQuery.event.special.contentchange = {
setup: function(){
var self = this,
$this = $(this),
$originalContent = $this.text();
interval = setInterval(function(){
if($originalContent != $this.text()) {
$originalContent = $this.text();
jQuery.event.handle.call(self, {type:'contentchange'});
}
},100);
},
teardown: function(){
clearInterval(interval);
}
};
})();
感谢 Mushex 帮助我。
【问题讨论】:
-
有什么原因你不使用'var'来声明$this?
-
您在 real 页面中是否有一致的 'orginalContent' 拼写?
-
何时调用拆卸?
-
@David Andres - 当我取消绑定事件时。 $('#container').unbind('contentchange');
-
如果我没记错的话,这个实现只会保留最后一个计时器ID。要修复它,我会做类似 $(this).data("onchange.timer.id",interval) 并在拆卸中检索
标签: javascript jquery events javascript-events intervals