同步加载外部JavaScript
我必须通过一些JavaScript添加一个脚本标记,并让它完全执行,因为后面的语句依赖于它同步加载外部JavaScript,javascript,html,xmlhttprequest,eval,Javascript,Html,Xmlhttprequest,Eval,我必须通过一些JavaScript添加一个脚本标记,并让它完全执行,因为后面的语句依赖于它 var logIt=(函数(){ var i=0, logging=document.getElementById('logging'); 返回函数{ var heading=document.createElement('p'); heading.innerText=`${++i}:${s}`; 日志记录。追加子项(标题); } }()); 罗吉特(“开始”); var newScriptTag=do
var logIt=(函数(){
var i=0,
logging=document.getElementById('logging');
返回函数{
var heading=document.createElement('p');
heading.innerText=`${++i}:${s}`;
日志记录。追加子项(标题);
}
}());
罗吉特(“开始”);
var newScriptTag=document.createElement('script');
newScriptTag.src='1https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js';
newScriptTag.type='text/javascript';
document.head.appendChild(newScriptTag);
试一试{
var now=moment().format('HH:mm');
logIt(`momentload.time为${now}`);
}捕获(e){
logIt(`momentnotloaded:${e}`);
}
注入脚本标记
注入脚本标记
使用
标记上的onload
事件侦听器:
const URL = 'https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js';
const onMomentReady = () => {
console.log('Moment.js is loaded!');
console.log(typeof moment);
}
var newScriptTag = document.createElement('script');
newScriptTag.onload = onMomentReady;
newScriptTag.src = URL;
// newScriptTag.type = 'text/javascript'; // no need for this
// optional
newScriptTag.async = true;
document.head.appendChild(newScriptTag);
注意,在设置
src
属性之前,我添加了onload
处理程序。如果先设置src
,处理程序函数可能不会启动。听说过onload
?@GottZ是。由于即将进行编译/传输/压缩/uglification,这不是一个选项。这不是仍然运行异步吗?我不能在同一个脚本中调用onmomentary()
方法中的momentary()
条(以及在它被激发之后)。不确定您期望的是什么。当然,它确实异步运行了onmomentary
功能,因为在加载、处理和执行创建
标记的JS之前,浏览器无法立即开始加载。而且加载过程确实会消耗时间,因此本质上是异步的——即使你没有将async
属性放在
标记上。更重要的是:在js中不做异步/面向事件的事情是非常糟糕的做法,被认为是一种反模式。@GottZ我必须使用我拥有的框架,我不能异步这是因为有一些我无法控制的东西会被捆绑在里面。没有什么是不可能的。除非你说出这个“框架”,否则我们根本帮不了你。如果您真的需要时间,那么为什么不将它捆绑到框架中呢?依赖第三方cdn可能导致404异常