2012-08-13 44 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?如果是这样,这个计划可能只会触发一两次。
    链接到目标页面并更好地描述其行为。