【发布时间】:2016-11-17 19:11:58
【问题描述】:
我正在尝试绑定script 标签的onload 和onerror 事件。从 src 加载时,这工作正常。给定以下函数:
function injectJS(src, inline) {
var script = document.createElement("script");
if (inline) {
script.innerHTML = src;
} else {
script.src = src;
}
script.onload = function() {console.log("Success!");};
script.onerror = function() {console.log("Error!");};
document.body.appendChild(script);
}
我可以很容易地知道脚本是否已经加载:
> injectJS("https://code.jquery.com/jquery-3.1.1.min.js");
Success!
> injectJS("https://raw.githubusercontent.com/eligrey/FileSaver.js/master/FileSaver.js");
Error!
但是当使用 innerHTML 注入内联 JS 时,脚本不会触发事件:
> injectJS("console.log(\"Yes!\");", true);
Yes!
> injectJS("console.log(\"Loaded but error...\"); error;", true);
Loaded but error...
Success! 在这些情况下未被记录。但是,我可以在前面添加一些可以调用函数的代码,例如,一旦加载了脚本。
当出现阻止脚本加载的错误时就会出现问题,例如语法错误:
> injectJS("console.log(\"Success! Or not..\"); syntax error;", true);
没有任何记录(当然,除了错误)。如何在加载前检测注入的脚本是否已加载或出错?
编辑:
Oriol 的answer 为我指明了正确的方向。作为参考,这里是完全按照我的意愿工作并通过 5 个测试用例的最终函数:
function injectJS(src, inline, on_success, on_error) {
var script = document.createElement("script");
script.onload = on_success;
script.onerror = on_error;
if (inline) {
script.innerHTML = "window.script_loaded = true; " + src;
} else {
script.src = src;
}
document.body.appendChild(script);
if (inline) {
var loaded = window["script_loaded"];
window.script_loaded = false;
if (loaded) {
on_success();
} else {
on_error();
}
}
}
【问题讨论】:
-
忽略?它们对我来说运行良好。问题是检测它们何时加载。
-
如何检测注入的脚本在加载前是否已加载或出错? 你不能。
-
@ScottMarcus Oh..
-
要检测错误,您可以尝试
window.onerror,或者将脚本内容包装在一个大的try块中。 -
我不是想检测脚本中的错误,我只是想看看它是否加载。无论如何谢谢:)
标签: javascript