2012-03-01 9 views
1

このコードの問題点を教えてもらえますか? Chromeはまだマウスオーバーでコードを実行しますが、ChromeとFirefoxではscrns[i]が未定義です。javascriptで未定義の変数が配列

function nextPrev() { 
    if (!document.getElementsByClassName) return false; 
    var scrns = document.getElementsByClassName('scrn'); 
    for (var i=0; i<=scrns.length; i++) { 
    // console.log(i); 
    scrns[i].onmouseover = function() { 
     // console.log('foo'); 
    } 
    } 
} 
window.onload = nextPrev(); 

私は、forループ機能していることをテストし、問題は、私は方法を知っているあらゆる方法でどこから来ている突き止めるしようとしました。私はいつか前の一冊から取った例を見ていて、なぜscrns[i]が定義されないのか理解できません。

大変助かりました!

+1

'window.onload = nextPrev();'は(おそらく) 'window.onload = nextPrev; 'にする必要があります。 –

+2

また、jQueryを調べることもできます。あなたのコードはjQueryで2行で記述することができます。 –

答えて

5

をループするときは、<=を使用しています。しかし、配列は0ではなく1から始まるインデックスが付けられていることに注意してください。したがって、10要素の配列の長さは10ですが、要素0-9です。次のように変更します。

for (var i=0; i<=scrns.length; i++) { 

へ:

for (var i=0; i < scrns.length; i++) { 
+1

私はそれがどのようにそこにあり、それを見たこともない、長い一日を知りません!ありがとうございます:) – frank

+0

@フランク私はその日もあった。 :) –

5

あなたはループしすぎています。 iがscrns.lengthの場合は、配列の終わりを超えています。あなたの停止条件に=を削除します。

for (var i=0; i < scrns.length; i++) { 
+0

それはむしろ「続ける」条件です... – mindandmedia

0

あなたはoff-by-oneエラーを持っています。 <=から<に変更すると問題が解決するはずです。ループインバリアントを将来使用して、あなたが通過しないことを確認することができます。一般に

http://en.wikipedia.org/wiki/Loop_invariant

しかし配列をループするとき、限りカウンタが配列の長さ未満であるようにループを0に反復カウンタで始まり。