背景资讯
目前在IE9中存在一个错误,它认为NodeFilter
方法的createTreeWalker
属性是回调函数,而不是包含回调函数的对象。
在这样的电话中:
document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, filter, false);
filter
在Webkit和Gecko中定义为“包含方法acceptNode
的对象”;但是,在IE9中,根本没有提到acceptNode - 它需要一个“回调方法”,而不包含该对象。
实际问题
那么,如果不进行明确的浏览器检测,解决此问题的最佳方法是什么??在某些情况下,我需要filter
作为方法,而在其他情况下,我需要它作为包含该方法的对象。有没有一个干净的方法来实现这一目标?所有这些浏览器都声称支持DOM 2.0,所以我无法测试...
文件 - 错误证明
以下是每个文档的比较:
答案 0 :(得分:6)
好吧,我想出了一件有用的东西。对更好的选择开放:
var filter = { acceptNode: function() {
//do filtering...
} };
// Hackzilla. A true W3C-compliant nodeFilter object isn't passed, and instead a "safe" one _based_ off of the real one.
var safeFilter = filter.acceptNode;
safeFilter.acceptNode = filter.acceptNode;
document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, safeFilter, false);
这很好用,因为不错的浏览器会在过滤器对象上调用.acceptNode
,坏的会立即尝试执行它。
替代?
答案 1 :(得分:5)
实际上IE 9 确实遵循规范。阅读ECMAScript bindings section of the DOM spec:
对象NodeFilter
这是ECMAScript函数参考。此方法返回一个数字。该参数是一个Node对象。
因此,符合标准的浏览器(包括所有主要版本的当前版本)都将接受一个函数作为filter
参数。