【发布时间】:2012-02-28 19:09:44
【问题描述】:
似乎 jQuery $.hide() 和 $.show() 不会修改 DOM 来隐藏/显示元素,因此不会触发 DOMSubtreeModified 事件。如何在 DOM 上的任何元素上捕获此类事件?
谢谢。
更新: 该代码不适用于 Chrome16 Ubuntu。本来我需要定位基于Webkit的QT浏览器。
【问题讨论】:
标签: javascript jquery dom javascript-events
似乎 jQuery $.hide() 和 $.show() 不会修改 DOM 来隐藏/显示元素,因此不会触发 DOMSubtreeModified 事件。如何在 DOM 上的任何元素上捕获此类事件?
谢谢。
更新: 该代码不适用于 Chrome16 Ubuntu。本来我需要定位基于Webkit的QT浏览器。
【问题讨论】:
标签: javascript jquery dom javascript-events
你是对的,DOMSubtreeModified 纯粹是为了修改所以你有几个选择:
1) 使用DOMAttrModified,它的支持与DOMSubtreeModified 一样糟糕,甚至更差
2) 覆盖 jQuery 中的 .hide() 和 .show() 方法,以便您可以捕获对它们的任何调用并响应:
var oldShow = $.fn.show;
$.fn.show = function(args) {
alert('showing!');
oldShow.apply(this, arguments);
};
// do the same for .hide()
3) 在循环中运行某种“监视器”(例如setInterval()),查看可见的子项计数或其他影响
4) 重新组织你思考问题的方式...
希望这有助于 -ck
【讨论】:
您的示例 JSFiddle 在 Chrome 17 中适用于我。我相信您的问题是浏览器支持问题。我不确定确切的浏览器支持,但并非所有浏览器都支持DOMSubtreeModified 事件。我知道 IE8 不支持 DOMSubtreeModified。
和.hide()/.show()改变元素style属性,添加display:none/display:(block|list-item|etc.)
我建议在您更改的元素上触发自定义事件,然后监听该事件:
//register event handler
$(document).on('customDOMAltered', function (event) {
console.log(event.target);
});
//alter DOM element
$('#some-element').hide().trigger('customDOMAltered');
【讨论】: