【问题标题】:Don't execute rest of code until external script loads在外部脚本加载之前不要执行其余代码
【发布时间】:2016-10-03 20:31:59
【问题描述】:

我正在编写一个小书签脚本(一个大的 IIFE )。该脚本之前是为包含 jQuery 的页面创建的,并且广泛使用 jQuery。

问题是我们现在开始在我们的一些产品中远离 jQuery,但仍然需要这个小书签以同样的方式运行。

所以,我想更新书签,以便它首先检查页面上是否存在 jQuery。

如果是 jQuery,继续正常执行。

如果是 !jQuery,则下载 jQuery (AJAX),然后执行脚本的其余部分。

问题是我不确定如何在 IIFE 中执行此操作。由于获取脚本将是一个异步操作,在继续执行脚本之前,如何确保 jQuery 已下载并且可以正常运行?这就是我目前所拥有的......

(function () {
    var continueExec = true;
    if (!window.jQuery) {
        continueExec = false;
        var s = document.createElement('script');
        s.onload = function () {
            continueExec = true;
        };
        s.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js';
        document.head.appendChild(s);
    }
        // .. now I want to be able to use jQuery here. What do I need to change?
        // $('.className')...
})()

请注意,由于这是一个书市,它会在加载/渲染后注入到页面中,所以它不像将 jQuery 脚本块放在头部更高处那么简单。

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    在 javascript 中,您需要一个回调来处理异步操作。

    在您的示例中,我们可以在两种情况下执行这样的回调:
    a) jQuery 已经定义
    b) jQuery 已下载并可以使用

    因此,我们稍微更改您的代码并将回调传递给包含主应用程序的 IIFE,并在两种情况下都调用它。

    (function (callback) {
        if (!window.jQuery) {
            var s = document.createElement('script');
            s.onload = function() {
              // Start the main application once jQuery was load:
              callback(window.jQuery);
            };
            s.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js';
            document.head.appendChild(s);
        } else {
          // Start the main application directly as jQuery is already part of the page:
          callback(window.jQuery);
        }
    })(function($) {
        // The main application
        //
        // here you can use
        // $('.className')...
    });
    

    【讨论】:

    • 完美。正是我想要的。不知道为什么我不认为将 IIFE 链接为回调。干得好!
    猜你喜欢
    • 2015-03-28
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多