jQuery 是不是有 .delegate('hover') 的句柄?

Posted

技术标签:

【中文标题】jQuery 是不是有 .delegate(\'hover\') 的句柄?【英文标题】:Does jQuery have a handleout for .delegate('hover')?jQuery 是否有 .delegate('hover') 的句柄? 【发布时间】:2011-06-13 22:11:12 【问题描述】:

我正在尝试使用:

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

【问题讨论】:

如果您提供 html 示例,我可以针对您的标记给出更具体的答案。 【参考方案1】:

User113716 的出色答案将不再适用于 jQuery 1.9+,因为不再支持 伪事件 hover (upgrade guide)。

此外,由于 jQuery 3.0 delegate() 用于绑定事件已正式弃用,因此请使用 new on()(docs) 进行所有事件绑定。

您可以通过将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
);

注意: 由于 hover 在 v1.9 中被删除,on() 在 v1.7 中被引入,所以没有真正需要使用 delegate() 的解决方案 - 但如果你喜欢出于某种原因;它仍然存在(目前)并且可以完成工作:

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

【讨论】:

我不知道你可以使用on绑定两个事件 delegate() 在 3.0 中已弃用 jquery.com/upgrade-guide/3.0/…【参考方案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();  
);

对于显示/隐藏,更短的编写方法是使用toggle()(docs),它可以接受switch 参数,其中true 表示showfalse 表示hide

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

请注意,mouseenter 事件报告为 jQuery 1.4.3。如果您使用的是1.4.2,则会报告为mouseover


编辑:

如果我在下面理解你的 cmets,你就会有这样的东西(当然使用正确的选择器)。

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

【讨论】:

第二个div在第一个之内。当我使用 mouseover 时,一旦鼠标移到 seconddiv 上,它就会消失,只有在我将鼠标悬停在 mydiv 上时才会显示。 @Chris:您是说当您将鼠标悬停在mydiv 上时,您希望其嵌套的seconddiv 显示,然后在您离开mydiv 时隐藏? mydiv 元素在加载时是页面的一部分吗?还是稍后添加? seconddiv 嵌套在第一个 div 中。有时 mydiv 在页面加载时存在,有时在加载 DOM 后添加。 @Chris:我想我明白了。我会更新,如果是你的意思,你可以告诉我。 我没有意识到 mouseenter 是一种可供选择的类型。【参考方案3】:

我知道 OP 想要一个 delegate 解决方案(当我遇到这个问题时我也是……)

但经过进一步的调查,我发现完全不用js/jquery代码也可以达到同样的效果

你只需要一点CSS

.someContainer .seconddiv
    display : none;


.someContainer:hover .seconddiv
    display : block;

INMO 它是一种更有效/更轻的解决方案

【讨论】:

这是一种使用 CSS 的好方法——当我遇到这个问题时,我需要在鼠标进入后触发另一个 JS 事件。 如果您需要在触摸屏设备上与.seconddiv 中的某些内容进行交互,请小心...事件的顺序将首先触发悬停,然后单击进入.seconddiv【参考方案4】:

.delegate() 没有句柄。此外,您需要使用第一个参数指定要定位的元素。

不过,您可以尝试这样的方法:

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

【讨论】:

【参考方案5】:

编辑:错误信息已删除。

如果您想在没有委托的情况下使用 hover() 方法,工作代码将如下所示:

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

其次,delegate 是给一个孩子分配一个事件处理器,所以需要先指定一个选择器。如果您需要确保动态添加的元素存在此事件处理程序,我更喜欢 .live() 在这种情况下使用 mouseentermouseleave

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

【讨论】:

jQuery 接受hover 作为bindlivedelegate 的事件类型。它映射到mouseenter/mouseleave 这是不正确的。 hover 是一种事件类型。它甚至在 jQuery 文档中用作 delegate 的示例。 api.jquery.com/delegate 谢谢。它没有显示在 .bind 方法的 API 文档中,所以我没有意识到。 我对 bind 的看法是错误的。仅适用于livedelegate 第二个 div 嵌套在第一个 div 中,如果你将鼠标悬停在第二个 div 上,它就会消失。

以上是关于jQuery 是不是有 .delegate('hover') 的句柄?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery的.bind().live()和.delegate()之间区别

jQuery事件绑定on()bind()live()与delegate() 方法详解

jQuery事件绑定.on()简要概述及应用

jQuery事件绑定on()bind()与delegate() 方法详解

Jquery中的bind(),live(),delegate(),on()绑定事件方式

Jquery中的bind(),live(),delegate(),on()绑定事件方式 前言