2012-08-13 67 views
0

我試圖在JavaScript中開發一個簡單的Greasemonkey腳本。我怎樣才能自動模擬點擊每個點擊之間的時間間隔特定的按鈕?Greasemonkey腳本中的setinterval()和.click()

這裏是我的代碼:

var Next=document.getElementsByClassName("SubmitButton"); 

for (var i=0, c = Next.length; i<c; i++) 
{ 
    Next[i].click(); 
    setTimeout('Next[i].click()',3000); 
} 

的問題是,代碼只點擊的Next的第一個值。爲什麼?

+0

的可能重複[爲什麼在控制檯中,但不作爲的Greasemonkey腳本,這個setTimeout()調用的工作?](http://stackoverflow.com/questions/7356976/why-does-this-settimeout- call-in-the-console-but-as-a-greasemonkey-sc) – 2012-08-13 09:02:53

+0

還有一個相關的副本:http://stackoverflow.com/q/3131026 – 2012-08-13 09:03:39

回答

1

問題是,您將所有操作的超時設置爲同一時間,因此它們將全部同時運行。

另外,您正在代碼中使用變量i,它將在循環完成後運行,因此它將指向數組中最後一項之後的索引。

使用閉合,使每個項目單獨的變量,並且可以使用匿名函數,而不是字符串的代碼在超時執行:

var Next = document.getElementsByClassName("SubmitButton"); 

for (var i = 0, c = Next.length; i < c; i++) { 

//Next[i].click(); 

    (function(element, time){ 

    setTimeout(function(){ element.click(); }, time); 

    })(Next[i], 3000 * i); 

} 
1

的問題是:

  1. Auto-eval Strings will not work properly in Greasemonkey(他們應該避免在任何情況下)。所以傳遞一個函數到setTimeout()。這將起作用; 注意參數是如何處理

    var Next = document.getElementsByClassName ("SubmitButton"); 
    
    for (var i=0, c = Next.length; i<c; i++) { 
        Next[i].click(); 
        setTimeout (function (J) {Next[J].click(); }, 3000, i); 
    } 
    
  2. 你似乎想的間隔,並標有setinterval這個問題兩次。但代碼使用setTimeout,它只發射一次,而不是每3秒發射一次。也許你想用setinterval

    setinterval (function (J) {Next[J].click(); }, 3000, i); 
    
  3. 這似乎是點擊提交按鈕(s)。它是否正在加載一個新頁面。或觸發AJAX?如果是這樣,這個計劃可能只會觸發一兩次。
    鏈接到目標頁面並更好地描述其行爲。