Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态加载jQuery并在另一个函数中使用它_Javascript_Dynamic - Fatal编程技术网

Javascript 动态加载jQuery并在另一个函数中使用它

Javascript 动态加载jQuery并在另一个函数中使用它,javascript,dynamic,Javascript,Dynamic,我使用上面的代码在控制台中动态加载jQuery,然后使用jQuery从DOM获取一些数据并将它们存储在数组中。但是,它返回一个空数组。我认为这是因为加载jQuery需要一些时间,函数在加载jQuery和执行jQuery代码之前返回 因此,在getArray()返回之前,我必须确保jQuery代码已经执行。我尝试将返回我的_数组放在addEventListener中,当然它不起作用,因为那样它将返回匿名函数。我可以想出一些方法来解决这个问题,比如将my_array设置为全局,这样我就不必返回函数,

我使用上面的代码在控制台中动态加载jQuery,然后使用jQuery从DOM获取一些数据并将它们存储在数组中。但是,它返回一个空数组。我认为这是因为加载jQuery需要一些时间,函数在加载jQuery和执行jQuery代码之前返回


因此,在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)