2017-11-17 6 views
2

ここではスタックオーバーフローで見つかったイベントリスナーを使用する方法を試しています。イベントハンドラの匿名関数はスタイリングを有効にしません

私自身の問題は、いくつかの要素(id名のテストによって取得)の要素IDを取得し、これらの要素だけのスタイリング/変更を分離しようとしていることです。それらの上に)。

イベントが発生する可能性のある要素がわからないため、最大の問題は、リスナーに渡す要素のIDを収集して渡すことでした。私は、配列とif elseステートメントを使ってこれを克服する方法を見つけたと信じています。次に、新しい問題が見つかりました...

この例では、選択肢AまたはBに絞って問題を絞りました。選択肢Aはスタイリングで要素を変更する必要があり、選択肢Bは変更しません。この例では、IDを収集してリスニング関数に渡すことができましたが、何らかの理由でリスナーの匿名関数がリスニング関数に正常に渡されたにもかかわらず選択肢Aを変更することができません。理由を調べるために援助を求めています。 idをリスナーに明示的にハードコードすると、プログラムは動作します!

誰でも助けることができれば幸いです。

function listen(elem, evnt, func) { 
 
    if (elem.addEventListener) { //W3C DOMS. 
 
    elem.addEventListener(evnt, func, false); 
 
    } else if (elem.attachEvent) { //IE DOM 7 
 
    var r = elem.attachEvent("on" + evnt, func); 
 
    return r; 
 
    } 
 
} 
 

 
function attachListeners() { 
 

 
    var selectors = document.querySelectorAll("div"); 
 

 
    for (var i = 0; i < selectors.length; i++) { 
 
    selectors[i].addEventListener("focus", function(event) { 
 
     var id_of_clicked_element = event.target.id 
 
    }); 
 

 
    // var id_of_clicked_element = document.activeElement.id; 
 
    if (id_of_clicked_element = 'touch_me') { 
 
     var touch_div = id_of_clicked_element; 
 
    } else if (id_of_clicked_element = 'What_about_me') { 
 
     touch_div = id_of_clicked_element; 
 
    } 
 
    } 
 

 

 
    //var touch_div = document.getElementById('touch_me'); 
 
    // If you uncomment the line above and comment out the bit 
 
    // above the program works 
 

 

 
    listen(touch_div, 'touchmove', function(event) { 
 
    touch_div.innerHTML = "Being Touched" + event.targetTouches.length; 
 
    touch_div.style.background = 'green'; 
 
    }, false); 
 

 
    listen(touch_div, 'touchstart', function(event) { 
 
    event.preventDefault(); 
 
    touch_div.innerHTML = "touchstart"; 
 
    touch_div.style.background = 'green'; 
 
    }, false); 
 

 
    listen(touch_div, 'touchend', function(event) { 
 
    touch_div.innerHTML = "Thanks"; 
 
    touch_div.style.background = '#CCFF66'; 
 
    }, false); 
 

 
    listen(touch_div, 'click', function(event) { 
 
    touch_div.innerHTML = "Hey - touch not Click!"; 
 
    touch_div.style.background = 'red'; 
 
    }, false); 
 

 
    listen(touch_div, 'onmouseup', function(event) { 
 
    touch_div.innerHTML = "Hey - that was a Click!"; 
 
    touch_div.style.background = ''; 
 
    }, false); 
 
} 
 

 
window.onload = attachListeners;
<div id="touch_me"> Touch Me!</div> 
 
<div id="What_about_me"> What About Me!</div>

+0

なぜオブジェクトの代わりにIDを渡すのですか? – mplungjan

+0

本当にありがとうございました。私はそれが本当に意味をなさせるためのコードを見なければならなかったので、私はまた下のマツにも感謝しています。 – NewWeb

答えて

0

問題は、あなただけの要素ではない全体要素のIDを取得しているあなたのif文です。

if (id_of_clicked_element === 'touch_me') { 
     var touch_div = document.getElementById(id_of_clicked_element); 
    } else if (id_of_clicked_element === 'What_about_me') { 
     touch_div = document.getElementById(id_of_clicked_element); 
    } 
+0

条件は '=='または '==='ではない '= ' – zer00ne

+0

ありがとう、私はそれを逃した。 – Matus

+0

理論とコードマタスのおかげで、まさに私が必要としていたことです。一度誰かがあなたを示すと、多くのことのようにそれはちょうど完全な意味があります。実際には、複数の等号を使用することを提案してもうまく動作しませんでした。単なる等号を使用していました。それ以外の場合は、参照エラーが発生しました。それは今でも機能し、それが主なものです。もう一度あなたに感謝します - これはしばらく私を保持しています - 私はオブジェクトとjavascriptの性質についてもっと知る必要があります。将来は。 – NewWeb

関連する問題