jquery removeClass 'работает', но эффекты класса продолжаются
Во-первых, помните, что я новичок в веб-дизайне, JS и во всем этом, пожалуйста. Любое предложение будет оценено:) У меня есть значки img (serviceIcon), расположенные "абсолютно" в соответствии с их конкретным классом (serviceHardware,...).
<div class="servicesBox">
<img class="serviceIcon serviceHardware" />
<img class="serviceIcon serviceSoftware" />
<img class="serviceIcon serviceNetwork" />
</div>
Все просто: при наведении курсора на непрозрачные элементы изменяется непрозрачность, а при наведении размер изменяется; mouseleave оживляет все до их прежнего состояния; щелчок анимирует IMG, на который нажали, в угол, СЛЕДУЕТ удалить класс serviceIcon (чтобы не вызывать mouseover/mouseleave, верно?) и переместиться вниз (в примере) на img без щелчка, и добавить класс serviceSelected к элементу, на который нажали.
$("img.serviceIcon").click(function(){
$("img.serviceIcon").not(this)
.animate({
top:'45px',
});
$(this).removeClass("serviceIcon")
.animate({
left:'150px'
}, 300, function(){
origLeft = $(this).css('left');
$(this).addClass("serviceSelected");
//alert(origLeft);
});
});
НО, как вы можете видеть прямо здесь ( http://jsfiddle.net/rcvmQ/4/), нажатый img продолжает вызывать события mouseover/mouseleave, соответствующие классу serviceIcon (уже удаленный при нажатии), и если вы осмотрите элемент, вы увидите видите, у него больше нет класса serviceIcon. Что я здесь не так делаю? Может быть все? ИДК.
На самом деле, он добавляет класс serviceSelected, но если вы щелкнете по нему, то никогда не вызовет событие click этого класса. Weird. Я протестировал это в Firefox и Safari, и оба ведут себя одинаково.
Я добавил дополнительную проверку кода проверки в событии click serviceItem, имеет ли он класс serviceSelected, который вообще НЕ является ЛОГИЧЕСКИМ. Я отказываюсь использовать это, даже если это работает!! Спасибо!
Редактировать: Код о наведении курсора / mouseleave
$("img.serviceIcon").mouseover(function(){
$(".serviceIcon").not(this)
.animate({
opacity:'0.3'
}, 100);
$(this).animate({
width :'25px',
height :'40px',
opacity :1
},200);
});
$("img.serviceIcon").mouseleave(function(){
$("img.serviceIcon").stop(true,true)
.animate({
width :'20px',
height :'40px',
opacity :'1'
},100);
});
2 ответа
Уберите mouseover
событие
$(this).off('mouseover').removeClass("serviceIcon")
.animate({
left:'150px'
},300, function(){
origLeft = $(this).css('left');
$(this).addClass("serviceSelected");
//alert(origLeft);
});
Прочитав о.on() и.off(), я внес некоторые изменения в код, и он, похоже, работает. Я создал 2 функции:
function clickIcon(){ ... }
function restoreIcons(){ ... }
По сути, они содержат код для события click для классов serviceIcon и serviceSelected. Как вы показали мне, я отключаю событие click, когда щелкаю serviceIcon, отсоединяю его, а затем включаю (связываю) событие click для класса serviceSelected, обрабатываемого функцией restoreIcons().
function clickIcon(){
leftPos = $(this).css('left');
//alert(leftPos);
$("img.serviceIcon").not(this)
.animate({
top :'80px',
});
//turning off 'click' for serviceIcon
$(this).off('click').removeClass("serviceIcon")
.animate({
left:'300px'
},200, function(){
$(this).addClass("serviceSelected");
// turning on 'click' for serviceSelected
$('img.serviceSelected').on('click',restoreIcons);
});
}
Внутри функции restoreIcon я отключил событие "click" для serviceSelected и снова включил событие "click" для serviceIcon (обрабатывается clickIcon()).
function restoreIcons(){
$(this).animate({
left :leftPos
},200, function(){
$(this).off('click')
.removeClass('serviceSelected')
.addClass('serviceIcon');
$('img.serviceIcon').animate({
top:'0px'
},100);
$('img.serviceIcon').on('click', clickIcon);
});
}
Вы можете увидеть полный код здесь ( http://jsfiddle.net/rcvmQ/9/).
Это работает отлично, по крайней мере, при первом нажатии на каждый значок. После этого я замечаю серьезную задержку, если я начинаю нажимать на них несколько раз, и каждый раз становится длиннее. Для меня, похоже, время для обработки включения и выключения, может быть? Другая вещь, о которой я думаю, может состоять в том, что я не отменил события mouseenter/mouseleave, так что, может быть, это происходит одновременно. Любые предложения?