带有livequery的JQuery getScript - 异步执行会抛弃我的结果

时间:2012-11-07 08:59:24

标签: jquery asynchronous livequery getscript

我们有一个“实用程序”js函数,它包含在我们站点的几个js文件中,因此为了减少代码重复,我们将其移动到实用程序文件并修改所有js文件以加载它,然后将其与{{1一起使用}}。这在大多数情况下都有效,但是使用livequery的一段代码我会遇到错误。

我在需要使用新功能的地方成功使用的代码:

getScript

之前的代码:

$.getScript("js/utilities.js", function(){
   ... use parseQueryString function ....
});

基本上,每当一个具有“预览”类的元素出现在场景中时,我们想要解析rel属性并用新解析的字符串替换它。

以下代码:

$('.preview')
    .livequery(function(){
            $(this).attr('rel','myPage.cfm?' + parseQueryString($(this).attr('rel')));
        });

问题是,在执行$('.preview') .livequery(function(){ var preview = $(this); // load utilities.js so that we can access the parseQueryString function $.getScript("js/utilities.js", function(){ preview.attr('rel','myPage.cfm?' + parseQueryString(preview.attr('rel'))); }); }) 调用的回调之前,这似乎是继续$('.preview').livequery循环的下一次迭代。因此,在我们用适当的值替换其rel属性之前,getScript变量会被重置。如何才能正确执行?

2 个答案:

答案 0 :(得分:0)

我认为你在标题中命名了问题:)“异步”正是原因 - 加载实用程序已打开,因为请求将被执行并且执行将继续进行。如果更多匹配则输入另一个livequery回调可用。坦率地说,我认为将一个脚本加载到一个将循环多次的函数中是非常糟糕的 - 这有点毫无意义。我认为没有理由不像普通脚本那样包含它:

<script src="js/utilities.js" type="text/javascript"></script>

我认为这是最简单,最合理的解决方案。 但是,如果由于某种原因确实无法使用它,要么通过上下文确保变量的本地副本(请参阅$.ajax context option,因为getScript是一个$ .ajax快捷方式,它也应该有它)或尝试同步ajax ...最后一个是一个选项,但请不要在这种情况下尝试:)

答案 1 :(得分:0)

我想出的解决方法似乎正在工作......围绕livequery循环调用getScript:

 // load utilities.js so that we can access the parseQueryString function
$.getScript("js/utilities.js", function(){
    $('.preview')
        .livequery(function(){
            $(this).attr('rel','myPage.cfm?' + parseQueryString($(this).attr('rel')));
        })
});