我很喜欢Chrome扩展程序。我还需要检查URL是否在线。 URL返回一个变量,因此如果var为true,则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。 为什么为什么?!我不知道。
马库斯
答案 0 :(得分: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
,则不必提供{{1}}属性。那就是,而且一直是默认的。
答案 1 :(得分:0)
解决方案可能非常简单,至少对于问题的编辑部分而言。 请参阅我的jsfiddle以供参考:http://jsfiddle.net/6kkC4/1/
jq.onload = keepGoing();
与
jq.onload = keepGoing;
调用“onLoad()”将立即评估该函数(因此不会onload)。
使用jq.onload = keepGoing;
时,仅传递对函数的引用
并且该函数被评估为onload。
答案 2 :(得分:0)
由于执行 JavaScript 文件 Include 的“创建脚本节点”方法是异步的,我们应该使用 await 和 async 关键字。
以下是一个完整的示例,说明如何使用 Promise(await 和 async)包含名为“Context”的函数,然后调用它:
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
请注意,目前还没有现代方法来隐藏显式的“新承诺”代码。