0

我正在编写 Chrome 扩展程序。我还需要检查 URL 是否在线。URL 返回一个变量,所以如果 var 为真,则 URL 在线。

如果 URL 处于脱机状态,错误大约需要 2 秒,因此扩展弹出窗口每次都需要 2 秒才能启动。

这是我的“旧”版本:

popup.html:

<script language="javascript" src="http://example.org/jdcheck.js"></script>
<script language="javascript" src="popup.js"></script>

popup.js:

if (variable) { [...] }

好吧,那奏效了- 2秒后。

现在我有了一个想法,所以我删除了popup.html中的scriptlink。这就是我的新 popup.js:

background.$(document).ready(function() {


      var jq = document.createElement('script'); jq.type = 'text/javascript';
      jq.src = 'http://127.0.0.1:9666/jdcheck.js';
      document.getElementsByTagName('head')[0].appendChild(jq);

  if(jdownloader){
         [...action]
  }  
});

你看,我使用 jQuery 来加载 Checkfile。

现在,它给我一个错误:

Uncaught ReferenceError: jdownloader is not defined 

好吧,看起来 createElement 不起作用。我 100% 确定 URL 给了我想要的变量。

请你帮助我好吗?我不知道如何解决这个问题。。

谢谢!马库斯


编辑:我删除了 jQuery 部分,添加了 keepGoing 和 jq.onload:

    function keepGoing() {

      console.log("JS should have been loaded");

      if(jdownloader){

        [action]
      }  
    }  

      var jq = document.createElement('script');
      jq.onload = keepGoing();
      jq.src = 'http://127.0.0.1:9666/jdcheck.js';
      document.getElementsByTagName('head')[0].appendChild(jq);

现在,控制台给了我这个:

JS should have been loaded popup.js:98
Uncaught ReferenceError: jdownloader is not defined popup.js:100

所以看起来 jdownloader var 没有传递给 popup.js。为什么为什么?!我不知道。

马库斯

4

3 回答 3

2

当您将脚本标记附加到 DOM 时,代码不会等待浏览器下载并评估脚本,然后继续。

所以你必须回来检查。在 Chrome 中,您可以在元素上使用load事件。script

background.$(document).ready(function() {

    var jq = document.createElement('script'); jq.type = 'text/javascript';
    jq.onload = keepGoing; // Or an anonymous inline function if you prefer
    jq.src = 'http://127.0.0.1:9666/jdcheck.js';
    document.getElementsByTagName('head')[0].appendChild(jq);

    function keepGoing() {
        if(jdownloader)...
    }  
});

(“在 Chrome 上”,因为在旧版本的 IE 中,script没有触发load事件,它触发了readystatechange。)


旁注:您不必提供type属性,如果它是text/javascript. 也就是说,并且一直是默认设置。

于 2013-10-04T11:26:42.663 回答
0

解决方案可能非常简单,至少对于您问题的已编辑部分而言。请参阅我的 jsfiddle 以供参考:http: //jsfiddle.net/6kkC4/1/

jq.onload = keepGoing(); 对比 jq.onload = keepGoing;

调用“onLoad()”将立即评估函数(所以不是 onload)。jq.onload = keepGoing;仅传递对该函数的引用,并在加载时评估该函数。

于 2013-10-04T12:17:00.540 回答
0

由于执行 JavaScript 文件 Include 的“创建脚本节点”方法是异步的,我们应该使用 await 和 async 关键字。

这是一个完整的示例,说明如何包含一个名为“Context”的函数,然后使用 Promises(await 和 async)调用它:

CallContext(); // Call the async function to do the call

async function CallContext()
    {
    await Include("context.js");
    alert(Context()); // Call Context when Include is done
    } // CallContext

// Wrap the callback of the script element creation in a Promise
async function Include(jsFilePath)
    {
    return new Promise((resolve,reject) =>
        {
        var js = d.createElement("script");
        js.onload = resolve;
        js.src = jsFilePath;
        d.body.appendChild(js);
        });
    } // Include

请注意,到目前为止,还没有现代方法可以隐藏显式的“新 Promise”代码。

于 2021-06-06T12:19:42.550 回答