2015-06-25 2 views
0

У меня есть пара функций jQuery с похожим синтаксисом.Как петля в jQuery

$("#item-1").hover(function(){ 
    $(".item-1").animate({opacity:1},"slow"); 
},function(){ 
    $(".item-1").animate({opacity:0},"slow"); 
}); 

$("#item-2").hover(function(){ 
    $(".item-2").animate({opacity:1},"slow"); 
},function(){ 
    $(".item-2").animate({opacity:0},"slow"); 
}); 

$("#item-3").hover(function(){ 
    $(".item-3").animate({opacity:1},"slow"); 
},function(){ 
    $(".item-3").animate({opacity:0},"slow"); 
}); 

Мой вопрос в том, как сократить мой код с помощью цикла. Я попытался следующие, но это не сработало:

for (i = 1; i <= 3; ++i) { 

    $("#item-" + i).hover(function(){ 
    $(".item-" + i).animate({opacity:1},"slow"); 
    },function(){ 
    $(".item-" + i).animate({opacity:0},"slow"); 
    }); 

} 
+0

Ваша петля должна работать правильно ... – Nico

+0

Возможно, вы могли бы показать HTML? – Nico

+0

Не так. Помимо подхода, его ошибка заключается в использовании селектора классов внутри. – Skatch

ответ

1

Это должно работать:

for (i = 1; i <= 3; ++i) { 
    (function(index){ 
    $("#item-" + index).hover(function(){ 
     $(".item-" + index).animate({opacity:1},"slow"); 
    },function(){ 
     $(".item-" + index).animate({opacity:0},"slow"); 
    }); 
    })(i); 
} 

Проблемы с циклом является то, что переменный я не захвачена функцией парения. При этом переменная i будет захвачена должным образом.

3

Положите универсальный класс item ко всем элементам, а затем просто вызвать функцию для всех элементов:

$(".item").hover(function(){ 
    $(this).animate({opacity:1},"slow"); 
},function(){ 
    $(this).animate({opacity:0},"slow"); 
}); 
+0

I я не говорю, что это неправильно, но что, если нет необходимости в классном простом решении, нужно использовать несколько селекторов ... –

+0

Конечно, но всегда полезно группировать свои вещи с аналогичными свойствами. – Skatch

4

попробовать может работать для вас

$("#item-1, #item-2, #item-3").hover(function(){ 
    $(this).animate({opacity:1},"slow"); 
},function(){ 
    $(this).animate({opacity:0},"slow"); 
}); 
1

добавить класс к вашему пункту, чтобы выбрать их, и сделать это

$(".item").hover(function(){ 
    $(this).animate({opacity:1},"slow"); 
    },function(){ 
    $(this).animate({opacity:0},"slow"); 
    }); 
5

Вы могли бы вы селектор JQuery в attributeStartsWith

Описание: Выбор элементов, которые имеют указанный атрибут со значением , начиная именно с данной строкой.

Ниже будет работать, если у вас есть классы .item-х элементов:

$('[id^="item-"]').hover(function(){ 
    $("."+this.id).animate({opacity:1},"slow"); 
},function(){ 
    $("."+this.id).animate({opacity:0},"slow"); 
}); 

В противном случае в моем предложении вы могли бы сделать это:

$('[id^="item-"]').hover(function(){ 
    $(this).animate({opacity:1},"slow"); 
},function(){ 
    $(this).animate({opacity:0},"slow"); 
}); 
+0

Исправьте селектор «#» + this.id, и я дам вам это преимущество. : D – Skatch

+0

Но я сделал по его вопросу, иначе я мог бы это сделать $ (this) .animate .... –

+0

Я знаю, но его вопрос испорчен :) – Skatch

1

Если ваш HTML похож на ниже,

<div class="item-class" id="item-1"> 
    <div class="item-sub-class"></div> 
</div> 
<div class="item-class" id="item-2"> 
    <div class="item-sub-class"></div> 
</div> 
<div class="item-class" id="item-3"> 
    <div class="item-sub-class"></div> 
</div> 

Вместо id использовать класс

$(".item-class").hover(function(){ 
    $(this).find('.item-sub-class').animate({opacity:1},"slow"); 
},function(){ 
    $(this).find('.item-sub-class').animate({opacity:0},"slow"); 
}); 
Смежные вопросы