脚本标签中的 onload 事件未触发
onload event in script tag not firing
作为序言,我查看了 SO 上有关此问题的现有帖子,我相信我的代码包含了所有建议的修复,但它仍然不起作用。
我正在尝试触发一个简单的 onload 事件:
var test = function() {
console.log("Script loaded! V2")
}
//Append new user script to head
const userProg = document.createElement('script')
userProg.type = 'text/javascript'
userProg.id = 'user-program'
userProg.addEventListener('load', test, false)
userProg.onload = function() {
console.log("Script loaded! V1")
}
userProg.text = [goatPuzzleSetupCode, genericSetupCode, userCode, resultToJSONCode].join('\n')
document.head.appendChild(userProg)
令人沮丧的是,我之前已经触发了 onload
事件,但我没有它运行时的代码副本。所以我不确定是什么问题。
Onload
不适用于您的情况,因为 内联脚本没有可加载的内容 它适用于 脚本下载即remote scripts
.
但是remote scripts
还需要注意一件事:
需要在onload
事件后设置src
属性。
//Append new user script to head
var goatPuzzleSetupCode= console.log("Script goatPuzzleSetupCode");
var genericSetupCode= console.log("Script genericSetupCode");
var userCode= console.log("Script userCode");
var resultToJSONCode= console.log("Script resultToJSONCode");
var userProg = document.createElement('script');
var script="//cdnjs.cloudflare.com/ajax/libs/less.js/1.3.3/less.min.js";
//userProg.addEventListener('load', test, false);
userProg.onload = function(script) {
console.log("Script loaded! 1"+script)
test();
};
userProg.src=script;
userProg.text = [goatPuzzleSetupCode, genericSetupCode, userCode, resultToJSONCode].join('\n')
document.head.appendChild(userProg);
var test = function() {
console.log("Script loaded! 2")
}
听起来您正在寻找类似 afterscriptexecute 的事件,不幸的是,它是非标准的,不应使用。但是,因为您已经直接插入了脚本文本,假设附加的脚本不包含错误,将其他内容添加到触发 window
函数的文本应该足够简单。例如:
window.scriptLoaded = function() {
console.log("Script loaded! V2")
}
const text1 = 'console.log("script1 running")';
const text2 = 'console.log("script2 running")';
//Append new user script to head
const userProg = document.createElement('script')
userProg.text = [text1, text2, 'scriptLoaded();'].join('\n');
document.head.appendChild(userProg)
(onload
不起作用,因为正如评论所说:
The onload is for when the element loads. i,e finished downloading.
但是没有 src
的脚本就没有任何东西可以下载)
作为序言,我查看了 SO 上有关此问题的现有帖子,我相信我的代码包含了所有建议的修复,但它仍然不起作用。
我正在尝试触发一个简单的 onload 事件:
var test = function() {
console.log("Script loaded! V2")
}
//Append new user script to head
const userProg = document.createElement('script')
userProg.type = 'text/javascript'
userProg.id = 'user-program'
userProg.addEventListener('load', test, false)
userProg.onload = function() {
console.log("Script loaded! V1")
}
userProg.text = [goatPuzzleSetupCode, genericSetupCode, userCode, resultToJSONCode].join('\n')
document.head.appendChild(userProg)
令人沮丧的是,我之前已经触发了 onload
事件,但我没有它运行时的代码副本。所以我不确定是什么问题。
Onload
不适用于您的情况,因为 内联脚本没有可加载的内容 它适用于 脚本下载即remote scripts
.
但是remote scripts
还需要注意一件事:
需要在onload
事件后设置src
属性。
//Append new user script to head
var goatPuzzleSetupCode= console.log("Script goatPuzzleSetupCode");
var genericSetupCode= console.log("Script genericSetupCode");
var userCode= console.log("Script userCode");
var resultToJSONCode= console.log("Script resultToJSONCode");
var userProg = document.createElement('script');
var script="//cdnjs.cloudflare.com/ajax/libs/less.js/1.3.3/less.min.js";
//userProg.addEventListener('load', test, false);
userProg.onload = function(script) {
console.log("Script loaded! 1"+script)
test();
};
userProg.src=script;
userProg.text = [goatPuzzleSetupCode, genericSetupCode, userCode, resultToJSONCode].join('\n')
document.head.appendChild(userProg);
var test = function() {
console.log("Script loaded! 2")
}
听起来您正在寻找类似 afterscriptexecute 的事件,不幸的是,它是非标准的,不应使用。但是,因为您已经直接插入了脚本文本,假设附加的脚本不包含错误,将其他内容添加到触发 window
函数的文本应该足够简单。例如:
window.scriptLoaded = function() {
console.log("Script loaded! V2")
}
const text1 = 'console.log("script1 running")';
const text2 = 'console.log("script2 running")';
//Append new user script to head
const userProg = document.createElement('script')
userProg.text = [text1, text2, 'scriptLoaded();'].join('\n');
document.head.appendChild(userProg)
(onload
不起作用,因为正如评论所说:
The onload is for when the element loads. i,e finished downloading.
但是没有 src
的脚本就没有任何东西可以下载)