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

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

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

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

Q&A

解決済

1回答

1023閲覧

動的に生成した要素にaddEventListenerが効かない

2001Y

総合スコア83

JavaScript

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

0グッド

0クリップ

投稿2018/07/21 16:24

Ajaxで取得したjsonを表示させているのですが、動的に作成した要素にaddEventListenerが効きません。

js

1 xhr.onload = function(){ 2 let json = JSON.parse(xhr.response).items, 3 length = json.length, 4 fragment = document.createDocumentFragment(), 5 SearchResults = document.getElementById('SearchResults'); 6 for (let i = 0; i < length|0; i=(i+1)|0) { 7 let a = document.createElement("a"), 8 div = document.createElement("div"), 9 strong = document.createElement("strong"), 10 p = document.createElement("p"); 11  ・・・・・ 12 a.addEventListener("click", ggg(json[0].link)); 13 } 14 SearchResults.appendChild(fragment); 15 } 16function ggg(e) { 17 console.log(e); 18 }

途中しか書いていませんが、ここでは、作成した要素をクリックした際にコンソールに要素毎固有の数値を表示させようとしています。

HTML内にonclockとして記せば動作しますが、ホバー時(mouseover)にも動作させたくなったため、jsに書く必要があります。

js

1a.setAttribute("onclick", 'SiteResult("' + json[i].link + '");');

最初は生成したものをgetElementsByTagNameで取得しようとしていたのですが、生成したものにはaddEventListenerが効かないとわかり調べてみたところ、forループ内に書くようだったので書いてみました。
.
一応、最初に作ったものも置いておきます。

js

1for (let i = 0; i < length|0; i=(i+1)|0) { 2 let a = document.createElement("a"), 3  ・・・・・ 4 } 5let targets = document.getElementsByTagName('a'); 6for(let i = 0; i < targets.length|0; i=(i+1)|0){ 7 targets.addEventListener('mouseover', () => { 8 alert(`をクリックしました`); 9 10}, false); 11 12}

▲ 追記

このまま書き続けても要素毎固有の数値を取得できないと思うので、これではダメだと思います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

ご質問に挙げられている1つ目のコードで、関数 gggは、

javascript

1function ggg(e) { 2 console.log(e); 3}

となっており、 return がないので、ggg(e)は何も返しません。つまり、

javascript

1ggg(json[0].link)

は、undefined となるので、

javascript

1a.addEventListener("click", ggg(json[0].link));

は、clickハンドラとして、undefinedを設定することになってしまいます。
ですので、gggを以下のようにしてみるといかがでしょうか?

javascript

1function ggg(e) { 2 return () => { 3 console.log(e); 4 }; 5}

参考になれば幸いです。

投稿2018/07/21 16:54

編集2018/07/21 16:55
jun68ykt

総合スコア9058

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

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

2001Y

2018/07/23 16:02

僕には理解できませんでしたが、無事動作するようになりましたありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問