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

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

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

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

Q&A

解決済

2回答

727閲覧

JavaScript Array.from

awea

総合スコア10

JavaScript

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

0グッド

0クリップ

投稿2021/09/14 01:54

下記ソースがあったとします
Array.from(document.querySelectorAll('div'), s => {
console.log(s.id);
});
で毎秒追加されたdivを読み来み、配列化しています
毎秒ごとにdiv0から追加された分まで表示しています
Array.from(document.querySelectorAll('div')を必ず使うことを条件として
追加された部分だけconsole.log(s.id)で表示する方法はないでしょうか?

<script> var j=100; window.onload=function(){ function b(){ for(i=0;i<j;i++){ div = document.createElement('div'); div.id="div"+i; div.style.width = "200px"; div.style.height = "30px"; div.style.background="red"; document.body.appendChild(div); } j=j+20; Array.from(document.querySelectorAll('div'), s => { console.log(s.id); }); setTimeout(b,1000); } b(); } </script>

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

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

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

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

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

yambejp

2021/09/14 02:22

具体的な動作を説明してください 無限にdivを増殖させるとブラクラになりかねません
awea

2021/09/14 02:24

提示したソースだと無限となってしまいますが、3000くらいで止めてもいいです 20づつ追加していき、Array.fromを使い追加された分のdivのidをconsole.logに出したいです
yambejp

2021/09/14 02:28 編集

2巡目以降iが0から初期化されるのでidが競合します Array.fromさえ使えばロジックも大幅に変えていいのですか?
awea

2021/09/14 02:31

div.id="div"+iじゃなくてdiv.id="div"+jでした
guest

回答2

0

ベストアンサー

こうでしょうか。

js

1var x=[],j=100; 2 3// ... 4 5x = Array.from(document.querySelectorAll('div'), s => { 6if (!x.includes(s)) console.log(s.id); 7return s; 8});

投稿2021/09/14 02:24

編集2021/09/14 04:25
Lhankor_Mhy

総合スコア36960

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

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

awea

2021/09/14 02:32

まだ試せる環境にいないので後で確認させてください パット見そのやり方でできるような気がしました 希望がもてました
awea

2021/09/14 02:45 編集

詳しい方のようなのでお聞きしたいんですが divが30000個あったとして、 毎秒Array.from(document.querySelectorAll('div'), s => { を実行することは相当な負荷が生まれますか?
Lhankor_Mhy

2021/09/14 02:51

そっちよりも、毎秒でdivを生成して描画するコストの方が桁違いに高いと思います。
awea

2021/09/14 11:19

無事動きました ありがとうございます
guest

0

追加されたことを感知したいならMutationObserverInitをご利用ください

sample

javascript

1<script> 2const loop=5; 3const max=10; 4let count=0; 5let timerId; 6let j=0; 7window.addEventListener('DOMContentLoaded', ()=>{ 8 timerId=setInterval(()=>{ 9 for(let i=0;i<max;i++){ 10 div = document.createElement('div'); 11 div.id="div"+(i+j); 12 div.style.width = "200px"; 13 div.style.height = "30px"; 14 div.style.background="red"; 15 document.body.appendChild(div); 16 } 17 j+=max; 18 if(++count>=loop) clearInterval(timerId); 19 },1000); 20 const mo = new MutationObserver(function(r){ 21 Array.from(r,x=>console.log([...x.addedNodes].filter(y=>y instanceof HTMLElement)[0].id)); 22 }); 23 const opt = { 24 childList:true, 25 }; 26 mo.observe(document.body, opt); 27}); 28</script>

ちなみにArray.fromにこだわりがなければこうした方がわかりやすいと思います

javascript

1 const mo = new MutationObserver(function(r){ 2 console.log([...r].map(x=>[...x.addedNodes].filter(y=>y instanceof HTMLElement)[0].id)); 3 });

投稿2021/09/14 02:24

編集2021/09/14 02:58
yambejp

総合スコア116724

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

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

awea

2021/09/14 11:19

ありがとうございます 参考にさせていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問