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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

6727閲覧

addEventListenerを使ってイベントを一度だけ設定したい

HajimeHamada

総合スコア20

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/11/02 23:55

ある要素にaddEventListenerが複数回実行された場合にも、イベントの設定が一度だけになるようにしたいと思っています。確認のために、簡単なリストを示します。

JavaScript

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>Eventのテスト</title> 6</head> 7<body> 8 <button id="event-tuika">イベント追加</button> 9 <button id="event-do">イベント発動</button> 10<script> 11 'use strict'; 12 13 var tuika = function(){ 14 var doButton = document.getElementById('event-do'); 15 16 var event = function(){ 17 console.log('Done ... ' + i); 18 i ++; 19 }; 20 doButton.addEventListener("click", event); 21 } 22 23 var i = 0; 24 var tuikaButton = document.getElementById('event-tuika'); 25 tuikaButton.addEventListener("click", tuika); 26</script> 27</body> 28</html>

最初は「イベント発動」ボタンを押してもコンソールには何も表示されませんが、「イベント追加」ボタンを押すと、イベントが追加されてコンソールにメッセージが出力されます。この「イベント追加」ボタンを複数回押した場合イベントが複数回追加されて、一度「イベント発動」ボタンを押したときのメッセージが2行、3行... と増えていきます。このときにメッセージが増えず、メッセージが1行だけ出力されるようにしたい、というのが所望の動作になります。

この例は単純化しているため、以下のようにflagをつかって1度だけ実行するようにしても済んでしまうのですが、それ以外の方法を探しています。

JavaScript

1<script> 2 'use strict'; 3 var flag = true; 4 5 var tuika = function(){ 6 var doButton = document.getElementById('event-do'); 7 8 var event = function(){ 9 console.log('Done ... ' + i); 10 i ++; 11 }; 12 if(flag){ 13 doButton.addEventListener("click", event); 14 flag = false; 15 } 16 } 17 18 var i = 0; 19 var tuikaButton = document.getElementById('event-tuika'); 20 tuikaButton.addEventListener("click", tuika); 21</script>

removeEventListenerを適切に使えばうまくいくような気がするのですが...

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

addの前にremoveをすればよいのではないでしょうか?

javascript

1doButton.removeEventListener("click", event); 2doButton.addEventListener("click", event);

または、tuikaButtonクリック時に自身をremoveするとか

javascript

1var tuika = function(){ 2 tuikaButton.removeEventListener("click", tuika); 3  : 4 }

投稿2018/11/03 00:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

こんにちは。

removeEventListenerを適切に使えばうまくいくような気がするのですが...

仰るように、removeEventListener を使うことでも出来そうですが、以下の投稿

に対する以下の回答

が参考になるかもしれません。すなわち、この回答に挙げられている以下のコード

javascript

1var el = document.getElementById('el-id'), 2 elClone = el.cloneNode(true); 3 4el.parentNode.replaceChild(elClone, el);

にならって、クローンされたボタンで置き換えるというのはいかがでしょう? 以下、上記のコードをもとに、HajimeHamadaさんのコードにクローンして置き換えるロジックを追加したものです。

javascript

1var tuika = function(){ 2 var doButtonOrig = document.getElementById('event-do'); 3 var doButton = doButtonOrig.cloneNode(true); 4 5 var event = function(){ 6 console.log('Done ... ' + i); 7 i ++; 8 }; 9 10 doButton.addEventListener("click", event); 11 doButtonOrig.parentNode.replaceChild(doButton, doButtonOrig); 12}; 13 14var i = 0; 15var tuikaButton = document.getElementById('event-tuika'); 16tuikaButton.addEventListener("click", tuika);

以上参考になれば幸いです。

投稿2018/11/03 01:50

編集2018/11/03 02:18
jun68ykt

総合スコア9058

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

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

0

ボタン要素の onclick 属性が null か否かで判断してはいかがでしょう?

投稿2018/11/03 00:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問