同步加载外部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

我必须通过一些JavaScript添加一个脚本标记,并让它完全执行,因为后面的语句依赖于它

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异常