【问题标题】:Dynamically Loaded JS not available until after function completes动态加载的 JS 直到函数完成后才可用
【发布时间】:2016-05-27 07:08:54
【问题描述】:

我有一个使用加载函数加载 jQuery 的函数。在它加载 jQuery 之后,在接下来的几行中,我尝试调用 jQuery 功能,但它们不起作用。如果我重新加载它的功能。我曾尝试在调用函数中使用 setTimeOut、回调函数和两次重新加载相同的函数,但第一次无法读取 jQuery。

我在一个不允许我直接访问标题、正文等的平台 (iNotes) 上工作。我必须以编程方式进行。除了通过 javascript,我无权访问 onload,也无权添加 .js 文件。

我想通过该函数加载 jQuery(和 jQuery-ui),然后立即使用 jQuery 方法。

alertTwo() 从菜单项中调用。

function alertTwo(){
  window.setTimeout(function(){
      chk4_jQuery();
      iPage();
  },0);
}

 function chk4_jQuery() {
    if (typeof jQuery == 'undefined'    ) {
         loadJQ( function(){console.log('finallydone')});
    }else{
        // alert('Found jQuery');
    }
}

function loadJQ(finalCallback) {
    function load1() {
        loadScript('https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js ', function(){
            console.log('jQuery loaded');
            load2();
        }, 'script');
    }
    function load2() {
        loadScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js', function(){
            console.log('Jquery UI loaded');
            load3();
        },'script');
    }
    function load3() {
        loadScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css',function(){
            console.log('css loaded');
            finalCallback();
        },'stylesheet');
    }
    load1();
}

function iPage(){
    var page = location.protocol.concat("//").concat(window.location.hostname) +  "/testPage.html";
    var $dialog = $('<div></div>')
               .html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
               .dialog({
                   autoOpen: false,
                   modal: true,
                   height: 625,
                   width: 500,
                   title: "Some title"
               });
    $dialog.dialog('open');
    }

在开发人员工具的 Chrome 源选项卡中,我查看了这些函数的断点,我看到它会加载 jQuery 库,然后它会进入 iPage() 函数并在

var $dialog = $('<div></div>')

当我再次运行该函数时,它会识别 jQuery 变量并运行。

有人知道我如何在第一次尝试时让它工作吗?

【问题讨论】:

    标签: javascript javascript-objects dom-events


    【解决方案1】:

    调用iPage 作为回调。

    function alertTwo() {
      chk4_jQuery(); //Invoke `chk4_jQuery` function
    }
    
    function chk4_jQuery() {
      loadJQ(iPage); //Invoke `loadJQ` function and pass `iPage` function as argument
    }
    }
    
    function loadJQ(finalCallback) { // `finalCallback` is nothing but `iPage`
      function load1() {
        loadScript('https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js ', function() {
          console.log('jQuery loaded');
          load2();
        }, 'script');
      }
    
      function load2() {
        loadScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js', function() {
          console.log('Jquery UI loaded');
          load3();
        }, 'script');
      }
    
      function load3() {
        loadScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css', function() {
          console.log('css loaded');
          finalCallback(); //`iPage` is invoked when all other scripts are loaded
        }, 'stylesheet');
      }
      load1();
    }
    
    function iPage() {
      var page = location.protocol.concat("//").concat(window.location.hostname) + "/testPage.html";
      var $dialog = $('<div></div>')
        .html('<iframe style="border: 0px; " src="' + page + '" width="100%" height="100%"></iframe>')
        .dialog({
          autoOpen: false,
          modal: true,
          height: 625,
          width: 500,
          title: "Some title"
        });
      $dialog.dialog('open');
    }

    【讨论】:

    • 谢谢,人造丝!奇迹般有效。您能否向我解释或引导我正确地了解为什么会产生影响,我显然不明白为什么回调能够看到新加载的脚本,但以编程方式调用它却没有。跨度>
    • @carlo,通过 cmets :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多