Javascript代码在控制台中工作,但当作为实际用户脚本加载时,并没有定义函数
请记住,我不懂javascript。我把这几个小时的阅读和一个问题放在一起。我不是程序员,只懂一点HTML和CSS 我试图创建一个userscript,它每隔一段时间单击页面上的一个指定按钮,直到满足某个条件,然后停止循环并按下另一个按钮。多亏了这里的一些帮助,我得到了一段代码,这些代码在粘贴到Chrome或Firebug控制台时完全符合我的要求 但是,如果我将此脚本安装为Chrome扩展或Greasemonkey脚本,则会出现未定义的错误Javascript代码在控制台中工作,但当作为实际用户脚本加载时,并没有定义函数,javascript,automation,greasemonkey,userscripts,Javascript,Automation,Greasemonkey,Userscripts,请记住,我不懂javascript。我把这几个小时的阅读和一个问题放在一起。我不是程序员,只懂一点HTML和CSS 我试图创建一个userscript,它每隔一段时间单击页面上的一个指定按钮,直到满足某个条件,然后停止循环并按下另一个按钮。多亏了这里的一些帮助,我得到了一段代码,这些代码在粘贴到Chrome或Firebug控制台时完全符合我的要求 但是,如果我将此脚本安装为Chrome扩展或Greasemonkey脚本,则会出现未定义的错误 var int = self.setInterval
var int = self.setInterval ("refresh ()", 4000);
function stop () {
// Stop the loop before joining server
int = window.clearInterval (int)
}
function join () {
// Click Join Server button
document.getElementsByClassName (
"base-button-arrow-almost-gigantic"
)[0].click ();
}
function refresh () {
// If current players < max, cancel loop and join server
var playersElement = document.getElementById ('server-info-players');
var players = playersElement.textContent;
var parts = players.split ("/");
var current = parseFloat (parts[0]);
var max = parseFloat (parts[1]);
if (current < max) {
stop ()
join ()
}
var refreshBtn = document.querySelector (
"div.serverguide-header-refresh-button div[type='reset'] a"
);
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
refreshBtn.dispatchEvent (clickEvent);
}
这只会以4秒的间隔不断返回
关于用户脚本有什么我不知道的吗?我做错了什么?注意:
setInterval(“refresh()”…
;不要用这样引用的代码调用setInterval
(和类似的函数)。它的形式总是很差(不必要地使用eval()
),而且由于沙箱的缘故,它会变得平淡无奇eval
情况下self
和window
对象。它们在Greasemonkey上下文中有不同的含义/行为var refreshInterval;
function stopRefreshTimer () {
// Stop the loop before joining server
clearInterval (refreshInterval);
}
function joinServer () {
// Click Join Server button
document.getElementsByClassName (
"base-button-arrow-almost-gigantic"
)[0].click ();
}
function refreshUntilJoiningServer () {
// If current players < max, cancel loop and join server
var playersElement = document.getElementById ('server-info-players');
var players = playersElement.textContent;
var parts = players.split ("/");
var current = parseFloat (parts[0]);
var max = parseFloat (parts[1]);
if (current < max) {
stopRefreshTimer ();
joinServer ();
}
var refreshBtn = document.querySelector (
"div.serverguide-header-refresh-button div[type='reset'] a"
);
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
refreshBtn.dispatchEvent (clickEvent);
}
refreshInterval = setInterval (refreshUntilJoiningServer, 4000);
var刷新间隔;
函数stopRefreshTimer(){
//在加入服务器之前停止循环
清除间隔(刷新间隔);
}
函数joinServer(){
//单击“加入服务器”按钮
document.getElementsByClassName(
“基本按钮箭头几乎是巨大的”
)[0]。单击();
}
函数refreshUntilJoiningServer(){
//如果当前玩家<最大值,取消循环并加入服务器
var playersElement=document.getElementById('server-info-players');
var players=playersElement.textContent;
var parts=players.split(“/”);
var current=parseFloat(部件[0]);
var max=parseFloat(第[1]部分);
如果(电流<最大值){
停止刷新计时器();
joinServer();
}
var refreshBtn=document.querySelector(
“div.serverguide-header-refresh-button div[type='reset']a”
);
var clickEvent=document.createEvent('MouseEvents');
clickEvent.initEvent('click',true,true);
refreshBtn.dispatchEvent(单击事件);
}
refreshInterval=setInterval(refreshUntilJoiningServer,4000);
注意:
setInterval(“refresh()”…
;不要用这样引用的代码调用setInterval
(和类似的函数)。它的形式总是很差(不必要地使用eval()
),而且由于沙箱的缘故,它会变得平淡无奇eval
情况下self
和window
对象。它们在Greasemonkey上下文中有不同的含义/行为var refreshInterval;
function stopRefreshTimer () {
// Stop the loop before joining server
clearInterval (refreshInterval);
}
function joinServer () {
// Click Join Server button
document.getElementsByClassName (
"base-button-arrow-almost-gigantic"
)[0].click ();
}
function refreshUntilJoiningServer () {
// If current players < max, cancel loop and join server
var playersElement = document.getElementById ('server-info-players');
var players = playersElement.textContent;
var parts = players.split ("/");
var current = parseFloat (parts[0]);
var max = parseFloat (parts[1]);
if (current < max) {
stopRefreshTimer ();
joinServer ();
}
var refreshBtn = document.querySelector (
"div.serverguide-header-refresh-button div[type='reset'] a"
);
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
refreshBtn.dispatchEvent (clickEvent);
}
refreshInterval = setInterval (refreshUntilJoiningServer, 4000);
var刷新间隔;
函数stopRefreshTimer(){
//在加入服务器之前停止循环
清除间隔(刷新间隔);
}
函数joinServer(){
//单击“加入服务器”按钮
document.getElementsByClassName(
“基本按钮箭头几乎是巨大的”
)[0]。单击();
}
函数refreshUntilJoiningServer(){
//如果当前玩家<最大值,取消循环并加入服务器
var playersElement=document.getElementById('server-info-players');
var players=playersElement.textContent;
var parts=players.split(“/”);
var current=parseFloat(部件[0]);
var max=parseFloat(第[1]部分);
如果(电流<最大值){
停止刷新计时器();
joinServer();
}
var refreshBtn=document.querySelector(
“div.serverguide-header-refresh-button div[type='reset']a”
);
var clickEvent=document.createEvent('MouseEvents');
clickEvent.initEvent('click',true,true);
refreshBtn.dispatchEvent(单击事件);
}
refreshInterval=setInterval(refreshUntilJoiningServer,4000);
简单地说,setInterval和事件处理程序的调用都是在Greasemonkey沙箱消失之后发生的
页面加载->Greasemonkey启动,运行脚本,Greasemonkey消失。(4秒过去)您的脚本现在发生
您需要做的是将作用域与setInterval一起传递,因此当这4秒
var notInt = self.setInterval(function () {
function stopRefreshTimer() {
// Stop the loop before joining server
clearInterval(refreshInterval);
}
function joinServer() {
// Click Join Server button
document.getElementsByClassName("base-button-arrow-almost-gigantic")[0].click();
}
// If current players < max, cancel loop and join server
var playersElement = document.getElementById('server-info-players');
var players = playersElement.textContent;
var parts = players.split("/");
var current = parseFloat(parts[0]);
var max = parseFloat(parts[1]);
if (current < max) {
stopRefreshTimer();
joinServer();
}
var refreshBtn = document.querySelector("div.serverguide-header-refresh-button div[type='reset'] a");
var clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent('click', true, true);
refreshBtn.dispatchEvent(clickEvent);
}, 4000);