2009-04-19 2 views
21

У меня есть неупорядоченный список с событиями mouseover и mouseout, прикрепленными к элементам li. Каждый из них содержит ссылку, а в li есть бит. Когда я наводил курсор на li, событие mouseover запускается, но когда я наводил указатель мыши на ссылку , содержащую в личике мыши, события mouseover оба запускаются по порядку. Кажется, что дочерние элементы запускают свои родительские элементы мыши события ... как я могу остановить это? Я хочу, чтобы он просто оставался при наведении указателя мыши, когда мышь по ссылкам, не активируя анимацию каждый раз, когда я нажимаю на ссылку. Это мой код;Как игнорировать события мыши для дочерних элементов в jQuery?

jQuery(document).ready(function(){ 
     jQuery('#menu li ul').hide(); 
     jQuery('#menu li').mouseover(function() { 
      jQuery(this).children("ul").show('fast').stop; 
      return false; 
     }); 
     jQuery('#menu li').mouseout(function() { 
      jQuery(this).children("ul").hide('fast').stop; 
      return false; 
     }); 
}); 

<ul id="menu"> 
     <li><a href="">Some link</a> 
      <ul>Sub content</ul> 
     </li> 
</ul> 

ответ

34

Кажется, я нашел ответ на свой вопрос. Для тех, кто может иметь такую ​​же проблему; попробуйте этот код. Кажется, что наведите курсор на дочерние элементы, как это делают другие события мыши.

jQuery('#menu li').hover(
    function() { 
     jQuery(this).children('ul').show('fast'); 
     return false; 
    }, 
    function() { 
     jQuery(this).children('ul').hide('fast'); 
     return false; 
    } 
); 
+0

Работал отлично! Благодарю. – KyleFarris

+0

Отлично, спасибо вам за это! :-) – Andreas

1

Используйте классы css, чтобы различать различные уровни меню. Затем вы можете легко искать один класс или другой в своих селекторах jQuery.

+0

К сожалению, это было бы слишком сложно, так как это предназначено для использования с wordpress, которое вводит все это динамически, и довольно сложно фильтровать выход. –

12

Использование «событие stopPropagation().», Чтобы остановить событие от кипящих вверх:

jQuery('#menu li a').mouseover(function(evt) { 
     evt.stopPropagation(); 
     return false; 
    }); 
    jQuery('#menu li a').mouseout(function(evt) { 
     evt.stopPropagation(); 
     return false; 
    }); 

В качестве альтернативы использовать mouseenter и mouseleave события вместо наведения курсора/выхода. jQuery нормализует свое поведение в браузерах, и эти события имеют преимущество не пузыря ...

+0

Я уже пробовал это, и он, кажется, ничего не делает. Я также пытался использовать mouseenter и mouseleave, и они тоже ничего не делают. –

+0

Хорошо, я не был * совершенно * прав. Он удаляет курсор мыши из ссылки, но мышь вызывается из элемента li, а не ссылки, поэтому он просто мигает и закрывается снова, когда я пытаюсь навести курсор мыши на него. –

+0

Вышеупомянутое решение, предложенное самим Стивеном, выглядит более простым, но полезно, если вам нужно, чтобы обработчики действовали немного иначе. –

3

Вы можете попробовать это

$('#menu li').live('mouseenter mouseleave', function (e) { 
    if (e.type == 'mouseenter') { 
     //Show ul 
    } else { 
     //Hide ul 
    } 
}); 

Преимуществом является использование делегирования событий. Удачи!

12

Я искал equivelant поведение в JS, где в AS3 вы можете поставить:

object.mouseenabled = false; 

Как я обнаружил, что работает очень хорошо, чтобы использовать CSS и поставить:

.element { pointer-events: none; } 

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

+0

События указателя блестящие! Спасибо – Chris

+0

Такое элегантное решение. Благодаря! – Daniel

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