🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

3回答

830閲覧

js 特定のclassをもつ要素をすべて指定したい。

Styfish

総合スコア4

JavaScript

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

0グッド

1クリップ

投稿2021/02/02 15:32

編集2021/02/02 15:43

起こっていること

現在は for(i = 0; i < class.length; i++){...} で回しているのですが、
lengthの大きさが150以上にならず、その時点で止まってしまいます。(HTMLcollectionの仕様?)
そこで一括で特定のclass名をもつ要素を指定する方法ってありませんか?
ちなみにやりたいことはそのclass名を持つ要素をinnerHTMLして書き換えることです。

javascript

1 const author_name = document.getElementsByClassName("chat-author__display-name"); 2 3 const author_array = function(){ 4 if(j < author_name.length){ 5 author_name[j].innerHTML = "テスト"; 6 console.log(author_name.length); 7 j++; 8 } 9 } 10 11 setInterval(author_array,10);

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

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

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

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

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

kei344

2021/02/02 15:35

コード全体を提示してください。
meg_

2021/02/02 15:43

> lengthの大きさが150以上にならず、その時点で止まってしまいます。(HTMLcollectionの仕様?) 検証可能なコードを掲載してください。
Styfish

2021/02/02 15:43

追加しました。よろしくお願いします。
Styfish

2021/02/02 15:44

あとすみません! ちょっと書き換えちゃったんですけど、動作自体は全く同じです!
kei344

2021/02/02 15:49

setIntervalはどういう意図で使用されているのでしょうか。「特定のclassをもつ要素をすべて指定したい」との関連性がつかめません。
Styfish

2021/02/02 15:54

author_nameは生放送のコメント欄に表示される名前を取得しているのですけど、常に増加していくのでそれを監視するために使っています。 10にしている理由も流れが速いときに遅れないようにするためです。
kei344

2021/02/02 16:14

いつどこでどのようなデータを処理しているか、が無いと回答できないと思います。より具体的に記述してください。(何らかのページ上でデベロッパーツールで内容確認しているのであれば、単純にそのページ上に生成されるデータが150件までの可能性もあります)
Styfish

2021/02/02 16:43

twitchというサイト内で毎秒流れてくるコメント(をしている人の名前)を取得しinnerHTMLで書き換えたいです。 それと値が150になって増えなくなっても chat-author__display-name をもつクラスが生成されたいるのでデータ数が150になったら生成が止まるということはないと思います。
guest

回答3

0

ベストアンサー

そもそもですが、
author_nameは

document.getElementsByClassName("chat-author__display-name");

を取得していますが、
html内に当該Classは150以上存在しているのでしょうか?
単純にhtml内に当該Classが150存在しているだけで、
毎回150になるだけなのではないでしょうか?

投稿2021/02/02 16:02

WhiteTempest

総合スコア404

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

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

Styfish

2021/02/02 16:08

author_nameは生放送のコメント欄に表示される名前を指定していて、いつもjの値をコンソールで確認すると0から始まって150で止まるので、多分150以上はあると思います。
WhiteTempest

2021/02/02 16:18

>多分150以上はあると思います。 システム開発で多分は厳禁です。 一度、document内のhtmlをログなどに出力し、 chat-author__display-name のClassが150より多いかを確認してみてはいかがでしょうか? html側の仕組み/制限等で最大150になっている可能性も ゼロではないと思います。
Styfish

2021/02/02 16:38

150になって値が増えなくなってもchat-author__display-nameのClassが生成されていたので150以上あると思います。 もしhtml側の仕様が原因だとしたらこちらからはどうしようもないという感じですかね?
WhiteTempest

2021/02/02 16:53 編集

すみません。 仕様の確認をさせてください。 >150になって値が増えなくなっても >chat-author__display-nameのClassが生成されていたので >150以上あると思います setIntervalで定期的に処理をしている間に、 JQueryなどを用いて、リアルタイムにhtmlが変化しているのでしょうか? それであれば、プログラムがおかしいと思います。 恐らく、 const author_name = document.getElementsByClassName("chat-author__display-name"); が1回しかコールされないのが原因ではないでしょうか? author_arrayのfunctionは、 setIntervalにより定期的にコールされますが、 author_nameは、始めに取得したものを 使い回しているように見えます。 functionの中で、最新の author__display-nameのClass の数を取り直すべきではないでしょうか?
Styfish

2021/02/03 00:20

デベロッパーツールで直接確認しました。 新規コメントが増えるごとに chat-author__display-name が増えていったので間違いないと思います。 それとfunctionのなかに const author_name = document.getElementsByClassName("chat-author__display-name"); を入れてみましたが、やはり150で止まってしまいました...
WhiteTempest

2021/02/03 03:10

>新規コメントが増えるごとに chat-author__display-name が増えていったので ここが少し気になります。 twitchを使ったことがないのでなんとも言えないのですが、 新しいコメントが増える度に古いコメントが消えて、 最大で150件までしか表示しない仕様なのではないでしょうか? それであれば、functionの中で取り直してもlengthは常時150件にしかならないと思います。
Styfish

2021/02/03 12:55

その通りでした... 150で止まってから確認すると古いコメントが消えていっていました。 もういちど作り直してみます。 本当にありがとうございました!
WhiteTempest

2021/02/03 13:15

twitch側の仕様のため、どうにもならない可能性はありますが、 取り急ぎ、解決されて良かったです。 今回のご質問は解決したと思いますので、 解決済みへ変更いただけますよう、 よろしくお願いします。
guest

0

問題が再現しませんでした。

サンプル

ですので、HTMLcollectionの仕様ではなく、そのサイト特有の何かがあるのでしょう。


提案ですが、MutationObserver をお試しになってはいかがでしょうか。
MutationObserver - Web API | MDN

投稿2021/02/03 01:32

Lhankor_Mhy

総合スコア36932

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

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

Styfish

2021/02/03 12:53

調べてみましたがすごくいいですね! あとちょっと聞きたんですけどclassでも指定できるんでしょうか? どこのサイトもidで指定していたので...
Lhankor_Mhy

2021/02/04 01:34 編集

要素が追加される大本の親要素を監視して、その追加された子要素に対して何かをする、という書き方がいいと思いますよ。
Lhankor_Mhy

2021/02/04 01:34

誤読したかもしれません。 MutationObserver.observer の引数に複数の要素を持てるか、というご質問でしたら、できません。 ですので、繰り返し処理をする必要があります。
Styfish

2021/02/04 15:14

わかりました! 色々試してみますね! 本当に助かります!
guest

0

setInterval内で監視するならauthor_array関数のなかで
if(j < document.getElementsByClassName("chat-author__display-name").length){
としてカウントしないと意味がないでしょう
また唐突にでてくるjも使い方が変です

投稿2021/02/03 00:15

yambejp

総合スコア116690

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

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

Lhankor_Mhy

2021/02/03 01:29

> HTML DOM 内の HTMLCollection は生きて (live) います。それらは元になった document が変更された時点で自動的に更新されます。 https://developer.mozilla.org/ja/docs/Web/API/HTMLCollection とのことですので、jが初期化されていればコード自体は動作するものだと思います。
yambejp

2021/02/03 02:03

あ、HTMLCollectionでしたね。失礼しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問