Проблема с пузырьками событий (я думаю ..!)

#jquery #event-bubbling

#jquery #событие-пузырьки

Вопрос:

У меня большой DIV # bigdiv. При наведении на него курсора я хочу, чтобы внутри большого div появлялся небольшой информативный DIV #info. Проблема: когда я навожу курсор мыши на #info (как только я заставил его появиться, наведя указатель мыши на #bigdiv), это заставляет его (#info) появляться и исчезать бесконечно. Вот мой код :

 jQuery('#bigdiv').live("hover", function(){ 
    jQuery("#info").toggle();
});
  

Обновить

Я попробовал решение mashappslabs (mouseenter / mouseleave), и я попробовал решение Ти Джея Краудера (не использовать live ()) : тот же результат.

В обоих случаях маленький div все еще появляется и исчезает навсегда.

Комментарии:

1. Можете ли вы опубликовать свой HTML-и css-код. Ваш код работает для меня. jsfiddle.net/ynhat/XZN5s

2. @YNhat: Да, это было бы полезно. 🙂 Я могу воспроизвести подобное поведение в примере, связанном с моим ответом, но только @glabus может сказать нам, такое ли поведение он / она видит.

3. @dandan @glabus: тогда какая-то другая часть вашего кода работает неправильно, этот пример, который я опубликовал для вас, работает jsfiddle.net/2aCJ2 , посмотрите на код, в котором сочетаются CSS, HTML и jQuery, и, возможно, опубликуйте здесь больше вашего кода, если вам нужна дополнительная помощь. Приветствия.

Ответ №1:

Похоже, что это незначительная ошибка в live версии hover . Сравните этот пример, используя live , с этим, использующим фактически включенный обработчик событий bigdiv (счетчик есть, чтобы мы знали, когда что-то меняется). Проблема заключается в том, что вы перемещаете мышь в info div (слово «info») и из него (все еще внутри bigdiv ). Таким образом, ответ может заключаться в том, чтобы не использовать live , хотя я предполагаю, что у вас есть причина для использования live , и поэтому это может быть неудобно.

Возможно, вы знаете, что hover это в основном просто комбинация mouseenter и mouseleave (которые являются специфичными для IE событиями, но jQuery эмулирует их в браузерах, которые их не предоставляют). Но mouseenter и mouseleave не пузырятся; это часть того, почему они полезны. Однако связанные (и не зависящие от IE) пузырьки mouseover и mouseout событий, так что, похоже, это может быть, являются ошибкой в mouseenter / mouseleave эмуляции, специфичной для делегированной обработки. (Редактировать: В частности, ошибка # 9069, о которой уже сообщалось и над которой активно работают.)

Комментарии:

1. Какой браузер вы используете? Оба примера отлично работают для меня (FF 4.0.1, Linux)

2. @nico: Обязательно наведите курсор мыши на слово info и снова выведите (но все еще в пределах поля). Я пробовал Chrome 10, Firefox 3.6, Opera 11 в Linux и IE6 и IE7 в Windows.

3. @T.J. Crowder: хорошо, теперь я вижу проблему. Я неправильно понял исходный вопрос.

4. @nico: Возможно . Пока / если @glabus не вернется, мы действительно не знаем. 🙂

5. @TJCrowder: у меня сложилось впечатление, что он говорил, что маленький div продолжает появляться и исчезать навсегда. Тем не менее, вы все равно нашли интересную ошибку 😉

Ответ №2:

@glabus

сделайте позицию #info абсолютной

 #info{
position:absolute;
top: 20px;
left:40px;
}
  

вы также можете динамически устанавливать top и left с помощью jquery.css

Комментарии:

1. Он не должен был этого делать.

2. … и в моем примере я этого не делаю. 🙂

Ответ №3:

Используйте mouseenter и mouseleave, проверьте рабочий пример наhttp://jsfiddle.net/2aCJ2 / и вот код: CSS:

 #big {width: 500px; height:500px; border: 1px solid #ccc; padding: 10px;}
#info {display: none; border: 2px solid #ddd;}
  

HTML:

 <div id="big">
 <div id="info">
    <p>Hello I'm visible</p>
 </div>
</div>    
  

jQuery:

 $("#big")
.mouseenter(function(e) {
    $("#info").show();
})
.mouseleave(function(e) {
    $("#info").hide();
});
  

Надеюсь, это поможет. Приветствия