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类型检查。
,所以脚本未加载,它必须调用
错误
回调。