我想说这实际上不存在的原因有两个。
- DOM 修改事件未得到广泛支持。您可以在 Chrome 和 FF 中收听
DOMSubtreeModified,但在 IE 和 Opera 中则不行。
- 根据选择器检查每个 DOM 事件的成本会非常高。
.live/.delegate 已经是非常低效的策略了。
为了帮助图 2,假设 1 不是问题,我们可以捕捉到元素添加到 DOM 的任何时间。发生这种情况时,我们需要根据"#myTable tr" 评估新元素及其子元素。这将显着增加随每个 DOM 范围变化而执行的非本地代码的数量,从而真正减慢速度。
最好的策略是将您想要的 jQuery 更改添加到将插入 <tr> 的代码中
更新如果你别无选择并且只需要支持 Chrome 和 FF,我能想到一个解决方案。显然,它不会很快,你可以通过特异性来提高你的表现:
$.fn.elementInserted = function(pattern, fn) {
return this.bind('DOMNodeInserted', function(event) {
if (event.target.nodeType != 1) return;
$(event.target).filter(pattern).each(fn);
});
};
/* SLOW */ $(document).elementInserted('#myTable tr', function(){$(this).attr('hello', 'world');});
/* FASTER */ $('#myTable').elementInserted('tr', function(){$(this).attr('hello', 'world');});
在此处查看示例:http://jsfiddle.net/vCZHQ/
理论上你可以通过超时来检查 IE 中的表是否发生了变化:
var oldEls = $('#myTable tr');
setInterval(function() {
var newEls = $('#myTable tr');
if(oldEls.length < newEls.length) {
/* Do code here to figure out who is new and apply changes. */
}
oldEls = newEls;
}, 50);
也就是说,这会有一点延迟,并且确实会耗尽笔记本电脑的电池。