我遇到了jQuery的.filter方法的问题。我的代码如下(严重剥离了不相关的位)。
(function($) {
$.ticker = function( el, options ) {
// to avoid scope issues, use 'base' instead of 'this'
var o, base = this;
base.el = el;
base.$el = $(el);
base.init = function() {
base.options = o = $.extend( {}, $.ticker.defaultOptions, options );
base.$items = base.$el.find(' ul > li');
base.timer = null;
base.startTimer();
}
base.animate = function( ) {
base.$items.filter(':eq(0)').appendTo(base.$el.find('ul'));
}
// initialise the object
base.init();
};
$.ticker.defaultOptions = {
delay: 2000,
transitionSpeed: 700
}
$.fn.ticker = function(options) {
return this.each(function() {
(new $.ticker(this, options))
})
}
})(jQuery);
我期望这样做,每2秒,“base.animate”函数会将第一个LI项目从UL标记的顶部移动到底部。这是第一次使用,但是对于后续迭代, last LI项(以前是第一个)将被移动到UL标记的末尾。似乎 .filter(':eq(0)')经常引用过去的第一个项目,而不是引用“当前”第一个LI项目。
我怎样才能解决这个问题?
由于
答案 0 :(得分:2)
问题似乎是集合base.$items
不是实时集合,这意味着即使您更改了dom中的项目顺序,集合也不知道它
尝试
base.animate = function( ) {
base.$items.filter(':eq(0)').appendTo(base.$el.find('ul'));
base.$items = base.$el.find(' ul > li');
}
答案 1 :(得分:2)
问题是您在init函数中选择了相关项:
base.$items = base.$el.find(' ul > li');
base。$ items现在是一个不再改变的jquery对象。 每次定时器“滴答”时,您都必须执行该代码。