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

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

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

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

Q&A

解決済

2回答

1932閲覧

for文内のsetTimeoutについて

blue_blacks

総合スコア8

JavaScript

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

0グッド

0クリップ

投稿2018/10/05 05:44

編集2018/10/05 05:45

いつもお世話になります。
下記のコードはブックマークレットとして実行しているものですが、
親ウィンドウのdomからコード番号(cd)を順次読み込み、
コード番号に関連する子ウィンドウを呼び出して子ウィンドウ上のdomを読み込んで
コンソールに表示させるものですが、下記のコードではfor文のi=5に該当する
domしか実行されません。

これはfor文の中でsettimeoutを実行した場合に発生する現象かと思われますが、
(参考 https://lealog.hateblo.jp/entry/2014/01/16/005438)
どのようにすれば、下記のコードが正しく実行されるか、
他のHPを見ても見当が付かなかったので、質問させていただきます。
よろしくお願いいたします。

javascript: (function () {
var rdata = window.frames[2].document.getElementsByClassName('R_DATA');
for (var i = 0; i < 5; i++) {
var cd = rdata[i].cells[2].childNodes[1].innerText;
var u = "https://hogehoge.com/data2.do?cmn.cd=" + cd;
w = window.open(u);

function readStateCheck() { if (w.document.readyState == "complete") { console.log(w.document.body.childNodes[1].innerText); } else { setTimeout(readStateCheck, 100); } }; setTimeout(readStateCheck, 100); }

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

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

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

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

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

guest

回答2

0

ベストアンサー

変数wが上書き&汚染しているのが気になるので

JavaScript

1setTimeout(readStateCheck, 100, window.open(u));

JavaScript

1function readStateCheck(w) {

投稿2018/10/05 08:01

x_x

総合スコア13749

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

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

blue_blacks

2018/10/05 08:21

ご回答ありがとうございます。下記の通りしたところ、子ウィンドウが2回ずつ表示されるようになりましたが、i=0〰4までの結果は表示されるようになりました!ありがとうございました。 javascript: (function () { var rdata = window.frames[2].document.getElementsByClassName('R_DATA'); for (var i = 0; i < 5; i++) { var cd = rdata[i].cells[2].childNodes[1].innerText; var u = "https://hogehoge.com/data2.do?cmn.cd=" + cd; w = window.open(u); function readStateCheck(w) { if (w.document.readyState == "complete") { console.log(w.document.body.childNodes[1].innerText); } else { setTimeout(readStateCheck, 100); } }; setTimeout(readStateCheck, 100,window.open(u)); }
blue_blacks

2018/10/05 08:23 編集

(削除しました)
x_x

2018/10/05 08:26

w = window.open(u); は、いらないですよ(そこが気になって汚染していると言ったので) もう一個のsetTimeoutも setTimeout(readStateCheck, 100, w); としないといけないでしょう。
blue_blacks

2018/10/05 08:47

ご回答ありがとうございます!これから所用がありますので、また改めて確認してみたいと思います。
guest

0

質問の要旨がわからないのですが

javascript

1for(var i=0;i<5;i++){ 2 setTimeout(function(){console.log(i)},0); 3}

のような状況を想定してるのでしたら、varをletに変えるだけでいけます

javascript

1for(let i=0;i<5;i++){ 2 setTimeout(function(){console.log(i)},0); 3}

ちなみにvarでやるならiは引数で渡します

javascript

1for(var i=0;i<5;i++){ 2 setTimeout(function(i){console.log(i)},0,i); 3}

投稿2018/10/05 05:54

編集2018/10/05 05:55
yambejp

総合スコア114572

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

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

blue_blacks

2018/10/05 07:04 編集

早速のご回答、ありがとうございます。 上記のコードではsetTimeout内にiではなくwindows.openの返り値を 代入した変数を渡そうとしていますが、結果としてi = 5の結果 のみがconsole.logに表示されてしまうので、i=0〰5の結果を順番に console.logに出力したい、ということが質問の趣旨となります。
yambejp

2018/10/05 07:20

ごめんなさい、htmlを含めめ具体的なソースがあるならご提示ください 実際に動かしてみないと検証できないので
blue_blacks

2018/10/05 07:42

申し訳ありません、html等については提示が難しい状況です… なお、デバックしてみたところ、i=0〰4までwindow.openは実行され子ウィンドウは 開きますが、15行目setTimeout(readStateCheck, 100);はスルーされ、i=5でようやく 15行目setTimeout(readStateCheck, 100);が実行される状況です。
yambejp

2018/10/05 07:58

そうなるとデータの相関関係もまったく想像できないので ちょっと回答はむずかしいですね。あしからず
blue_blacks

2018/10/05 08:13

承知しました。お時間いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問