前提・実現したいこと
複数のbuttonから、1つを選びクリックしたら、そのbutton にある属性値を取得したのですが、
できなく困ってます。
下のコードでいうと、2番buttonを押したら2番のvalueである「2」を取得したいです。
jquery では取得できてます。
プレーンのjavascripの書き方がわからず
質問させていただきました。
どうぞよろしくお願いします。
発生している問題・エラーメッセージ
ボタンをクリックしても、console では何も表示されず。
該当のソースコード
html
1<section id = "numberBox"> 2 <button value="1">1番</button> 3 <button value="2">2番</button> 4 <button value="3">3番</button> 5</section>
JavaScript
1let button = document.querySelector('button'); 2 3button.addEventListener("click", function() { 4 let numberValue = button.getAttribute(value); 5 console.log(numberValue); 6}, false);
試したこと
jquery での動作確認。
jquery
1 $('button').on('click', function(){ 2 console.log($(this).val()); 3 });
補足情報(FW/ツールのバージョンなど)
vscode , google chrome
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
querySelector は "Document の querySelector() メソッドは、指定されたセレクターまたはセレクターのグループに一致する、文書内の最初の Element を返します。" ということですので、今回の目的には使えません。
Document.querySelector()
https://developer.mozilla.org/ja/docs/Web/API/Document/querySelector
3 つある全ての Button にリスナをアタッチしなければなりません。または、親要素の <section id = "numberBox">
にリスナをアタッチして、バブリングで上がってくるイベントを捕捉する方法があります。
イベントが発生すると event オブジェクトが生成され、その参照がリスナの第一引数に渡されます。それから target プロパティでイベントを発生させたオブジェクトを、eventPhase プロパティでフェーズ情報を取得できます。this はリスナをアタッチしたオブジェクトへの参照となりますのでその id プロパティでイベントを捕捉した要素の id 取得できます。
以下のような感じです。
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script type="text/javascript"> window.onload = function () { // Document の querySelector() メソッドは、指定されたセレクターまたはセレクターのグループに一致する、 // 文書内の最初の Element を返します。 //let button = document.querySelector('button'); let button = document.getElementById("numberBox"); button.addEventListener("click", function (event) { var phase = ""; if (event.eventPhase === 1) { phase = "capturing phase"; } else if (event.eventPhase === 2) { phase = "target phase"; } else if (event.eventPhase === 3) { phase = "bubbling phase"; } var str = "fired by: " + event.target.id + ", listened at: " + this.id + ", during " + phase + ", value: " + event.target.value + "<br />"; document.getElementById("result").innerHTML = str; }, false); } </script> </head> <body> <form id="form1" runat="server"> <div> <section id = "numberBox"> <button type="button" id="button1" value="1">1番</button> <button type="button" id="button2" value="2">2番</button> <button type="button" id="Button3" value="3">3番</button> </section> </div> <div id="result"></div> </form> </body> </html>
実行結果は、例えば[3番」をクリックすると以下のようになります:
投稿2019/11/09 03:26
編集2019/11/09 03:32退会済みユーザー
総合スコア0
0
this を利用ください。eventが発生したらthisを参照したり、returnしたりすればよいです。valueを参照する場合はthis.valueなどでよいです。
投稿2019/11/09 02:37
総合スコア14
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/10 02:54
0
getAttribute('value')
としてください。
value
のままだと、「value
変数に入っている値の名前の属性」を参照してしまいます。
なお、<button>
のvalue
はユーザーが書き換えないのであまり問題ないですが、<input>
などのvalue
をgetAttribute
で取得すると、HTMLに書かれた初期値が取れてしまいます(Qiita)。elem.value
のようにプロパティから取得してください。
投稿2019/11/09 02:36
総合スコア145975
0
ベストアンサー
何もsectionへのバブリングまで見る必要はないので、ボタンを監視する元のコードに近い形で書いてみました。皆様の言ってたやつをまとめただけです。
変更点
- querySelector -> querySelectorAll
- ループ追加
- valueプロパティの直参照
HTML
1<section id = "numberBox"> 2 <button type="button" id="button1" value="1">1番</button> 3 <button type="button" id="button2" value="2">2番</button> 4 <button type="button" id="Button3" value="3">3番</button> 5</section> 6<script> 7const buttons = document.querySelectorAll('button'); 8buttons.forEach(function(button) { 9 button.addEventListener("click", function() { 10 console.log(button.value); 11 }, false); 12}); 13</script>
投稿2019/11/11 05:04
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/11 10:24
退会済みユーザー
2019/11/11 21:18
退会済みユーザー
2019/11/11 21:24
退会済みユーザー
2019/11/11 21:39
退会済みユーザー
2019/11/11 21:47
退会済みユーザー
2019/11/11 21:54
退会済みユーザー
2019/11/11 22:05 編集
退会済みユーザー
2019/11/11 22:19
退会済みユーザー
2019/11/11 22:43
退会済みユーザー
2019/11/11 22:56
退会済みユーザー
2019/11/11 23:10
2019/11/11 23:12
退会済みユーザー
2019/11/11 23:12
退会済みユーザー
2019/11/11 23:26
2019/11/11 23:30
退会済みユーザー
2019/11/11 23:39
2019/11/11 23:40
2019/11/11 23:42
2019/11/11 23:43
2019/11/11 23:45
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/09 04:20
退会済みユーザー
2019/11/09 04:34
退会済みユーザー
2019/11/09 04:36