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

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

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

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

Q&A

解決済

2回答

418閲覧

JavaScriptのquerySelectorAllについての質問です

tai57

総合スコア17

JavaScript

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

0グッド

1クリップ

投稿2020/09/14 14:43

HTML

1<ul> 2 <li></li> 3 <li></li> 4 <li></li> 5 <li></li> 6 <li></li> 7</ul>

JavaScript

1const liNode = document.querySelectorAll("li")

JavaScriptで li を複数一気の取得する場合どんなコードがありますか?

※[]でチマチマやるの以外で

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

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

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

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

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

maisumakun

2020/09/14 14:57

liNodeに全部取得できているのですが、そのあと「どう使いたい」のでしょうか?
tai57

2020/09/14 14:59

「EventListener」でclickしたら処理を行う、みたいにしたいです
guest

回答2

0

ベストアンサー

JavaScriptで li を複数一気の取得する場合どんなコードがありますか?

ご質問に示されている document.querySelectorAll("li") が、現行仕様では最もダイレクトな方法と思います。

返却値は NodeList になりますので、近いコードは、親要素の childNodesプロパティを用いた以下のコードになります。
childNodesプロパティは、コメントノードやテキストノード(ホワイトスペース)も含みますので厳密には異なります。

javascript

1const ulChildNodes = document.querySelector("ul").childNodes;

また、返却値が HTMLCollection でも良いなら、

javascript

1var liElements = document.querySelector("ul").children;

MDN)


以下、代替コードで ul を起点とする考え方を示した理由です。

チマチマやる

修正依頼欄の addEventListener より要件を把握しました(できれば、ご質問にも記載されたほうが良いでしょう)。
個々の要素にイベント処理を定義するため、同様な要素を走査するのは正直面倒です。

「EventListener」でclickしたら処理を行う、みたいにしたい(修正依頼コメント欄より

バブリングを活用する

javascript

1let ulListener; // removeEventListener() 用 2document.querySelector("ul").addEventListener("click", ulListener = (evt) => { 3 console.log( evt.curentTarget ); // <ul> 要素 : イベント定義した要素 4 console.log( evt.curentTarget.children ); // <li> 要素の HTMLCollection 5 console.log( evt.target ); //<ul> 以下にある要素 : イベント発火した要素 6 console.log( evt.target.closest("li") ); // <li> 要素 7 8 /* 用例 : li要素の active クラス付け替え:全て除去後、必要な要素にのみ付与する 9 let 10 ul = evt.currentTarget, 11 li = evt.target.closest("li") // クリックしたListItem 12 ; 13 [...ul.children].forEach( li => li.classList.remove("active") ) 14 li.classList.add("active") 15 */ 16 17});

イベントリスナが登録された要素数ul.children.length ではなく、 ul の 1 に抑制できる特徴もあります。
また、ul にイベントを定義しておくと、li 要素を追加したり、除去したりしても、その都度、li 要素にイベントリスナを定義せずに済みます。

イベントリスナに渡される Event(コード内ではevtで伝搬される情報を利用するのがポイントです。

MDN)

投稿2020/09/14 21:20

AkitoshiManabe

総合スコア5434

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

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

0

基本的に、

[]でチマチマやる

しかありませんが、工夫すれば、親要素に対してイベント付与をする、とすれば一応一気に指定できます
ただし、
イベントを実行した時の対象のliを特定するには、
[]でチマチマやるより、遥かに面倒になります。

なので、通常は、配列メソッドを使います。

javascript

1// クリックイベントを付与する例 2 3const liNode = document.querySelectorAll("li"); 4 5liNode.forEach( el => { 6 el.addEventListener('click', () => { 7 // 処理 8 }); 9}); 10 11// NodeListにforEachがない場合は、下記 12[].forEach.call(liNode, function(el){ 13 el.addEventListener('click', () => { 14 // 処理 15 }); 16});

投稿2020/09/14 15:36

編集2020/09/14 15:38
miyabi_takatsuk

総合スコア9528

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問