9

Array.prototype.sliceIE8がメソッドにアクセスできることは私の理解です。しかし、それを呼び出してNodeList配列に変換しようとすると、エラーが発生しますArray.prototype.slice: 'this' is not a JavaScript objectここでそれをチェックするか、ここで私のコードを見ることができます:

HTML

<div id="test">Test</div>

JavaScript

var divs = document.getElementsByTagName('div');
divs = Array.prototype.slice.call(divs);
console.log(divs);

何が起きてる?

4

3 に答える 3

9

更新:ANodeListは、いくつかの方法で配列として扱うことができます。たとえば、Aをループする前に、実際に特別なことをする必要はありません。

var aDivs = [];
for (var = i = 0; i < divs.length; i++) {
    aDivs.push(divs[i]);
}

これにより、実行時に一致したすべてのノードを含む配列が作成されますdocument.getElementsByTagName()

一部のブラウザで動作するが他のブラウザでは動作しない理由の完全な説明については、この質問を参照してください。ただし、この文は仕様から要約されています。sliceNodeList

スライス関数をホストオブジェクトに正常に適用できるかどうかは、実装によって異なります。

于 2012-11-10T00:00:00.157 に答える
2

エラー メッセージは正確です。nodelist は JavaScript オブジェクトではなく、通常の JavaScript オブジェクトのように渡すことができない「ホスト オブジェクト」です。IE8 の JavaScript コンソールで次のコードを実行します。

document.querySelectorAll("div") instanceof Object

返しますfalse

于 2012-11-10T00:17:23.313 に答える
0

NodeList セットが変更されても、同じ内容を維持したいとします。

その場合、悪いニュース: IE8 が壊れています。また、NodeList でスライスを使用しても処理できません。

そのため、フォールバックを使用して、スライスが失敗したときに (try/catch を使用して) 自分で「スライス」を作成する必要があります。

DOM が変更されることを予期せず、配列のようなオブジェクトで十分な場合は、他の配列と同様に NodeList を使用できます (ただし、そうではなく、場合によっては変更される可能性があります)。 DOM の変更)。

[編集]実際には壊れたデザインではなく、標準で許可されています (Kelvin Mackay のコメントのリンクで述べられているように)

于 2012-11-10T00:10:15.963 に答える