2015-02-05 3 views
1

Демо: jsfiddleПочему MouseEnter событие срабатывает дважды в JavaScript

ЯШ:

var $item = $('.item'); 
var $img = $item.find('img'); 

var handler = function(event){ 
    console.log('fired'); 
    $img.remove(); // remove child 
}; 

var handlerRestore = function(){ 
    $item.append($img); 
}; 

/// double fired event on chrome, safari, firefox 
$('.item').mouseenter(handler); 
$('.item').mouseleave(handlerRestore); 

// one fired event on chrome, but double fired on firefox and safari 
//$('.item')[0].onmouseenter = handler; 
//$('.item')[0].onmouseleave = handlerRestore; 

HTML:

<div class="item"> 
    <img src="http://img.ifcdn.com/images/237b9b19a8cc0ea78a3b32b567423a4cd0acf77fb19b8c5a485325e2252a7b7a_1.jpg" /> 
</div> 

CSS:

.item { 
    background: #EFEFEF; 
    display: inline; 
    float: left; 
    height: 300px; 
    margin: 0 10px 80px 0; 
    position: relative; 
    width: 300px; 
    transition: opacity 0.6s ease; 
    -moz-box-sizing: border-box; 
    -webkit-box-sizing: border-box; 
    box-sizing: border-box; 
} 

.item img { 
    margin: auto; 
    max-height: 300px; 
    max-width: 300px; 
    position: absolute; 
    top: 0; 
    bottom: 0; 
    left: 0; 
    right: 0; 
} 

Вопросы:

  1. Почему событие срабатывает дважды?
  2. Почему native-event срабатывает один раз в хроме, но jquery-event срабатывает дважды в хроме?
  3. Как это исправить?

Firefox и сафари выпустили дважды родное событие и так jquery-event. Я думаю, что это неправильно.

+0

возможно дубликат [события MouseEnter называется дважды даже после stopPropagation] (http://stackoverflow.com/questions/6888590/mouseenter-event-called-twice-even-after- stoppropagation) – jazZRo

ответ

0

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

$('.item').on('mouseenter', 'img', handler); 

Updated fiddle

Другим способом обойти эту проблему, чтобы прикрепить событие только один раз в первый раз, и каждый раз, когда handleRestore() является называется.

var handlerRestore = function(){ 
    $item.one('mouseenter', handler); 
    console.log('restored'); 
    $item.append($img); 
}; 

$item.one('mouseenter', handler); 

Fiddle 2

+0

** Наш пример отличается **. Я слушаю mouseenter на «.item». Вы слушаете mouseenter на 'img'. Я использую делегат в реальном коде. Это простой пример. ** Наш пример отличается **. Я слушаю mouseenter на «.item». Вы слушаете mouseenter на 'img'. Я использую делегат в реальном коде. Это простой пример. – Alexpts

+0

Он срабатывает дважды, когда быстро нависает над div на img, потому что событие привязано к div и распространяется на img. Вот почему я думаю, что этот вопрос является дубликатом. – jazZRo

+0

Я не знаю, почему некоторые браузеры beahve таким образом. Но я добавил еще одно решение, чтобы обойти это. – jazZRo

0

.он() может быть решение для вашего problem.You может даже установить событие с «документ» .Как вы можете позвонить .он() функции на «документ» и установите любое событие, которое вы хотите.

Вот ссылка: http://www.w3docs.com/learn-javascript/javascript-events.html

+0

Я использую делегирование в реальном коде. Если вы также используете делегацию событие событие дважды. – Alexpts

Смежные вопросы