试图"保存" jQuery .load()回调的变量

时间:2012-06-17 09:50:26

标签: jquery

有没有办法在jQuery中“保存”变量?

我有一个.each()循环,用于更改sz [1]的值并为每个值触发.load()。但是,当我在回调函数中放置sz [1]时,它只使用sz [1]的最后记录值,而不是我最初调用.load()时的值。

$("#Big").find("a").each(function() {
  url = $(this).attr("href");
  pattern = new RegExp("sizes/([" + sizes + "])/$");
  otherPattern = new RegExp("sizes/([" + otherSizes + "])/$");
  sz = pattern.exec(url);
  if(sz) {
    normLink(sz[1], srcBase);
  } else {
    sz = otherPattern.exec(url);
    if(sz) {
      NotOkToDeLoad++;
      $("a#" + sz[1]).load(URL + sz[1] + " div#psp", function() { fixLink(sz[1]); });
    }
  }
});

sz [1]可以是“k”,“h”或“o”。但是,总是使用最后一个可能的值“o”调用fixLink()三次。

我目前的解决方法是为sz [1]的每个可能值写三个单独的.load(),但应该有一个更简单的方法。我忽略了什么吗?

4 个答案:

答案 0 :(得分:2)

使用var [MDN]

,习惯使变量本地
var pattern = new RegExp("sizes/([" + sizes + "])/$");
var otherPattern = new RegExp("sizes/([" + otherSizes + "])/$");
var sz = pattern.exec(url);

您的问题是sz(隐含地)全局,因此循环的每次迭代都会覆盖之前的值。

尽可能避免使用全局变量。像JSHint这样的工具会在隐式全局变量的情况下发出警告。

另请注意there is another problem when creating closures in a loop。它不适用于您的情况,因为您使用的是.each()而不是正常的for循环,但最好注意它。

答案 1 :(得分:0)

您可能正在使用sz关键字进行全局变量var

答案 2 :(得分:0)

使用闭包来节省价值(仅当你不能将sz变量设为本地时!):

$("a#" + sz[1]).load(URL+ ...., (function(val) { return function(){ fixLink(val); } })(sz[1]));

答案 3 :(得分:-1)

我不知道它是否可以提供帮助,但也许您可以将所需的变量存储在与该元素关联的$ .data()变量中...您可以阅读有关此here <的内容/ p>