删除项后jQuery“过滤器”不更新

时间:2013-07-26 11:38:37

标签: jquery filter

我遇到了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项目。

我怎样才能解决这个问题?

由于

2 个答案:

答案 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对象。 每次定时器“滴答”时,您都必须执行该代码。