如果我猜測正確,那麼這是你可能已經嘗試過:
for (var i = 0; i < 100; i++) {
setTimeout(function() {
$('.class.' + i).children('.BUTTON').click();
}, time * i);
}
它並沒有因爲異步特性的JavaScript由於其工作的setTimeout
沒有按回調」 t立即執行。這對你的目的有好處,但每次你撥打setTimeout
時,它的回調實際上是指相同的迭代器i
(歸因於lexical-scoping)。
這樣當回調是執行實際上,每個回調現指相同i
(與相同值),因此,所有的按鈕同時獲得點擊。
此問題也可歸因於lexical-scoping
優於block-scoping
的JavaScript。但是,我們知道在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
是不同的。
這裏有一個簡單的例子:
與IIFE :
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:
0
1
2
3
... (upto 99)
WITHOUT IIFE:
for (var i = 0; i < 100; i++) {
setTimeout(function() {
console.log(i); // <----- simply printing the iterator i
}, 500);
}
OUTPUT:
100
100
100
... (100 times)
的其他代碼已經> = i到清楚,就是這樣它爲inexistant按鈕未搜索的最後一個。 – TweakFix
「因爲你可以注意到有很多類在那裏有相同的名稱」......你沒有發佈任何HTML或鏈接到例子,所以我們怎麼能注意到?閱讀[mcve] – yezzz