Я пытаюсь использовать:
$('mydiv').delegate('hover', function() {
$('seconddiv').show();
}, function() {
//For some reason jQuery won't run this line of code
$('seconddiv').hide();
});
Я пытаюсь использовать:
$('mydiv').delegate('hover', function() {
$('seconddiv').show();
}, function() {
//For some reason jQuery won't run this line of code
$('seconddiv').hide();
});
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' );
});
С 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' );
});
.delegate()
не имеет дескриптора. Кроме того, вам нужно указать элемент, на который настроен таргетинг, с первым параметром.
Вы можете попробовать что-то вроде этого:
$('table').delegate('tr', 'hover', function() {
$(this).toggle();
});
ИЗМЕНИТЬ: дезинформация удалена.
Если вы хотите использовать метод hover()
без делегирования, рабочий код будет выглядеть так:
$('#mydiv').hover(function() {
$('#seconddiv').show();
}, function() {
$('#seconddiv').hide();
});
Во-вторых, delegate
- назначить обработчик события для ребенка, поэтому вам нужно сначала указать селектор. Если вам нужно убедиться, что этот обработчик событий существует для динамически добавленных элементов, я бы предпочел .live()
в этом случае mouseenter
и mouseleave
.
$('#mydiv').live('mouseenter', function() {
$('#seconddiv').show();
}).live('mouseleave', function() {
$('#seconddiv').hide();
});
Я знаю, что OP хотел решение delegate
(так было, когда я столкнулся с этим вопросом...)
Но после дальнейшего исследования я обнаружил, что его можно достичь одинаково без кода js/jquery вообще
Все, что вам нужно, это немного CSS
.someContainer .seconddiv{
display : none;
}
.someContainer:hover .seconddiv{
display : block;
}
INMO это гораздо более эффективное решение/