Javascript 解决IE9 Treewalker过滤器缺陷的建议
背景信息 IE9中目前存在一个bug,它认为Javascript 解决IE9 Treewalker过滤器缺陷的建议,javascript,webkit,internet-explorer-9,gecko,Javascript,Webkit,Internet Explorer 9,Gecko,背景信息 IE9中目前存在一个bug,它认为createTreeWalker方法的NodeFilter属性是回调函数,而不是包含回调函数的对象 在这样的通话中: document.createTreeWalker(document.body,NodeFilter.SHOW_元素,filter,false) filter在Webkit和Gecko中定义为“包含方法acceptNode,”的对象;然而,在IE9中,根本没有提到acceptNode——它需要一个“回调方法”,而不需要对象包装 实际问题
createTreeWalker
方法的NodeFilter
属性是回调函数,而不是包含回调函数的对象
在这样的通话中:
document.createTreeWalker(document.body,NodeFilter.SHOW_元素,filter,false)代码>
filter
在Webkit和Gecko中定义为“包含方法acceptNode
,”的对象;然而,在IE9中,根本没有提到acceptNode——它需要一个“回调方法”,而不需要对象包装
实际问题
那么,在不进行显式浏览器检测的情况下,解决此问题的最佳方法是什么?在某些情况下,我需要filter
作为方法,而在其他情况下,我需要它作为包含方法的对象。有没有一个干净的方法来实现这一点?所有这些浏览器都声称支持DOM 2.0,所以我不能在上面测试
文档-缺陷证明
以下是每种类型的文档的比较:
(“NodeFilter是回调函数…”-错误)
我想出了一个有效的办法。有更好的选择:
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
,坏的浏览器会立即尝试并执行它
备选方案?实际上,IE 9符合规范。请阅读:
对象节点过滤器
这是一个ECMAScript函数引用。此方法返回一个数字。该参数是一个节点对象
因此,一致性浏览器(包括所有主要浏览器的当前版本)都将接受一个函数作为filter
参数。Gecko接受回调函数以及包含acceptNode方法的对象近10年了。看,这无疑是一条路要走。然而,标准声明它是一个包含回调的对象。这个评论对解决我的问题没有任何帮助,因为在今天结束时,IE9不支持这个标准。所以我想。。。你的意思是什么?这是一个评论,不是回答。我只是想指出,如果回调有用,它至少可以在另一个浏览器中工作代码>(抱歉,删除了我的评论,听起来不那么愚蠢,也同样清晰。替换为此)-不幸的是,我无法控制过滤器的实例化。
:)有趣!(看起来)不一致的定义是什么?DOM中还有其他类似的示例,例如addEventListener()
,其侦听器参数被指定为EventListener
,一个包含handleEvent()
方法()而ECMAScript绑定部分指定EventListener
应该是函数引用。我认为它是这样指定的,因为DOM不绑定到单一编程语言,许多语言(如Java)不支持函数作为第一类对象,而是要求所有函数都是方法。