2011-08-15 24 views
0

javascriptで「playerhash」という名前のxmlファイルのすべての要素をループしています。ループ内のJavaScript配列

for(var i = 0; i < 4; i++) { 
    alert(i); 
    if(getCookie('riskinfo') == xmldoc.getElementsByTagName("playerhash"[i].childNodes[0].nodeValue) { 
     player = xmldoc.getElementsByTagName("playerhash")[i].getAttribute('color'); 
     break; 
    } 
} 

私はそれは私がI = 0と私は少なくとも4つのplayerhash要素があることを知っているときにエラーが発生していることを考え出した警告()関数でLine 3: Uncaught TypeError: Cannot read property 'nodeValue' of undefinedを与えるJSを実行してみてください。
どのようにエラーなしですべての要素をループすることができますか?

+1

これは、playerhashの1つ以上に子がないことを意味します。もう少しチェックを追加するか、すべて子供がいることを確認してください。 – Sheepy

答えて

0

decezeによると、コードにエラーがあります。デバッグが容易になるように、コードをもっと小さなステップで記述する必要があります。また、先に進む前に各ステップをチェックして、予期せず失敗した場合でもユーザーにエラーを投げないようにしてください。デバッグを難しくするような条件の表現は、テスト条件のためだけに使用してください。

// Should have already checked that xmldoc is a valid document 

var riskinfo = getCookie('riskinfo'); 
var playerhash = xmldoc.getElementsByTagName("playerhash"); 
var max = 4; // or playerhash.length 
var node, player; 

for(var i = 0; i < max; i++) { 
    node = playerhash[i]; 

    if (node && node.nodeValue == riskinfo) { 
    player = node.getAttribute('color'); 
    i = max; // break out of for loop 
    } 
} 
+0

コーディングのヒントありがとうございます。私はかなりjavascriptとxmlに新しいので、どんな助けも大歓迎です。 – quadthagoras

+0

可能であれば、声明を簡潔かつ簡潔に保つことは、常に良い考えです。それはより多くのコードですが、速度に影響を与えません(より速いことが多い)、理解しやすくなる程、デバッグやメンテナンスが容易になります。多くの場合、経験の浅いプログラマーはメンテナンスを受けるため、耐え忍ぶようにしてください。 :-) – RobG

0
.getElementsByTagName("playerhash"[i].childNodes[0].nodeValue) 

ここには)がありません。すべてのループでxmldoc.getElementsByTagName("playerhash")はかなり高価であり、あなたが一度ループの前にこれを実行し、結果を変数に保存する必要があります繰り返し、もちろん

if (getCookie('riskinfo') == xmldoc.getElementsByTagName("playerhash")[i].childNodes[0].nodeValue) { 

:この線に沿って何かする必要があります。

i要素が実際に存在するかどうか、そしてその子ノードにアクセスしようとする前に実際に子ノードがあるかどうかもチェックしてください。

関連する問題