Имеет ли jQuery ручку для .delegate('hover')?

Я пытаюсь использовать:

$('mydiv').delegate('hover', function() {  
    $('seconddiv').show();  
}, function() {  
    //For some reason jQuery won't run this line of code  
    $('seconddiv').hide();  
});

Ответ 1

User113716 отличный ответ больше не будет работать в jQuery 1.9 +, потому что псевдо-событие hover больше не поддерживается (руководство по обновлению).

Кроме того, поскольку jQuery 3.0 delegate() для привязки событий официально устарел, используйте, пожалуйста, новый on() (docs) для всех целей привязки событий.

Вы можете легко перенести решение user113716, заменив hover на mouseenter mouseleave и перейдя к синтаксису on():

$('mydiv').on('mouseenter mouseleave', 'seconddiv', function(event) {
    $(this).toggle( event.type === 'mouseenter' );  
});

Если ваша проблема сложнее простого toggle, я предлагаю привязать два отдельных события:

$('mydiv').on('mouseenter', 'seconddiv', function( event ) {
    // do something
}).on('mouseleave', 'seconddiv', function( event ) {
    // do something different
});

NB: Так как hover был удален в v1.9 и on() был введен в v1.7, нет реальной потребности в решении с использованием delegate() - но если вам нравится это почему-то; он все еще существует (пока) и выполняет задание:

$('mydiv').delegate('seconddiv','mouseenter mouseleave', function(event) {
    $(this).toggle( event.type === 'mouseenter' );  
});

Ответ 2

С delegate() (docs) вы назначаете его контейнеру, а первый аргумент - это элемент, который должен инициировать событие.

Кроме того, .delegate() принимает только одну функцию, поэтому для события hover вам нужно проверить event.type, чтобы определить show() (docs) или hide() (docs).

$('.someContainer').delegate('.someTarget','hover', function( event ) {
    if( event.type === 'mouseenter' )  
        $('seconddiv').show();  
    else
        $('seconddiv').hide();  
});

Для show/hide более короткий способ написать это - использовать toggle() (docs), который может принимать аргумент switch, где true означает show и false означает hide:

$('.someContainer').delegate('.someTarget','hover', function( event ) {
    $('seconddiv').toggle( event.type === 'mouseenter' );  
});

Обратите внимание, что событие mouseenter отображается как jQuery 1.4.3. Если вы используете 1.4.2, он будет отображаться как mouseover.


EDIT:

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

$('mydiv').delegate('seconddiv','hover', function( event ) {
    $(this).toggle( event.type === 'mouseenter' );  
});

Ответ 3

.delegate() не имеет дескриптора. Кроме того, вам нужно указать элемент, на который настроен таргетинг, с первым параметром.

Вы можете попробовать что-то вроде этого:

$('table').delegate('tr', 'hover', function() {  
    $(this).toggle();
});

Ответ 4

ИЗМЕНИТЬ: дезинформация удалена.

Если вы хотите использовать метод hover() без делегирования, рабочий код будет выглядеть так:

$('#mydiv').hover(function() {  
    $('#seconddiv').show();  
}, function() {  
    $('#seconddiv').hide();  
});

Во-вторых, delegate - назначить обработчик события для ребенка, поэтому вам нужно сначала указать селектор. Если вам нужно убедиться, что этот обработчик событий существует для динамически добавленных элементов, я бы предпочел .live() в этом случае mouseenter и mouseleave.

$('#mydiv').live('mouseenter', function() {  
    $('#seconddiv').show();  
}).live('mouseleave', function() {  
    $('#seconddiv').hide();  
});

Ответ 5

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

Но после дальнейшего исследования я обнаружил, что его можно достичь одинаково без кода js/jquery вообще

Все, что вам нужно, это немного CSS

.someContainer .seconddiv{
    display : none;
}

.someContainer:hover .seconddiv{
    display : block;
}

INMO это гораздо более эффективное решение/