Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript代码在控制台中工作,但当作为实际用户脚本加载时,并没有定义函数_Javascript_Automation_Greasemonkey_Userscripts - Fatal编程技术网

Javascript代码在控制台中工作,但当作为实际用户脚本加载时,并没有定义函数

Javascript代码在控制台中工作,但当作为实际用户脚本加载时,并没有定义函数,javascript,automation,greasemonkey,userscripts,Javascript,Automation,Greasemonkey,Userscripts,请记住,我不懂javascript。我把这几个小时的阅读和一个问题放在一起。我不是程序员,只懂一点HTML和CSS 我试图创建一个userscript,它每隔一段时间单击页面上的一个指定按钮,直到满足某个条件,然后停止循环并按下另一个按钮。多亏了这里的一些帮助,我得到了一段代码,这些代码在粘贴到Chrome或Firebug控制台时完全符合我的要求 但是,如果我将此脚本安装为Chrome扩展或Greasemonkey脚本,则会出现未定义的错误 var int = self.setInterval

请记住,我不懂javascript。我把这几个小时的阅读和一个问题放在一起。我不是程序员,只懂一点HTML和CSS

我试图创建一个userscript,它每隔一段时间单击页面上的一个指定按钮,直到满足某个条件,然后停止循环并按下另一个按钮。多亏了这里的一些帮助,我得到了一段代码,这些代码在粘贴到Chrome或Firebug控制台时完全符合我的要求

但是,如果我将此脚本安装为Chrome扩展或Greasemonkey脚本,则会出现未定义的错误

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秒的间隔不断返回

关于用户脚本有什么我不知道的吗?我做错了什么?

注意:

  • 如果您的代码缩进并格式化以便于阅读,人们更可能阅读您的代码。;-)看到我对你的问题所做的编辑,有很多

  • Re:
    setInterval(“refresh()”…
    ;不要用这样引用的代码调用
    setInterval
    (和类似的函数)。它的形式总是很差(不必要地使用
    eval()
    ),而且由于沙箱的缘故,它会变得平淡无奇

  • 类似地,有时定义之前使用的JS将是“未定义的”——特别是在
    eval
    情况下

  • 不要使用含糊不清、通用或保留字作为变量名或函数名。int尤其糟糕,因为大多数人会将其理解为“整数”,并且它在几乎所有主流语言中都是保留字

  • 小心使用
    self
    window
    对象。它们在Greasemonkey上下文中有不同的含义/行为

  • 分号在javascript中并不总是必需的,这是事实,但要养成经常使用分号的习惯。它会让你在将来省去痛苦,让代码更容易理解

  • 无论如何,如果代码是从控制台工作的,那么这也应该从脚本工作:

    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);
    
    注意:

  • 如果你的代码缩进并格式化以便于阅读,人们更可能阅读你的代码。-)请看我对你的问题所做的编辑,这里有很多

  • Re:
    setInterval(“refresh()”…
    ;不要用这样引用的代码调用
    setInterval
    (和类似的函数)。它的形式总是很差(不必要地使用
    eval()
    ),而且由于沙箱的缘故,它会变得平淡无奇

  • 类似地,有时定义之前使用的JS将是“未定义的”——特别是在
    eval
    情况下

  • 不要使用含糊不清、通用或保留字作为变量名或函数名。int尤其糟糕,因为大多数人会将其理解为“整数”,并且它在几乎所有主流语言中都是保留字

  • 小心使用
    self
    window
    对象。它们在Greasemonkey上下文中有不同的含义/行为

  • 分号在javascript中并不总是必需的,这是事实,但要养成经常使用分号的习惯。它会让你在将来省去痛苦,让代码更容易理解

  • 无论如何,如果代码是从控制台工作的,那么这也应该从脚本工作:

    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);