2013-07-26 75 views
0

我遇到了jQuery的.filter方法的問題。我的代碼如下(嚴重剝離不相關的位)。jQuery「過濾器」沒有更新後刪除項目

(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標籤的底部。這是第一次,但對於後續的迭代,LI項目(以前是第一個)移動到UL標記的末尾,而不是。看起來.filter(':eq(0)')不斷引用曾經是第一項的內容,而不是引用「當前」第一個LI項。

我該如何解決這個問題?

感謝

+0

你只是傳遞相同的集合,所以除非你再次從DOM獲取元素,你怎麼能期望同樣的舊元素集合進行更新。 – adeneo

回答

2

這個問題似乎是一組base.$items不是現場設置,這意味着即使你改變DOM項目的順序設定是不知道這件事

嘗試

base.animate = function() { 
     base.$items.filter(':eq(0)').appendTo(base.$el.find('ul')); 
     base.$items = base.$el.find(' ul > li'); 
    } 
+0

這麼簡單,當然,它的工作原理。謝謝你的幫助 – Typhoon101

2

的問題是,你選擇你的初始化函數的相關項目:

base.$items = base.$el.find(' ul > li'); 

base。$ items現在是一個不再改變的jquery對象。 每次計時器「滴答」時,您都必須執行該代碼。