私は正しく推測している場合は、これはおそらく試したものです:
for (var i = 0; i < 100; i++) {
setTimeout(function() {
$('.class.' + i).children('.BUTTON').click();
}, time * i);
}
は、それが原因で非同期性のjavascriptの原因の動作しませんでしたdoesnのsetTimeout
のコールバック」すぐに実行されません。これは目的には適していますが、setTimeout
と呼び出すたびに、そのコールバックは実際には同じイテレータi
(lexical-scopingのため)を参照しています。コールバックが実行さ実際をしているとき、各コールバックは今同じi
ので、(同じ値)とを参照するように
、すべてのボタンを同時にクリックします。
この問題は、JavaScriptがよりlexical-scoping
の優先度に起因する可能性があります。しかし、私たちは、javascriptのfunction
もブロックスコープのコンストラクタとして動作することを知っています(実際には、javascriptでブロックスコープの唯一のものです)。だから我々はこのようにそれを使用します:私はここにいた何
for (var i = 0; i < 100; i++) {
(function(i) { // IIFE starts
setTimeout(function() {
$('.class.' + i).children('.BUTTON').click();
}, time * i);
})(i); // <-------IIFE ends
}
はIIFE(すぐに呼び出される関数式)と呼ばれています。 IIFEは、プログラムコントロールが到達すると直ちに実行される関数式です。また、関数がjavascriptでブロックスコープになっているため、変数i
が渡される(値渡しのため)スコープのメンバーになり、もはや外部ループのi
に依存しなくなります。
基本的には、IIFE
内に新しいi
を作成しました。そして、それぞれIIFE
の場合、i
の値が異なります。生命維持WITH
:ここ
は簡単な例です
for (var i = 0; i < 100; i++) {
(function(i) { // IIFE starts
setTimeout(function() {
console.log(i); // <----- simply printing the iterator i
}, 500);
})(i); // <-------IIFE ends
}
OUTPUT:生命維持WITHOUT
0
1
2
3
... (upto 99)
:
for (var i = 0; i < 100; i++) {
setTimeout(function() {
console.log(i); // <----- simply printing the iterator i
}, 500);
}
OUTPUT:それはinexistantボタンを検索しないように
100
100
100
... (100 times)
他のコードは、> =私は明確にすること、それは最後の1つになっています。 – TweakFix
"そこには同じ名前のクラスがたくさんあることに気が付いているから" ...あなたはhtmlや例へのリンクを投稿していないので、どうやって気付くことができますか? [mcve]を読む – yezzz