userAlexander
@userAlexander
Верстка наше все)

.mouseout + setTimeout в .click, почему сразу после .click срабатывает событие .mouseout?

Ссылка на фиддл

Пример кода тут:
<div class="th">
    <div class="overlay"></div>
</div>

$('.overlay').click(function(){
	var thisParent = $(this).parent('.th');
	thisParent.addClass('th-active');
	thisParent.mouseout(function(){
		setTimeout(function(){
			thisParent.removeClass('th-active');
		}, 1000);
	});
});


Почему сразу после .click если не выводить курсор за элемент срабатывает событие .mouseout ?
  • Вопрос задан
  • 635 просмотров
Решения вопроса 1
1. overlay внутри th

2. Исходя из кода внутренний блок убегает вниз на всю высоту родителя
thisParent.addClass('th-active');
.th-active .overlay{
    transform:translateY(100%);
}

Примечание
Попробуйте установить 50% и при первом клике держите курсор выше мнимой 50% линией, потом кликните ниже.

3. Открываем документацию
The mouseout event is fired when a pointing device (usually a mouse) is moved off the element that has the listener attached or off one of its children.

Пробуем перевести и оказывается, что событие зажигается не только при уходе с блока с классом th.

Mouseout активируется, когда указатель мыши входит или выходит в/из дочерний(го) элемент(а), в то время как mouseleave этого не делает.

Интересное сравнение mouseout и mouseleave

Вывод: используйте mouseleave

Дополнение к комментарию
Насчет случая с hover в вашем примере нет ничего удивительного, если посмотреть исходники jquery
jQuery.fn.extend({
	hover: function( fnOver, fnOut ) {
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
	},

То есть mouseleave в любом случае получит обработчик, но при отсутствии fnOut вызовется повторно ваша первая функция.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AndreyMyagkov
сотый раз напишу
click - устаревший метод, используйте .on('click'....)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы