为内容更改创建 jQuery 特殊事件
我正在尝试创建一个 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 帮助我。
I'm trying to create a jQuery special event that triggers when the content that is bound, changes. My method is checking the content with a setInterval
and check if the content has changed from last time. If you have any better method of doing that, let me know. Another problem is that I can't seem to clear the interval. Anyway, what I need is the best way to check for content changes with the 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)
}
};
})();
And bind it like this:
$('#container').bind('contentchange', function() {
console.log('contentchange triggered');
});
I get the console.log
'content changed', but not the console.log
'contentchange triggered'. So it's obvious that the callback is never triggered.
I just use Firebug to change the content and to trigger the event, to test it out.
Update
I don't think I made this clear enough, my code doesn't actually work. I'm looking for what I'm doing wrong.
Here is the finished code for anyone interested
(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);
}
};
})();
Thanks to Mushex for helping me out.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
还可以看看 James 类似脚本 (声明为 jquery 对象方法和不作为事件)
并创建特殊事件
无论如何,如果您只需要它作为事件,那么您的脚本很好:)
also take a look to James similar script (declaring as jquery object method and not as event)
and creating special event
Anyway, if you need it only as event, you script is nice :)
我知道这个帖子/问题有点老了,但这些天我在一个类似的解决方案后面发现了这个:
来源:http://naspinski.net/post/Monitoring-a-DOM-Element-for-Modification-with-jQuery.aspx
希望如此帮助某人!
I know this post/question is a little old, but these days I was behind a similar solution and I found this:
Source: http://naspinski.net/post/Monitoring-a-DOM-Element-for-Modification-with-jQuery.aspx
Hope this help someone!
原始问题中的完成代码对我有用,谢谢!我只是想指出,我正在使用 jquery 1.9.1 并且 $.event.handle 似乎已被删除。我更改了以下内容以使其正常工作。
jQuery.event.handle.call(self, {type:'contentchange'});
到
jQuery.event.dispatch.call(self, {type:'contentchange'});
The finished code in the original question worked for me, thank you! I would just like to note that I am using jquery 1.9.1 and $.event.handle seems to have been removed. I changed the following to get it to work.
jQuery.event.handle.call(self, {type:'contentchange'});
to
jQuery.event.dispatch.call(self, {type:'contentchange'});
也许你可以尝试 Mutation Observer
以下是代码:
maybe you could try Mutation Observer
Here are the code: