背景:
下記ソースコードはテキストエリアを作成した後、要素どれか一つをクリックすると色が変わるというものです。
例えば要素が複数あった場合、どれか一つをクリックすると以前にクリックした要素の色は元の色に戻ります。
jqueryでのソースコードになりますが、参考のURLがこちらです。
https://liveweave.com/
これを参考にJavascriptで作成をしてみました。
成功はしたのですが、addEventListenerの要素を変えただけでなぜ挙動が変わるのか教えて頂きたく質問しました。
全体コード:
[https://codepen.io/mio-rei/pen/GRrdKzQ]
例1:
こちらは上記の内容をJavascriptにて記述したものです。
要素をダブルクリックで複数作成後、そのうちの要素一つをクリックすると要素の色が変わります。
その状態でまた別の要素をを選択すると選択した要素は変わり、以前に選択した要素は元の色に戻ります。
JavaScript
1const text = document.querySelectorAll('textarea'); 2 3 for (const tes of text) { 4 document.addEventListener('click', () => { 5 let t = event.target; 6 if(t.nodeName != 'TEXTAREA') return; 7 tes.classList.remove('active'); 8 t.classList.add('active'); 9 }); 10 }
例2:
JavaScript
1こちらはaddEventListenerの要素をdocumentからtesに変更したものです。 2挙動は例1:と違い、要素を作成後、要素をクリックすると色は変わりますが、 3他の要素を選択してもそのままの色の状態です。 4 5 const text = document.querySelectorAll('textarea'); 6 7 for (const tes of text) { 8 tes.addEventListener('click', () => { 9 let t = event.target; 10 tes.classList.remove('active'); 11 t.classList.add('active'); 12 }); 13 }
上記ソースコードは何故同じ動きにならないのか?
addEventListenerの対象要素が、documentかtes(textera)によって変わる動作の違いについて
例1はaddEventListenerの要素をdocumentにしていますが、クリックする対象がそれだと本来の目的であるテキストエリアの色を変更、戻すといった事ができません。なので、if(t.nodeName != 'TEXTAREA') return;を記述して、対象の要素をテキストエリアにしています。
例2はaddEventListenerの要素をtesとして、こちらは対象要素の目的であるテキストエリアにしています。対象要素をクリックしているにも関わらずなぜこちらは思うような動作にならないのか?
こちらの方がシンプルにクリック対象の要素であり、記述も簡易的でわかりやすいと思うのに。
ご教示お願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/14 01:26
2021/04/14 01:28
2021/04/14 01:33