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

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

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

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

JavaScript

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

Q&A

解決済

3回答

16535閲覧

JavaScriptのイベント処理について

djkddsjk

総合スコア14

イベントハンドラ

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

JavaScript

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

1グッド

1クリップ

投稿2017/06/29 14:40

編集2017/06/29 15:17

###前提・実現したいこと
現在JavaScriptのイベントバブリング、イベントキャプチャリングの勉強をしております。イベントの処理される順番を見たかったのですが、
なぜ Uncaught TypeError: sections_a.addEventListener is not a function のエラーが出るのかわかりません。ご教示いただけますと幸いです。
何卒よろしくお願い申し上げます。

###発生している問題・エラーメッセージ
処理が該当の箇所(20行目)で滞ってしまっております。なぜ Uncaught TypeError: sections_a.addEventListener is not a function のエラーが出るのかわかりません。

エラーメッセージ
Uncaught TypeError: sections_a.addEventListener is not a function

###該当のソースコード

<!doctype html> <html> <head> <title>test</title> </head> <body> <section class="sections_a, sections_b"> <section onclick="console.log('section1')"> <div id="aaa" onclick="console.log('div2')"> <p onclick="console.log('p');">test</p> </div> </section> </section> <script type="text/javascript"> var div = document.getElementById('aaa'); var sections_a = document.getElementsByClassName('sections_a'); var sections_b = document.getElementsByClassName('sections_b'); sections_a.addEventListener('click', function sec_2(){ console.log('section_a'); }, true); div.addEventListener('click',function(){ console.log('div'); },true); sections_b.addEventListener('click', function(){ console.log('sections_b'); }, true); </script> </body> </html>
DrqYuto👍を押しています

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

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

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

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

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

kei344

2017/06/29 15:08

質問文のコードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
djkddsjk

2017/06/29 15:22

```で囲ませていただきました、読み辛い書き方で大変申し訳ございません。
guest

回答3

0

端的に述べれば、addEventListener は単一ノードのみに適用可能な関数であり、複数ノードである HTMLCollection には適用できないからです。
sections_a の中の要素ノードを参照して下さい。

Re: djkddsjk さん

投稿2017/06/29 14:46

think49

総合スコア18164

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

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

djkddsjk

2017/07/01 07:21

DOMの理解ができていなかったです、すごく時間がかかってしまいましたが、解決しました。ありがとうございます。もっとDOMの勉強をします。
guest

0

ベストアンサー

Element.getElementsByClassName() の返り値は HTMLCollection という配列のようで配列でないもので返ってきます。

下記の記事の例文のように for で処理するのが、とりあえずわかりやすいと思います。

【document.getElementsByClassName() - classで要素を取得する】
https://syncer.jp/javascript-reference/document-getelementsbyclassname

JavaScript

1// [class="aaa"]を取得 2var elements = document.getElementsByClassName( "aaa" ) ; 3 4// 取得した要素の文字色を赤にする (最初の要素から順に処理) 5for( var i=0,l=elements.length; l>i; i++ ) { 6 var element = elements[i] ; 7 element.style.color = "red" ; 8}

投稿2017/06/29 15:26

kei344

総合スコア69407

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

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

0

まず

<section class="sections_a, sections_b">

クラスの区切りは空白文字なので、sections_aの後ろのカンマが悪さをします。
その上で、こんな感じでHTMLCOllectionで掴んで、prototypeで調整

javascript

1window.onload=function(){ 2 a.addEventListener('click',function(){console.log('sec_a');},true); 3 b.addEventListener('click',function(){console.log('sec_b');},true); 4} 5 6var a= document.getElementsByClassName('sections_a'); 7var b= document.getElementsByClassName('sections_b'); 8HTMLCollection.prototype.addEventListener=function(x,y,z){ 9 if(typeof z=="undefined") z=false; 10 Array.prototype.map.call(this,function(i){ 11 i.addEventListener(x,y,z); 12 }); 13}

HTML

1<div class="sections_a sections_b">test</div> 2<div class="sections_a">test2</div> 3<div class="sections_b">test3</div> 4

(一部調整しました)

投稿2017/06/30 00:56

編集2017/06/30 01:13
yambejp

総合スコア114839

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問