0

我在通过脚本标签插入的页面上有一个javascript文件(initial.js),如下所示:

<script src="initial.js"></script> 

该文件创建 dom 元素(假设是两个链接)并通过 jQuery ajax 方法异步加载另一个 jQuery 插件(plugin.js)。单击这两个链接会弹出一个来自 jQuery 插件(plugin.js)的模块。

然后修改 javascript 文件(initial.js)以通过 jQuery ajax 而不是通过脚本标记在页面上异步加载。这导致一些事件没有间歇性地附加到链接,这导致插件没有被调用。

我相信浏览器正在按自己的顺序加载异步脚本,因此链接无法间歇性地启动插件。使用此新设置解决此问题的任何指示?

4

2 回答 2

0

您过去可能尝试过这样的事情:

var output;
$.get('data.php',function(data){
    output=data;
});
alert(output);

您将收到一个未定义的错误,因为 Javascript 在移动到下一个代码之前不会等待返回 AJAX 调用。

脚本也是如此。如果您对多个脚本进行多次调用,您可能会以最快的速度返回最小的那个,并执行该脚本。如果您加载一个 10kb 的脚本,然后加载一个 1kb 的脚本,则 1kb 脚本可能会以最快的速度返回然后执行,即使它是在 10kb 脚本之后调用的。

要纠正这个问题,您可以创建一个队列系统,然后仅在加载前一个脚本后加载每个脚本:

var scripts=['script1.js','script2.js','script3.js'];

$(document).ready(function(){
    loadScript();
});

function loadScript(){
    if(sendQueue.length==0)
        return;
    $.getScript(scripts[0],function(){
        scripts=scripts.slice(1);
        loadScript();
    });
}

但是,如果您从脚本中加载脚本......非常类似于 Inception,那么这仍然可能无法正常工作。

于 2012-11-05T22:19:54.387 回答
0

在高层次上,我认为你需要研究一下require.js 之类的东西。或者,您可以查看一些 jQuery 事件处理代码,它允许您侦听调用的加载事件,这可以帮助您确定在加载下一个脚本之前何时加载一个脚本。

于 2012-11-05T22:08:42.030 回答