我有用户控件(myUserControl.ascx)。因为我试图附加脚本标签并分配" src"动态然后检查onload和onerror事件,但它似乎无法工作。我在点击按钮时调用PerformDynamicJS。
function PerformDynamicJS(){
var scriptGoogle = document.createElement("script");
scriptGoogle.type = "text/javascript";
scriptGoogle.src = "myscript.js";
scriptGoogle.onload = function (evt) {
alert('Inside onload');
}
scriptGoogle.onerror = function (evt) {
alert('Inside on error');
}
}
答案 0 :(得分:1)
将新创建的标签添加到文档中:
document.getElementsByTagName('head')[0].appendChild(scriptGoogle);
答案 1 :(得分:1)
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", "url to the script file here");
document.getElementsByTagName("head")[0].appendChild(script);
之前我用脚本查找过“onload”,我不记得找到这样的事件了。我最后编写了一个基于计时器的js代码来经常检查一个预期在正在下载的脚本中定义的对象。所以,要么你这样做,要么:为什么不在插入脚本标记的代码中做任何事情 - 相反,你有一个完美的时间,你的脚本准备就绪:添加“解包”代码到脚本本身(例如alert("I, the script, loaded and I'm ready with these functions that I provide");
。
并且,此处没有“出错”案例:脚本将下载或不会(无论出于何种原因:不可用,连接,服务器错误等)。如果它[下载],那个正在执行/使用该脚本时可能发生的任何错误都不是真正与传输相关的(这些错误应该被视为处理任何其他脚本错误的方式),所以你的意图是“onerror” “这里不合适(IMO)。 +1:)
编辑:如果没有下载,那么它将无法执行,您将无法使用它。如果您的客户端代码真的在等待,那么您将不得不编写某种基于计时器的超时逻辑;例如,在上面的“添加到头部”行之后,执行以下操作:
window.setTimeout(function()
{
// object/variable "newScriptObject" is defined in the new script
if(!newScript)
{
// script timed out; let's proceed with plan B
}
else
{
// script ready, proceed as planned;
// although, like I said, I think it's more precise if you execute this code in your myscript.js instead - as maybe that code will be ready before the 5 sec assumed here
// alternatively, use window.setInterval to check for objects defined this script every so milliseconds, in which case, when you find the script, don't forget to stop that timer (window.clearInterval)
}
}, 5000); // wait 5 sec for the new script
最后,在这种情况下没有“部分下载”这样的东西。一个理智的浏览器不会开始执行一个尚未完全的脚本,不仅要下载,还要解析(解释)。 “解释”部分是为什么你会看到JS错误,当你错过任何地方的支撑或由于其他语法错误时,这些错误经常指向不相关的位置。至少缺少一个大括号属于这一类,因为这样的语法错误实际上完全“转移”(某种)代码块,使得无法弄清楚它是什么。很抱歉在这里偏离主题。