0

我正在使用以下代码循环一组元素。

$(this).next().show().animate({top: '25px'},250,function(){
                $(this).addClass('active');
            });

但这很有限,因为我需要到达元素列表的末尾,然后再次循环,所以我写了这个插件:

(function($){
    $.fn.extend({
        rotater: function(class_check){
            return this.each(function(){
                if($(this).next().hasClass(class_check)){

                    return $(this).next();
                } else {

                    return $(this).parent().children().first();
                }
            });
        }
    });
})(jQuery);

为了检测我何时到达了我想要的集合的末尾(它们都共享一个公共类),如果是这样,请抓住第一个对象以再次开始整个循环。

我将调用代码更改为:

$(this).rotater('common_class').show().animate({top: '25px'},250,function(){
                $(this).addClass('active');
            }); 

但它已经完全停止工作了!!我很困惑,如果我的“返回开始”脚本失败了,我可以理解,但至少第一个周期的行为应该完全一样next(),因为我实际上是在返回next().

我的 html 看起来像:

<div id="parent>
  <div class="common_class"></div>
  <div class="common_class"></div>
  <div class="common_class"></div>
  <div class="common_class"></div>
  <div class="undesired_elemement"></div>
</div>
4

1 回答 1

4

each 回调中的返回无效。你的 rotator 函数返回任何each返回,这不是回调返回的,但它会this再次返回。

解决方案:不要使用each

(function($){
    $.fn.extend.rotater = function(class_check){
        if(this.next().hasClass(class_check)){
            return this.next();
        else {
            return this.parent().children().first();
        }
    }
})(jQuery);

this.each仅当您要将功能应用于选择器选择的所有元素时才需要使用。

如果选择了多个元素,您可能会遇到奇怪的行为。在这种情况下,您应该明确选择第一个元素:

var ele = this.eq(0);
于 2011-06-24T14:31:59.917 回答