簡體   English   中英

簡單地對第三方庫進行`@ require`-會導致JavaScript錯誤?

[英]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);

從大到小的幾個問題:

  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)是時候開始檢查游戲負載了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM