2016-08-31 9 views
1

作成した配列のすべての項目に適用するイベントリスナーを取得できません。私はここで他の多くの関連記事を見てきましたが、私の正確な状況をカバーするものはありません。Javascript - 配列のすべての項目にイベントリスナーを追加する

私はコンソールにログアウトしていて、各繰り返しのポップアップを見ることができるので、forループが動作していることは知っています。コンソール上では、イベントリスナーが各反復に適用されていることがわかりますが、実際にページ上の要素にマウスを重ねると起動しません。

私が紛失している可能性のある手がかりは?完全なコードは以下の通りです。

<head> 
    <title>Test Page</title> 
</head> 

<style> 
    .red-text { 
     color: red; 
     font-size: 75px; 
     transition: 4s; 
     font-family: Times; 
    } 

    .new-header { 
     color: blue; 
     font-size: 100px; 
     transition: 3s; 
     font-style: bold; 
    } 
</style> 

<body> 
    <h1>Welcome</h1> 
    <p>This is the first paragraph</p> 
    <p>Here is the second paragraph</p> 
    <p>And this is the final paragraph</p> 

    <script> 


     var h = document.querySelector("h1"); 
     var p = document.querySelectorAll("p"); 

     var changeHeader = function() { 
      h.className = h.className + " new-header"; 
     } 

     var addRedClass = function() { 
      p.className = p.className + " red-text"; 
     } 

     h.addEventListener("mouseover", changeHeader); 

     for(var i = 0; i < p.length; i += 1) { 
      console.log(p[i]); 
      p[i].addEventListener("mouseover", addRedClass); 
     } 

    </script> 

</body> 

再び、アレイ内の各要素は、標的とされている、私は、リスナーが適用されていることを確認することができ、それは、マウスの上に発射しないであろう。

アドバイスを事前にいただきありがとうございます。

+0

'p'は、おそらくマウスオーバーされることを可能にするDOMのCSSを介した次元を持たないかもしれません。 – staypuftman

答えて

5

addRedClass機能には適切なスコープが必要です。 this.classNameを使用することにより

var addRedClass = function() { 
    this.className = this.className + " red-text"; 
}; 

、あなたはマウスオーバーして<p>タグを参照しています。変数hはヘッダのみのノードが含まれているので、あなたがchangeHeader機能でthisを使用する必要は必要ありません

理由があります。しかし、変数pにはnodeListが含まれていますが、これはノードへの参照ではありません。したがって、addEventListenerが起動すると、マウスが移動した<p>タグがスコープとしてaddRedClassに渡されます。そのため、thisがclassNameを変更することができます。

+0

ブリリアント!これで完全に修正されました。洞察に感謝します! – greatdain

3
p[i].addEventListener("mouseover", addRedClass); 

いかなる Pの要素のがマウスオーバーされるたびので、addRedClass関数が呼び出されます。これは問題ありません。

今度は、その機能を見てみましょう:

p.className = p.className + " red-text"; 

あなたはpclassNameを変更します。

要素オブジェクトの非有効NodeListはどれですか。

(作成するまで)classNameプロパティはありません。

おそらくthis.classNameに、またはpにループして、p[i].classNameを繰り返し使用します。

関連する問題