Javascript 我怎样才能等待<;脚本>;附加到主体以完成执行
当用户单击一个按钮时,我需要向我的身体附加一个外部脚本。这是要求 菜鸟问题。假设外部库创建了一个window.newLib变量。当newLib变量准备好供我使用时,如何通知我 我尝试了此操作,但未调用onload:Javascript 我怎样才能等待<;脚本>;附加到主体以完成执行,javascript,html,async-await,script-tag,ios-web-app,Javascript,Html,Async Await,Script Tag,Ios Web App,当用户单击一个按钮时,我需要向我的身体附加一个外部脚本。这是要求 菜鸟问题。假设外部库创建了一个window.newLib变量。当newLib变量准备好供我使用时,如何通知我 我尝试了此操作,但未调用onload: const script = document.createElement('script'); script.innerHTML = 'window.test = 1; console.log("test defined.");'; script.onload = "c
const script = document.createElement('script');
script.innerHTML = 'window.test = 1; console.log("test defined.");';
script.onload = "console.log('onload called.', window.test)"
script.async = false;
document.body.appendChild(script);
这行得通,但我觉得很脏。有更好的办法吗
const injectScript = () => {
const script = document.createElement('script');
script.innerHTML = 'setTimeout(() => {window.test = 1},10500); console.log("test defined.");';
script.async = false;
document.body.appendChild(script);
}
const nap = ms => new Promise(res => setTimeout(res, ms));
const maxAttempts = 100;
const msNap = 100; // 10s timeout
const start = async () => {
injectScript();
let id = 0;
while (true) {
if (++id === maxAttempts) {
throw(`Lib took too long to load: ${id * msNap}ms`);
}
if (window.test) break;
await nap(msNap);
}
console.log('External lib correctly loaded.');
};
start();
感谢@Ultimater。这似乎如预期的那样起作用:
const script = document.createElement('script');
script.src = 'data:text/html,id = 0;while(true){ if(++id==1000000) break;} window.test = 1; console.log("test defined.");';
script.onload = () => console.log('onload called.', window.test);
document.body.appendChild(script);
试试这个:
const injectScript = () => {
const script = document.createElement('script');
script.innerHTML = 'console.log("Function loaded..."); window.postMessage({cmd:"loaded"});';
script.async = false;
document.body.appendChild(script);
}
setTimeout(injectScript, 3000);
window.addEventListener('message', function(e){
if(e.data.cmd === 'loaded'){
console.log('external library loaded');
}
});
script.onload=“console.log('onload called',window.test')
错误。这需要分配一个函数,而不是字符串。换句话说,script.onload=()=>console.log('onload called',window.test)
True@Ultimater,但即使我这样做了,它也不会被触发。为什么不在
中添加
标记,只使用加载
事件呢?因为要求是以后需要加载它。更多内容:这是一个Cordova应用程序,所需的库作为点播资源从苹果服务器下载。不幸的是,我无法改变这一点。