简单地“@require”-调用第三方库会导致javascript错误吗?

简单地“@require”-调用第三方库会导致javascript错误吗?,javascript,greasemonkey,userscripts,tampermonkey,Javascript,Greasemonkey,Userscripts,Tampermonkey,我正在尝试创建一个运行的用户脚本。但当我运行它时,我得到: 错误:执行脚本“New Userscript”失败!插值器是 未定义 我的用户脚本如下所示: // ==UserScript== // @name New Userscript // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author

我正在尝试创建一个运行的用户脚本。但当我运行它时,我得到:

错误:执行脚本“New Userscript”失败!插值器是 未定义

我的用户脚本如下所示:

// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        www.istrolid.com
// @grant        none
// @require      https://rawgit.com/Rio6/Istrolid-js-ai/master/r26Ai.js
// ==/UserScript==

console.log(r26Ai);

几个问题,从大到小:

  • 该库仅在游戏页面上有效(定义了
    插值器

  • @match
    指令不正确,需要仅设置这些游戏页面

  • 游戏需要一些时间来加载和初始化——至少一秒钟

  • 该库编写得很糟糕,如果加载,将崩溃 在那之前

    这意味着
    @require
    不能用于该库。现在,改用脚本注入

    您需要使用计时器(最后手段)或事件(最佳选项)或战略节点(次优选项)来告诉何时注入脚本。查找事件(如果存在)或战略节点是一门艺术,并且是特定于页面的。这超出了本文的范围,因此在下面的示例代码中使用了计时器

  • 其他指令,尤其是
    @name
    应设置为合理值或忽略

  • 总而言之,本脚本将引导您进入下一步(超出本问题的范围):


    重要提示:请注意,
    Interpolator
    是该站点特有的页面特定功能,我们在此处使用该功能作为指示(a)我们正在适当的页面上运行,以及(b)是开始检查游戏负载的时候了

    // ==UserScript==
    // @name         Istrolid.com, use Istrolid Javascript AI API
    // @version      0.2
    // @match        *://www.istrolid.com/game.html*
    // @grant        none
    // ==/UserScript==
    
    /*-- Wait for game to load.  Try to find an event or node that signals
        this, instead of one or two timers.
    */
    var sfStrtTmr  = setInterval ( () => {
        if (typeof Interpolator  === "function") {
            clearInterval (sfStrtTmr);
            setTimeout (loadPoorScript, 1111);
        }
    }, 333);
    
    function loadPoorScript () {
        var newNode     = document.createElement ('script');
        newNode.onload  = runScriptMain;
        newNode.src     = "https://rawgit.com/Rio6/Istrolid-js-ai/master/r26Ai.js";
        document.body.appendChild (newNode);
    }
    
    function runScriptMain () {
        //  ALL OF YOUR CODE GOES HERE.
        console.log ("r26Ai: ",r26Ai);
    }