Javascript 动态加载jQuery并在另一个函数中使用它
我使用上面的代码在控制台中动态加载jQuery,然后使用jQuery从DOM获取一些数据并将它们存储在数组中。但是,它返回一个空数组。我认为这是因为加载jQuery需要一些时间,函数在加载jQuery和执行jQuery代码之前返回Javascript 动态加载jQuery并在另一个函数中使用它,javascript,dynamic,Javascript,Dynamic,我使用上面的代码在控制台中动态加载jQuery,然后使用jQuery从DOM获取一些数据并将它们存储在数组中。但是,它返回一个空数组。我认为这是因为加载jQuery需要一些时间,函数在加载jQuery和执行jQuery代码之前返回 因此,在getArray()返回之前,我必须确保jQuery代码已经执行。我尝试将返回我的_数组放在addEventListener中,当然它不起作用,因为那样它将返回匿名函数。我可以想出一些方法来解决这个问题,比如将my_array设置为全局,这样我就不必返回函数,
因此,在getArray()返回之前,我必须确保jQuery代码已经执行。我尝试将
返回我的_数组
放在addEventListener
中,当然它不起作用,因为那样它将返回匿名函数。我可以想出一些方法来解决这个问题,比如将my_array
设置为全局,这样我就不必返回函数,或者将jQuery加载代码放在另一个loadjQuery
函数中,并在执行jQuery代码之前调用它,但是有没有更好的方法呢?不幸的是,这无法做到。JavaScript是一种基于事件的单线程异步语言。你想做的事在那种环境下是行不通的
但是,您可能只需要在处理此函数之前加载jQuery(甚至使用一个简单的
标记)即可解决问题。否则,由于jQuery库的下载和评估,在调用函数时可能会遇到非常明显的延迟。另一个问题是,如果调用函数的次数超过1次,就会再次加载jQuery,这可能会造成很大的混乱
或者,如果您“坚持”使用jQuery并仅在调用函数后加载它,您可以返回一个解析为数组的函数,如下所示(这需要支持浏览器或一些polyfills/promise库):
问题是由于加载jquery脚本的异步调用造成的 最好的方法是,编写一个函数来加载脚本并传递回调函数,然后在成功加载脚本时调用回调函数,例如:
function getArray() {
var j = document.createElement('script');
j.src = "http://code.jquery.com/jquery-2.1.4.min.js";
var head = document.getElementsByTagName('head')[0];
head.appendChild(j);
return new Promise(function(resolve, reject) {
j.addEventListener('load',function(){
var my_array = [];
// Some jQuery codes to fill my_array
resolve(my_array);
});
});
}
addEventListener
回调是响应事件而运行的,因此是异步的。因此,在调用回调之前,getArray不会总是返回一个空数组。这是如何解决问题的?调用loadScript(getArray)
会返回填充的数组吗?(提示:不会的)
function getArray() {
var j = document.createElement('script');
j.src = "http://code.jquery.com/jquery-2.1.4.min.js";
var head = document.getElementsByTagName('head')[0];
head.appendChild(j);
return new Promise(function(resolve, reject) {
j.addEventListener('load',function(){
var my_array = [];
// Some jQuery codes to fill my_array
resolve(my_array);
});
});
}
function loadScript(callback) {
var j = document.createElement('script');
j.src = "http://code.jquery.com/jquery-2.1.4.min.js";
var head = document.getElementsByTagName('head')[0];
head.appendChild(j);
j.addEventListener('load',function(){
if(typeof(callback) == "function")
});
}
function getArray(){
var my_array = [];
// Some jQuery codes to fill my_array
return my_array;
}
loadScript(getArray)