2012-03-01 10 views
2

NodeListオブジェクトの関数を定義しようとしています。これはコードです:NodeListオブジェクトへの関数の追加がFirefoxで機能しない

これはChromeでは動作しますが、Firefoxでは動作しません。 Firebugのは、私は関数を呼び出すとき、「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> 

EDIT: Firefoxのバージョンは10.0.2ですS.O. Ubuntuの11.04

EDIT2: 私は1つの重要な要因を忘れていた...それは1つのフレームでのオブジェクトのプロトタイプを作っ

+0

私のためにうまく動作します。 –

+0

私も:http://jsfiddle.net/Ewupb/ – gilly3

答えて

0

変更は、他のフレームに反映されないのiframe whithin使用されています。 NodeList.prototypeを拡張するすべてのフレームにスクリプトを含める必要があります。

NodeList === window.NodeListとフレーム内には、window !== topがあります。だから、フレームで、window.NodeList !== top.NodeList

興味深いことに、Dateのようなインスタンス化可能なオブジェクトの場合、最初に拡張プロトタイプのフレームを参照してオブジェクトをインスタンス化する場合は、プロトタイプを利用できます。たとえば、あなたの親フレームが.format()方法を有することがDateを延長した場合、あなたは子フレームから、このような何かを行うことができます:

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

これは私が今日出会った非常に奇妙な癖です。 FirefoxとChromeはHTMLCollectionとNodeListの 'filter'という名前の関数を好きではないようですが、これらのプロトタイプはその名前を使用していないようです。私は私のカスタム関数を 'filt'に変更し、すべてが魅力的に機能しました。 Btw、Safariは 'filter'でうまくいった。

0

これはFirefoxのクロームで動作し、それは簡単です:しかし

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

:id属性を持つすべてのdivsを取得するために:

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

例、あなたはを定義する必要がありますを使用している各フレームに表示されます。

関連する問題