我正在研究一个名为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
答案 0 :(得分:1)
setInterval和setTimeout的返回值只是内部用于引用超时的整数,因此使用.data存储整数不是问题。
答案 1 :(得分:0)
深入研究代码并对其进行了一些探讨,似乎问题与el.data中的间隔存储无关。间隔存储得很好。我怀疑问题与代码中以错误顺序执行的例程有关。正确的顺序应该是:
问题似乎是在使用jQuery加载通过AJAX加载内容之前/同时触发计算所有元素总宽度的例程。结果是,计算出的加载元素的总宽度为0(零),并且滚动例程将停止,因为滚动宽度为零的内容没有任何意义。