[英]Simply `@require`-ing a 3rd party library results in javascript errors?
我正在嘗試創建一個可以運行另一個人的Istrolid AI庫的用戶腳本 。 但是當我運行它時,我得到:
錯誤:腳本“ 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);
從大到小的幾個問題:
該庫僅在游戲頁面 (定義了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)是時候開始檢查游戲負載了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.