Javascript 如何使用jQuery并行处理动态添加的脚本标记
以下是我的情况:我通过Javascript 如何使用jQuery并行处理动态添加的脚本标记,javascript,jquery,html,ajax,Javascript,Jquery,Html,Ajax,以下是我的情况:我通过 $('body').append('<script src="http://localhost:8080/script_1.js"></script>'); $('body').append('<script src="http://localhost:8080/script_2.js"></script>'); 或jQuery函数:getScript $.getScript('http://localhost:8080/
$('body').append('<script src="http://localhost:8080/script_1.js"></script>');
$('body').append('<script src="http://localhost:8080/script_2.js"></script>');
或jQuery函数:getScript
$.getScript('http://localhost:8080/script_1.js');
我搜索了很多,发现jQuery实际上会删除脚本标记,解析源代码,并使用其ajax函数$.ajax()加载脚本,而不是让浏览器来处理。但是$.getScript()函数也使用$.ajax()并且没有阻塞。显然,这不是$.ajax()的错
下面是一个测试用例:
转到并在控制台中粘贴以下脚本,该脚本将通过jQuery两次添加js文件
$('body').append('<script src="/jquery-wp-content/themes/jquery/js/plugins.js"></script>');
$('body').append('<script src="/jquery-wp-content/themes/jquery/js/plugins.js"></script>');
$('body')。追加(“”);
$('body')。追加('');
检查时间线,你会发现它们是按顺序加载的。
当然,我可以使用上面的原生js或$.getScript()来节省时间
然而,我想知道为什么?为什么这些来自添加脚本标记的jqueryajax调用不是并行的
更新
更有趣的是,这个序列似乎只适用于同一来源的脚本。
我试着从谷歌托管的库中加载一些js文件,它们是并行的。我也试过跟随
$('body')。追加(“”);
$('body')。追加('');
将脚本附加到DOM时,根据跨域测试,会使用不同的ajaxTransport函数
当我们有一个协议:host:port时,就会发生跨域请求
不匹配
在第一种情况下,相同来源:
JQuery使用函数async=false
强制同步请求()
因此控制台上出现了警告(至少在金丝雀上)
主线程上的同步XMLHttpRequest已被弃用
在第二种情况下,交叉原点:
JQuery使用ajax,如下所示()
script=jQuery(“”).prop({
async:true,
字符集:s.scriptCharset,
src:s.url
}).....
document.head.appendChild(脚本[0]);
正如您所说,它将并行加载。“动态创建并添加到文档中的脚本默认是异步的”,根据,但它没有解释为什么jQuery附加的本地脚本不是这种情况。@Moob是的,我知道……正如我提到的,我可以使用纯javascript
document.body.appendChild(脚本)代码>加载,是的,它们是并行的…但我只是想知道秘密地做了什么,使我的案例变得有序规范中有一些线索,但是-用他们的话说:“由于大多数历史原因,这些属性的确切处理细节有些琐碎,涉及HTML的许多方面。因此,实施要求必然分散在整个规范中……”
$('body').append('<script src="/jquery-wp-content/themes/jquery/js/plugins.js"></script>');
$('body').append('<script src="/jquery-wp-content/themes/jquery/js/plugins.js"></script>');
$('body').append('<script src="https://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core.js"></script>');
$('body').append('<script src="https://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core.js"></script>');
xhr.open(
options.type,
options.url,
options.async,
options.username,
options.password
);
script = jQuery("<script>").prop({
async: true,
charset: s.scriptCharset,
src: s.url
}).....
document.head.appendChild(script[0]);