Javascript 注入innerHTML的脚本不';t触发onload和onerror
我正在尝试绑定Javascript 注入innerHTML的脚本不';t触发onload和onerror,javascript,Javascript,我正在尝试绑定script标记的onload和onerror事件。当从src加载时,这可以正常工作。鉴于以下功能: function injectJS(src, inline) { var script = document.createElement("script"); if (inline) { script.innerHTML = src; } else { script.src = src; } script.
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...
成功代码>在这些情况下未被记录。但是,我可以预先编写一些可以调用函数的代码,例如,一旦加载脚本
当出现一个首先阻止加载脚本的错误时,就会出现问题,例如语法错误:
> injectJS("console.log(\"Success! Or not..\"); syntax error;", true);
没有任何记录(当然,除了错误)。如何在加载之前检测注入的脚本是否已加载或出错
编辑:
奥利奥为我指明了正确的方向。作为参考,这里是最终的函数,它完全按照我的要求工作,并通过了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();
}
}
}
。所以你根本不需要这些活动
只用
函数injectJS(src,内联){
var script=document.createElement(“脚本”);
script.onload=function(){console.log(“Success!”);};
script.onerror=function(){console.log(“Error!”);};
如果(内联){
script.innerHTML=src;
script.onload();
}否则{
script.src=src;
}
document.body.appendChild(脚本);
}
injectJS(“console.log(\“Yes!\”);”,true)代码>。所以你根本不需要这些活动
只用
函数injectJS(src,内联){
var script=document.createElement(“脚本”);
script.onload=function(){console.log(“Success!”);};
script.onerror=function(){console.log(“Error!”);};
如果(内联){
script.innerHTML=src;
script.onload();
}否则{
script.src=src;
}
document.body.appendChild(脚本);
}
injectJS(“console.log(\“Yes!\”);”,true)代码>忽略?他们对我来说很好。。问题是检测它们何时加载。如何在加载之前检测注入的脚本是否加载或出错?你不能。@ScottMarcus Oh..要检测错误,你可以尝试window.onerror
,或者将脚本内容包装在一个大try
块中。我不是要检测脚本中的错误,我只是想看看是否加载了它。无论如何谢谢:)被忽略了?他们对我来说很好。。问题是检测它们何时加载。如何在加载之前检测注入的脚本是否加载或出错?你不能。@ScottMarcus Oh..要检测错误,你可以尝试window.onerror
,或者将脚本内容包装在一个大try
块中。我不是要检测脚本中的错误,我只是想看看是否加载了它。无论如何谢谢你:)哦,我不知道。我真傻,还没弄明白。谢谢然后我会做一些事情,比如添加window.script\u loaded=true
以开始每个脚本并检查它。如果为true,则将其设置为false并调用success
回调。否则调用错误
回调。@Slayther让我坚持这是不一致的<代码>injectJS(“解析错误”,true,=>console.log(“成功!”),=>console.log(“错误!”)
将记录错误,但injectJS(“数据:text/javascript,parse error”,false,=>console.log(“成功!”),=>console.log(“错误!”)代码>将记录成功。<代码>加载< /代码>和<代码>错误< /代码>事件不应该验证脚本,只通知它是否可以被取。我实际上认为第二种情况是成功的,因为它对我来说只有重要的是知道脚本是否加载。如果它是一个外部脚本,那么错误不起作用,而只起HTTP或脚本本身之外的其他(例如浏览器特定的)错误的作用。您可以在我的问题中看到这一点。第二种情况是完美工作的JS的URL。当Chrome显示错误时:拒绝从执行脚本'https://raw.githubusercontent.com/eligrey/FileSaver.js/master/FileSaver.js'因为它的MIME类型('text/plain')是不可执行的,并且启用了严格的MIME类型检查。
,脚本没有加载,它必须调用错误
回调。哦,我不知道。我真傻,还没弄明白。谢谢然后我会做一些事情,比如添加window.script\u loaded=true
以开始每个脚本并检查它。如果为true,则将其设置为false并调用success
回调。否则调用错误
回调。@Slayther让我坚持这是不一致的<代码>injectJS(“解析错误”,true,=>console.log(“成功!”),=>console.log(“错误!”)
将记录错误,但injectJS(“数据:text/javascript,parse error”,false,=>console.log(“成功!”),=>console.log(“错误!”)代码>将记录成功。<代码>加载< /代码>和<代码>错误< /代码>事件不应该验证脚本,只通知它是否可以被取。我实际上认为第二种情况是成功的,因为它对我来说只有重要的是知道脚本是否加载。如果它是一个外部脚本,那么错误不起作用,而只起HTTP或脚本本身之外的其他(例如浏览器特定的)错误的作用。您可以在我的问题中看到这一点。第二种情况是完美工作的JS的URL。当Chrome显示错误时:拒绝从执行脚本'https://raw.githubusercontent.com/eligrey/FileSaver.js/master/FileSaver.js'因为它的MIME类型('text/plain')不可执行,并且启用了严格的MIME类型检查。
,所以脚本未加载,它必须调用错误
回调。