Javascript 解决IE9 Treewalker过滤器缺陷的建议

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——它需要一个“回调方法”,而不需要对象包装 实际问题

背景信息

IE9中目前存在一个bug,它认为
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)不支持函数作为第一类对象,而是要求所有函数都是方法。