简单地“@require”-ing 一个第三方库会导致 javascript 错误?

Simply `@require`-ing a 3rd party library results in javascript errors?

我正在尝试创建 运行s another person's Istrolid AI library 的用户脚本。但是当我 运行 它时,我得到:

ERROR: Execution of script 'New Userscript' failed! Interpolator is not defined

我的用户脚本如下所示:

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

几个问题,从大到小:

  1. 该库仅在游戏页面(定义Interpolator的地方)有效。

  2. @match指令不正确,需要设置为那些游戏页面。

  3. 游戏需要一些时间来加载和初始化 -- 至少一秒钟。

  4. 那个库写得不好,加载会崩溃 之前 然后.

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

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

  5. 其他指令,尤其是 @name 应设置为合理的值或省略。

综合起来,这个脚本将带你进入下一步(这超出了这个问题的范围):

// ==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);
}

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