2012-02-14 4 views
0

注:IE8とIE9では異なります。 IE 9 FOOでこの1行のコードは何をしますか? var foo = documentGetElementById(form_name).elements;

var foo = documentGetElementById(form_name).elements; 

一つは、このようにそれらを反復することができるように、ユーザーが投稿した値を含む要素の配列を取得します。

for (index in foo) 
{ 
    if(foo[index].value === 'element_value') 
    { 
     return 1; 
    } 
} 

私はfooに何があるのか​​わかりません。しかし、私はもはや要素をループしてフォームからユーザー入力を取り出すことはできません。 IE 8デバッガは、foo[element]がNULLかオブジェクトではないことを報告します。

どちらの場合も、私は実際に何をするのか分からない。

+1

あなたの 'index in foo'ループは、' foo [element] 'ではなく、' foo [index] 'を使用する必要があります。 –

答えて

2

このようなループにはfor ... inを使用しないでください。代わりに:

for (var index = 0; index < foo.length; ++index) { 
     if (foo[index].value === 'whatever') { return 1; } 
    } 

for ... inループの形式は、オブジェクトのプロパティを通過するためのものです。あなたがここにいるのは、実際にはオブジェクトですが、もっと重要なのは配列のように機能するものです。 (実際には のNodeList HTMLCollectionですが、コンテンツトラバーサルの場合は配列のように扱うことができます)。数値インデックスを反復する利点は、概念的な内容の一部ではないオブジェクトのプロパティをトリプルすることを避けることです。

他の問題は、そのインデックス式で「要素」を使用していました。私は "要素"が何であるかはわかりませんが、反復子変数を使用したいと思います。

編集 —私は「要素」のものが(のNodeList)とは何か、それは実際に(HTMLCollection)であることは、コレクションAPIは数値インデックスファサードと名インデックスの両方を持っていることであると思った何の違いファサード。つまり、フォームの外部にある名前を何らかの形で知っていれば、名前によるアクセス方法が理にかなっています。しかし、あなたがやっていることでは、数値イテレータを使用しています。そうでなければ、私には奇妙なことが起こるからです。私はあまりにも過食症であるかもしれないので、おそらくより多くの洞察力を持つ誰かがコメントしたり答えたりします。ブラウザがDOM仕様のIDL定義をJavaScriptで動作させる方法は、私の意見では、かすかな部分です。

+0

実際には、要素の名前を付けることができるので、ノードリストではなくコレクションです。 – Neil

+0

とにかく.. for..inはオブジェクトのプロパティを繰り返します...またはオブジェクトのプロパティの "コレクション"を想定しています...そして、長さのプロパティでノードのリストを繰り返します。 –

+0

本当に@Neil? ... \ * * spec * * *を確認します。確かにそうです。まあ、それにもかかわらず、数値インデックスを使って繰り返します。 – Pointy

関連する問題