2012-03-01 66 views
2

我试图为NodeList对象定义一个函数。这是代码:添加函数到NodeList对象在Firefox中不起作用

if (!NodeList.prototype.filter){ 
    NodeList.prototype.filter = function(fun /*, thisp*/){ 
    var len = this.length; 
    if (typeof fun != "function") 
     throw new TypeError(); 
    var res = new Array(); 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++){ 
     if (i in this){ 
     var val = this[i]; // in case fun mutates this 
     if (fun.call(thisp, val, i, this)) 
     res.push(val); 
    } 
    } 
    return res; 
}; 
} 

这适用于Chrome,但不适用于Firefox。萤火虫说,“current_node.childNodes.filter是不是一个函数”当我打电话的功能:

nodes = current_node.childNodes.filter(filterByClass); 

奇怪的是,这种代码:

if(typeof NodeList.prototype.filter == 'function') 
    alert(NodeList.prototype.filter); 

显示功能,在这两个浏览器的代码。

它在HTML中使用,并且它被纳入这样的:

<script type="text/javascript" src="textselection.js"></script> 

编辑: Firefox的版本是10.0.2和S.O. Ubuntu的11.04

EDIT2: 我已经忘记了一个重要的因素......它是被用来whithin一个iframe

+0

适合我。 – 2012-03-01 16:45:26

+0

我也是:http://jsfiddle.net/Ewupb/ – gilly3 2012-03-01 16:46:00

回答

0

在一帧中的对象的原型所做的更改不会反映在其他帧。您需要将您的脚本包含在您想要延伸的每个框架中NodeList.prototype

请记住NodeList === window.NodeList,并在一个帧中,window !== top。所以,在一帧中,window.NodeList !== top.NodeList

有趣的是,对于可实例化的对象,如Date,您仍然可以利用原型,只要您首先通过扩展原型引用框架来实例化对象。例如,如果你的父母框架扩展Date.format()方法,你可以做这样的事情,从一个孩子框架:

var nowString = new parent.Date().format("MM/dd/yyyy h:mm:ss.fff TT"); 
0

这是一个很奇怪的怪癖,我碰到今天来。看起来Firefox和Chrome并不喜欢HTMLCollection和NodeList中名为'filter'的函数,尽管这些原型似乎并没有使用这个名字。我将我的自定义函数重命名为'filt',一切都像魅力一样。顺便说一句,Safari浏览器很好'过滤器'。

0

这个工作在火狐,它的简单:

NodeList.prototype.myfilter = Array.prototype.filter;

例子:让所有divs一个id属性:

document.querySelectorAll("div").myfilter(function(el){return el.id || 0;})

然而,您需要定义myfilter在您使用它的每个框架上。