简单地“@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);
几个问题,从大到小:
该库仅在游戏页面(定义Interpolator
的地方)有效。
@match
指令不正确,需要设置为那些游戏页面。
游戏需要一些时间来加载和初始化 -- 至少一秒钟。
那个库写得不好,加载会崩溃
之前 然后.
这意味着 @require
不能用于该库。现在,改用脚本注入。
您将需要使用计时器(最后手段)或事件(最佳选择)或战略节点(次佳选择)来告知何时注入脚本。查找事件(如果存在)或战略节点有点特定于艺术和页面。这超出了此处的范围,因此在下面的示例代码中使用了计时器。
其他指令,尤其是 @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 ) 是时候开始检查游戏负载了。
我正在尝试创建 运行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);
几个问题,从大到小:
该库仅在游戏页面(定义
Interpolator
的地方)有效。@match
指令不正确,需要设置为那些游戏页面。游戏需要一些时间来加载和初始化 -- 至少一秒钟。
那个库写得不好,加载会崩溃 之前 然后.
这意味着
@require
不能用于该库。现在,改用脚本注入。您将需要使用计时器(最后手段)或事件(最佳选择)或战略节点(次佳选择)来告知何时注入脚本。查找事件(如果存在)或战略节点有点特定于艺术和页面。这超出了此处的范围,因此在下面的示例代码中使用了计时器。
其他指令,尤其是
@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 ) 是时候开始检查游戏负载了。