2016-07-11 4 views
4

に要素の値を変更することができません:ここでは、コードだ配列

HTML:

<div id="ID1"> 
    <a href="www.google.com">click</a> 
</div> 
<a href="www.yahoo.com">click</a> 

JS:

var element = document.querySelector("a[href^='www.google.com']"); 
console.log(element); // this returns the <a> object 
element = element.parentNode; 
console.log(element); // this returns the <div> object 

は完璧に働きました。しかし、ここでの第二部です:

var elements = document.querySelectorAll("a[href^='www.google.com']"); 
console.log(elements[0]); //this returns <a> object 
elements[0] = elements[0].parentNode; 
console.log(elements[0]); //this returns <a> instead of <div> 

だから、私はelements[0]で値を変更することができませんでした。なぜこれが起こっているのですか? tempのような変数を使用せずにどのように変更できますか?temp = elements[0]; temp = temp.parentNode; console.log(temp);

+0

jqueryセレクタにclassとidを使用できませんか? – Gaetan

+0

@Stagesそれでもうまくいくが、なぜこれがVanillaJSで失敗するのか不思議である。 –

+0

@ gurvinder372いいえ、もう一度動作しません。コードの別の部分を別々に試してください。 –

答えて

2

querySelectorAllNodeListArrayではありません。あなたはそれを変異させる必要がある場合は、さらに配列

var elements = [].slice.call(document.querySelectorAll("a[href^='www.google.com']")) 

elements[0] = elements[0].parentNode; 
console.log(elements[0]); //div 

に変換「面白い」の部分は次のとおりです。読み取り専用の行動はcrossbrowserではありません。

Object.getOwnPropertyDescriptor(document.querySelectorAll('a'), '0') 

クローム UPD ChromeはNodeListのプロパティについて嘘をついています。これは読み込み専用であり、列挙可能です。

// {value: a, writable: true, enumerable: false, configurable: true} 

FF

// { value: <a>, writable: false, enumerable: true, configurable: true } 

IE - 気に? IEは真実を伝えています。プロパティは書き込み可能です。

// {configurable: true, enumerable: true, value: HTMLAnchorElement {...}, writable: true} 
+0

この回答は役に立ちました、ありがたいです。しかし、[NodeList](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll)がChrome用に書き込み可能であるとお考えですか? ChromeとFirefoxで 'document.querySelectorAll' [NodeList](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll)を編集できません。しかし、FirefoxとChromeの両方で '[] .slice'を使って配列に変換した後で編集できます。 –

+1

うん、それはChromeが絶望的に​​NodeListプロパティについて嘘をついているようです。読まれるだけでなく、それもまた列挙可能でなければなりません。 –

+0

そして、もう一度質問に戻ると、最初の部分コードはノードを返します。私はそれを配列に変換しなかった。どのように書き込み可能ですか?第2部のコードのNodeListは書き込み不可能ですか? –

2

docs他のケースで

ごとなどのように見える、のNodeListは、DOM内の任意 以降の変更は コレクションの内容には影響を与えないという意味、静的なコレクションです。 document.querySelectorAllは静的なNodeListを返します。あなたは今

elements = [].slice.call(elements); 
elements[0] = elements[0].parentNode; 
console.log(elements[0]); //this returns <a> instead of <div> 

を行う場合を除き

不思議なことに、任意のインデックスに新しい値を代入すると、値を変更していない、それはあなたが探している値を返します。

+0

この回答は役に立ちました、ありがたいです。 :) –

関連する問題