我正在尝试使用:
$('mydiv').delegate('hover', function() {
$('seconddiv').show();
}, function() {
//For some reason jQuery won't run this line of code
$('seconddiv').hide();
});
jQuery 1.9+ 不再支持伪事件hover
,因此 User113716 的好答案将不再奏效(升级指南)。
另外自从jQuery 3.0 正式弃用了delegate()
绑定事件,因此请使用新的on()
(文档)进行所有事件绑定。
您可以通过将hover
替换为mouseenter mouseleave
并切换到on()
语法来轻松迁移User113716的解决方案:
$('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:自从v1.9中删除了hover
并在v1.7中引入了on()
,因此没有必要使用delegate()
来解决问题。但如果出于某种原因您喜欢它,它仍然存在(目前)。
$('mydiv').delegate('seconddiv','mouseenter mouseleave', function(event) {
$(this).toggle( event.type === 'mouseenter' );
});
on
绑定两个事件。 - Chris Abramsdelegate()
在3.0中已被弃用 https://jquery.com/upgrade-guide/3.0/#breaking-change-on-quot-ready-quot-fn-removed - Callatdelegate()
(文档),你可以将其分配给一个容器元素,并将第一个参数设置为应该触发事件的元素。
此外,.delegate()
只接受一个函数作为参数,因此对于 hover
事件,你需要测试 event.type
来确定是使用 show()
(文档) 还是使用 hide()
(文档)。
$('.someContainer').delegate('.someTarget','hover', function( event ) {
if( event.type === 'mouseenter' )
$('seconddiv').show();
else
$('seconddiv').hide();
});
实现显示/隐藏,更短的写法是使用 toggle()
(文档),它可以接受一个 switch 参数,其中 true
表示 show
,false
表示 hide
:
$('.someContainer').delegate('.someTarget','hover', function( event ) {
$('seconddiv').toggle( event.type === 'mouseenter' );
});
注意,`mouseenter`事件在`jQuery1.4.3`以上版本中才被支持。如果你正在使用`1.4.2`,则会作为`mouseover`事件进行报告。$('mydiv').delegate('seconddiv','hover', function( event ) {
$(this).toggle( event.type === 'mouseenter' );
});
mydiv
上时,你想要它嵌套的 seconddiv
显示出来,然后当你离开 mydiv
时隐藏吗?mydiv
元素是页面加载时的一部分吗?还是稍后添加的? - user113716mouseenter
和mouseleave
事件: $('mydiv').delegate('seconddiv','mouseenter mouseleave', ...
。我找不到任何关于新版jQuery是bug还是feature的信息,所以在jQuery跟踪器上报了一个bug:http://bugs.jquery.com/ticket/13470。 - DerVOhover
了。由于某些原因,我的编辑被拒绝了,所以我添加了一个答案。 - DerVO.someContainer .seconddiv{
display : none;
}
.someContainer:hover .seconddiv{
display : block;
}
在MO中,这是一种更高效/轻量级的解决方案。
.seconddiv
中的某些内容进行交互,请注意...事件的顺序将首先触发悬停,然后是对.seconddiv
的点击。 - parker.sikand.delegate()
没有 handle out。此外,您需要使用第一个参数指定要定位的元素。
您可以尝试类似于以下内容的代码:
$('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();
});
hover
作为bind
、live
和delegate
的事件类型。它映射到mouseenter/mouseleave
。 - user113716hover
是一种事件类型。它甚至在jQuery文档中作为delegate
的示例之一。http://api.jquery.com/delegate/ - Michael Irigoyen.bind
方法的API文档中没有显示,所以我没有意识到。 - mVChrbind
的理解错了。它只适用于 live
和 delegate
。 - user113716