Javascript:在执行函数之前等待同步加载脚本的最佳方法?

时间:2016-08-03 12:34:29

标签: javascript ajax dom loading synchronous

我有以下问题: 我在一个模态对话框中加载一个页面。该页面使用jQuery作为依赖项。因为我已经在主页面上使用了jQuery,对我来说,它始终可用。现在我们有了用例,如果需要,不同页面(托管在不同域上)也需要加载该页面。

因此,我检查此页面上是否存在jQuery变量,如果是,请继续使用我的代码。

如果它不存在,在模板顶部,我动态创建一个这样的脚本元素:

(function ($) {
.... code ....
})(jQuery);

在模板的最后,我使用IIFE(范围jquery变量)

    var xhrObj = new XMLHttpRequest();
    // open and send a synchronous request
    xhrObj.open('GET', "jquery.min.js", false);
    xhrObj.send('');
    // add the returned content to a newly created script tag
    var se = document.createElement('script');
    se.type = "text/javascript";
    se.text = xhrObj.responseText;
    document.getElementById('placeholder').appendChild(se);

但是,由于使用此方法,脚本会异步加载,有时我会收到错误:jQuery未定义。

现在我通过同步加载来实现,如下所示:

if (!window.jQuery) {
    document.write('<scr' + 'ipt src="jquery.js"' + '>' + '</scr' + 'ipt>');
}

这很好用,但主线程上的警告&#34;同步XMLHttpRequest因其对最终用户体验的不利影响而被弃用。最终用户的体验。&#34;让我思考。

然而,现在我改变了我的代码,只是说了

#include<set>
#include<iostream>
using namespace std;

int main(int argc, char** argv)
{
    set<int> A, B;
    A.insert(1);
    int n = atoi(argv[1]), i;
    for(i=1; A.find(n) == A.end(); i++) {
        for(auto& a : A) for(auto& b : A) B.insert(a + b);
        for(auto& c : B) A.insert(c);
    }
    cout << i << endl;
}

在我的模板上。

亲爱的javascript大师,这是一个可靠的解决方案吗?

1 个答案:

答案 0 :(得分:1)

在async javascript中使用onload属性

<script async src="siteScript.js" onload="window.MyInitialisation()"></script>

在javascript中它看起来像这样:

<script>
if(!window.jQuery)
{
   var script = document.createElement('script');
   script.type = "text/javascript";
   script.async = "async";
   script.defer = "defer";
   script.onload = function() {window.MyInitialisation()}
   script.src = "path/to/jQuery";
   document.getElementsByTagName('head')[0].appendChild(script);
}
</script>