gpt4 book ai didi

javascript - jQuery追加将下载脚本标签中的外部src,但不会加载到DOM中

转载 作者:行者123 更新时间:2023-11-28 07:12:40 25 4
gpt4 key购买 nike

如果我包含一个带有外部源的脚本,然后尝试使用 jQuery 进行解析 - 它会下载该脚本,但不会将其加载到 DOM 中。我正在使用 .append() ,但这似乎是任何其他 jQuery DOM 插入方法的情况。

这是堆栈片段中的示例

$(function(){

var selet2Html =
'<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>' +
'<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js" ><\/script>' +
'<select class="select2">' +
' <option value="AK">Alaska</option>' +
' <option value="HI">Hawaii</option>' +
'</select>' +
'<script >' +
' $(function() {' +
' $(".select2").select2();' +
' });' +
'<\/script>';

$("body").append(selet2Html);

});
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>

尽管这会在网络选项卡中下载脚本:

Network Activity

它仍然会返回以下错误(表明外部库 - select2 - 从未加载):

Uncaught TypeError: $(...).select2 is not a function

我不想使用$.getScript()因为我实际上是用 .load() 动态加载这个字符串的,所以我不确定它是否会包含任何外部脚本。

如何让它加载外部库?

最佳答案

所以 dandavis 是对的 - 在调用初始化程序之前,库需要时间来加载。一个幼稚的实现可以只等待一小段时间然后重试,如下所示:

setTimeout( function() {
$(".select2").select2();
}, 2000);

堆栈片段中的简单演示:

$(function(){

var selet2Html =
'<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>' +
'<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js" ><\/script>' +
'<select class="select2">' +
' <option value="AK">Alaska</option>' +
' <option value="HI">Hawaii</option>' +
'</select>' +
'<script >' +
' setTimeout( function() {' +
' $(".select2").select2();' +
' }, 2000);' +
'<\/script>';

$("body").append(selet2Html);

});
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>

更复杂的解决方案会等到 $.fn.select2 出现在 DOM 中。

输入OnAvailable

你可以这样调用它:

onAvailable('$.fn.select2', function() {
alert('we did it');
});

这里的函数将轮询全局命名空间以弹出变量。它使用 Accessing nested JavaScript objects with string key 中的 Alnitak 的 Object.byString 解决方案

function onAvailable(listenFor, callback) {
var interval = window.setInterval(function() {
if (Object.byString(window, listenFor)) {
clearInterval(interval);
callback()
}
}, 100);
};

堆栈片段中的高级演示

function onAvailable(listenFor, callback) {
var interval = window.setInterval(function() {
if (objectFromString(window, listenFor)) {
clearInterval(interval);
callback()
}
}, 100);
};

function objectFromString(o, s) {
s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
s = s.replace(/^\./, ''); // strip a leading dot
var a = s.split('.');
for (var i = 0, n = a.length; i < n; ++i) {
var k = a[i];
if (k in o) {
o = o[k];
} else {
return;
}
}
return o;
}

$(function(){

var selet2Html =
'<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>' +
'<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js" ><\/script>' +
'<select class="select2">' +
' <option value="AK">Alaska</option>' +
' <option value="HI">Hawaii</option>' +
'</select>' +
'<script >' +
' onAvailable("$.fn.select2", function() {' +
' $(".select2").select2();' +
' });' +
'<\/script>';

$("body").append(selet2Html);


});
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>

关于javascript - jQuery追加将下载脚本标签中的外部src,但不会加载到DOM中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31147961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com