在jQuery element.data对象中存储javascript间隔?

时间:2010-08-03 18:12:56

标签: javascript jquery setinterval

我正在研究一个名为Smooth Div Scroll的jQuery插件(一个jQuery UI小部件),我需要存储对页面上每个插件实例特定的时间间隔的引用。如果我只写这样的东西:

var myInterval = setInterval(function() {  
    alert("Hi!");  
}, 100);

...变量 myInterval 实际上是 window.myInterval ,它将由页面上插件的所有实例共享。因此,当我尝试设置或清除实例的间隔时,将设置/清除所有实例的间隔,因为它们都引用相同的窗口变量。

通过jQuery API,我发现了方法.data,它用于存储与匹配元素相关的任意数据,并且因为插件的每个实例都有一个相应的DOM元素。完善!使用此方法,我可以存储特定于匹配元素的数据。所以我编写了这样的代码(其中el是对匹配元素的引用):

el.data("myInterval", setInterval(function() {  
    alert("Hi!");  
}, 100));

在某种程度上,这是有效的,因为插件的不同实例不再引用相同的变量(间隔)。但我注意到,如果我有一个包含2-3个插件实例的页面,并且我为每个实例设置了相同的间隔,则只有第一个实例开始其间隔。但是如果间隔的计时器很小,只有一些元素开始它们的间隔。

我没有对实际值进行任何深入挖掘,但是如果我在一个页面上有三个插件实例并且间隔设置为5,则像这样:

el.data("myInterval", setInterval(function() {  
    alert("Hi!");  
}, 5));

...只有第一个实例才会启动。如果我将它增加到20-30,则会启动其中两个实例,如果我将其进一步增加到50个,则所有三个实例都会启动。这太奇怪了?!

我的问题是这些:

存储对间隔的引用(使用.data)是一个好主意吗? 如果是这样,可能是间隔失败的原因是什么?

请帮我解决这个问题 - 我很难过! 如果您需要实际的源代码,请查看插件页面(此帖子顶部的链接)。

/ Thomas Kahn

2 个答案:

答案 0 :(得分:1)

setInterval和setTimeout的返回值只是内部用于引用超时的整数,因此使用.data存储整数不是问题。

答案 1 :(得分:0)

深入研究代码并对其进行了一些探讨,似乎问题与el.data中的间隔存储无关。间隔存储得很好。我怀疑问题与代码中以错误顺序执行的例程有关。正确的顺序应该是:

  1. 加载一大块HTML内容 (图像)使用jQuery的load()。
  2. 计算所有的总宽度 这些元素。
  3. 开始间隔 滚动这些想象力。
  4. 问题似乎是在使用jQuery加载通过AJAX加载内容之前/同时触发计算所有元素总宽度的例程。结果是,计算出的加载元素的总宽度为0(零),并且滚动例程将停止,因为滚动宽度为零的内容没有任何意义。