質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

3983閲覧

addeventListener 要素数に応じてイベントが重複する

rei78087487

総合スコア12

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/03/25 06:51

addEventlistenerについて質問があります。

問題点:

addEventListenerのイベント処理が重複される。

経緯:(下記ソースコード参照)

・要素を2つ以上作成する(ダブルクリックで作成)
・どの要素でもいいので要素の上で右クリックメニュー表示
・メニューの中の(要素を選択)をクリック
・全要素の左側にチェックボックスが表示される。
・要素の中からチェックボックスを2つONにする
・文字の大きさメニューからUPをクリック
・ボックスの数値が+2ずつ増える

状況:

・要素が一つのみの場合はイベントは正しく実行される。
・似たようなaddEventListenerイベントは複数作っていない。
・チェックボックスのONの数に応じてイベント処理が重複される。

イベント処理が重複される部分

sizeNum.value++
インクリメントは+1ずつ加算されるが、要素が一つ増えると+2,+3,+4,,,,となる。

解決したいこと:

複数の要素にイベント発生が同時に可能な状態で、かつイベント処理が重複しないようにしたい。

for (const test of qa) { test.onclick = ()=>{ let t = event.target; if(t.checked == true) { let sizeUp = document.getElementById('sizeup'); let sizeNum = document.getElementById('sizenum'); sizeUp.addEventListener('click', () => { sizeNum.value++; t.nextElementSibling.style.fontSize = sizeNum.value + 'px'; }); } } }

ソースコード:
https://codepen.io/mio-rei/pen/JjEYvmL

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

チェックボックスをクリックするたびにイベントを追加するという仕様が不可解ですが、
とりあえず、
.addEventListener('click', () => { }) の代わりに .onclick = () => { }を使えば、上書きされるので重複することはないです。

Codepen のコードを見ると .onclick を使っている部分もありますね。

addEventListener は設定してあるイベントを上書きせずに追加する、
onclick は設定してあるイベントを上書きする、
という違いがあるということを理解して使い分けましょう。

投稿2021/03/25 18:09

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

addEventListenerは同じ要素に複数付けることが可能なので、onclickされるたびに関数が追加されます。
イベントの中でイベントを追加するのは面倒が起こりやすいので避けたほうが良いです。(前に登録した関数を削除することは可能ですが、煩雑になるのでお勧めしません)

投稿2021/03/25 08:41

kei344

総合スコア69400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問