从setInterval中检索jQuery.data()值

时间:2011-09-18 05:14:20

标签: javascript jquery

我一直坚持这个问题一段时间了。我正在使用jQuery的.data()方法将状态存储在我正在编写的插件中。除了当我尝试从setInterval块中检索这些数据值时,一切正常。我能够在setInterval块中看到jQuery对象,但是我无法看到data()方法存储的值。

tminusStart: function() {
  return this.each(function() {
    var $tminus = $(this).data("tminus.state", "running");

    var intervalId = setInterval(function(tm) {
      if ($tminus.tminusIsRunning()) {
        $tminus.tminusDecrementCounter();

        $tminus.data("tminus.settings").tick_event();

        if ($tminus.tminusTimeRemaining() <= 0) {
          $tminus.data("tminus.settings").expiration_event();
        }

        $tminus.text(tminus.tminusTimeRemaining);
      }
      else {
        clearInterval(intervalId);
      }
    }, 1000, $tminus);
  });
}

在上面的代码中,$ tminus确实返回了jQuery对象,但对函数的调用 - 调用.data()方法 - 返回undefined; .data(“tminus.settings”)调用也是如此。

任何有助于理解为什么.data()在这里不起作用的帮助将不胜感激。

重写删除功能:

tminusStart: function() {
  var tminus = this;
  tminus.data("tminus.state", "running");

  return this.each(function() {
    console.log(tminus.data("tminus.state")); // "running"
    var intervalId = setInterval(function() {
      console.log(tminus.data("tminus.state")); // undefined
    }, 1000);
  });
}

我需要知道为什么它在setInterval块中未定义

3 个答案:

答案 0 :(得分:0)

什么是tminusIsRunningtminusDecrementCounter?你的意思是在$tminus下打电话吗?除非您正在扩展jQuery,否则这些调用将会出错。如果您使用的是Chrome,请检查Javascript控制台,您应该会看到以下内容:“未捕获的TypeError:对象[对象对象]没有方法'tminusIsRunning'”

答案 1 :(得分:0)

.data()不适用于xhtml + IE(请参阅note in docs)。

或者,这看起来像一个jQ扩展,所以要小心。 jQuery有一个(IMO)坏习惯,在整个地方混淆this。确保您不依赖于this与其不同的东西。我建议安装firebug并使用console.log在您设置值的位置以及访问它的位置记录this。如果它不是IE问题,我怀疑这会找到它。

答案 2 :(得分:0)

终于明白了。我正在使用jasmine来测试驱动器,而jasmine-jquery库有一个装夹件,我显然没有正确使用。我在网页上测试了代码,现在一切都按计划进行。现在我只需要确保我的所有测试都通过了。

我不会接受我自己的回答,因为我没有提供必要的信息。我感谢大家的时间。我真的希望我能接受别人的回答。