Does jQuery have a handleout for .delegate('hover')?
I a开发者_运维技巧m trying to use:
$('mydiv').delegate('hover', function() {
$('seconddiv').show();
}, function() {
//For some reason jQuery won't run this line of code
$('seconddiv').hide();
});
User113716's great answer will no longer work in jQuery 1.9+, because the pseudo-event hover
is no longer supported (upgrade guide).
Also since jQuery 3.0 delegate()
for binding events is officially deprecated, so please use the new on()
(docs) for all event binding purposes.
You can easily migrate user113716's solution by replacing hover
with mouseenter mouseleave
and switching to the on()
syntax:
$('mydiv').on('mouseenter mouseleave', 'seconddiv', function(event) {
$(this).toggle( event.type === 'mouseenter' );
});
If your problem is more complex than a simple toggle
, I suggest binding two separate events:
$('mydiv').on('mouseenter', 'seconddiv', function( event ) {
// do something
}).on('mouseleave', 'seconddiv', function( event ) {
// do something different
});
NB: Since hover
was removed in v1.9 and on()
was introduced in v1.7, there is no real need for a solution using delegate()
- but if you like it for some reason; it is still there (for now) and does the job:
$('mydiv').delegate('seconddiv','mouseenter mouseleave', function(event) {
$(this).toggle( event.type === 'mouseenter' );
});
With delegate()
(docs) , you assign it to a container, and the first argument is the element that should trigger the event.
Also, .delegate()
accepts only one function, so for the hover
event you need to test the event.type
to determine show()
(docs) or hide()
(docs) .
$('.someContainer').delegate('.someTarget','hover', function( event ) {
if( event.type === 'mouseenter' )
$('seconddiv').show();
else
$('seconddiv').hide();
});
For show/hide, a shorter way to write this is to use toggle()
(docs), which can accept a switch argument where true
means show
and false
means hide
:
$('.someContainer').delegate('.someTarget','hover', function( event ) {
$('seconddiv').toggle( event.type === 'mouseenter' );
});
Note that the mouseenter
event is reported as of jQuery 1.4.3
. If you're using 1.4.2
, it will be reported as mouseover
.
EDIT:
If I'm understanding your comments below, you'd have something like this (using the proper selectors of course).
$('mydiv').delegate('seconddiv','hover', function( event ) {
$(this).toggle( event.type === 'mouseenter' );
});
I know the OP wanted a delegate
solution (so was I when I bumped into this question...)
But after further investigation I found out its possible to achieve the same without js/jquery code at all
All you need is a bit of CSS
.someContainer .seconddiv{
display : none;
}
.someContainer:hover .seconddiv{
display : block;
}
INMO it a much more efficient/ligthwheigth solution
.delegate()
does not have a handle out. Also, you need the specify the element you are targeting with the first parameter.
You could try something like this, however:
$('table').delegate('tr', 'hover', function() {
$(this).toggle();
});
EDIT: misinformation removed.
If you want to use the hover()
method without delegation, working code would look like this:
$('#mydiv').hover(function() {
$('#seconddiv').show();
}, function() {
$('#seconddiv').hide();
});
Second of all, delegate
is to assign an event handler to a child, so you need to specify a selector first. If you need to make sure this event handler exists for dynamically added elements, I would prefer .live()
in this case with mouseenter
and mouseleave
.
$('#mydiv').live('mouseenter', function() {
$('#seconddiv').show();
}).live('mouseleave', function() {
$('#seconddiv').hide();
});
精彩评论