我们有一个“实用程序”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
变量会被重置。如何才能正确执行?
答案 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')));
})
});