2017-08-20 5 views
-2

an HTML form with a simple JavaScript functionは、選択したオプションに基づいて別のリンクにユーザーを送信することを意味します。要素間に改行を追加するHTMLコードが "parentnode"ベースのjavascript関数を破る

<form> 
<select name="deliveryType"> 
    <option value="123">Item 1</option> 
    <option value="456">Item 2</option> 
    <option value="789">Item 3</option> 
</select> 
<p><a href="javascript:void(0);" onClick="javascript:addToCart(this);">Submit</a> 
<script> 
    function addToCart(t) { 
    var dT = t.parentNode.parentNode.childNodes[1].value; 
    alert(dT); 
    // location.href = "http://linkprefix.com/?variable=" + dT; 
}</script> 
</form> 

期待どおりに動作します。変数dTは、選択したオプションの値を返します。しかし

<form><select>dT戻りundefinedの間には改行がない場合。しかし、childNodes[1]childNodes[0]に変更すると、再び動作します。なぜこれが起こるのか分かりません。私は、parentNodechildNodeはHTML要素とその中のテキストに基づいており、要素間の改行ではないと考えました。私が推測しなければならない場合、改行はテキストノードとしてカウントされていますが、それは私には意味がありません。それは何が起こっているのですか?これを行うより良い方法はありますか?

+1

空白に関係なく動作します - 'children'にはテキストノードが含まれていません –

+0

_"改行はテキストノードとしてカウントされていますが、それは意味がありません "_ - [white-space:pre;](https://developer.mozilla.org/en/docs/Web/CSS/white-space) - このスタイルを設定すると、 '
'だけでなく、 '\ n'(改行文字)で囲みます。これは、sencseを行い、' childNodes'配列の中にTextノートとして保持する理由の一つになります。 –

+0

@AlonEitanはい、意味があります。私の混乱は、テキストノードが実際にそれらを有効に含むことができる要素にしか存在しないと主張していたことがほとんどでした。私は誤解されていたことを理解しています。 'childNodes'の代わりに' children'を使うことは、私が探しているものです。 – fredsbend

答えて

-2

コメントに示唆されているように、childNodes[1]children[0]に変更すると、要素間の改行やスペースに関係なく機能が機能します。 See the updated fiddle

childNodesは明らかにすべてのテキストノードをカウントし、childrenはカウントしません。また、改行はテキストノードとしてカウントされますが、これは "テキスト"の厳密な解釈では意味がありますが、すぐにわかりませんでした。

+0

あなたはあなた自身の質問に答えました。 _ああ、悲惨さ... – ADTC

6

HTMLでは、要素内の空白はテキストとみなされ、テキストはノードと見なされます(w3schoolsを参照)。したがって、改行を追加することによって、ノードを追加することになります。そのため、<select>ノードはchildNodes [1]を通じてアクセス可能です。改行がない場合、<select>ノードはchildNodes [0]からアクセスできます。

+4

またはテキストノードにかかわらず 'children [0]'として - もちろん、Internet Explorer 8以下の場合には通常の "Internet exploder behaves different"の警告 –

+1

@JaromandaX Netscape Navigatorも動作することに注意してください異なっている。 –

+0

ええ、誰もそれを使用しない限り、人々はまだIE8を使用します! –

関連する問題