【问题标题】:Is it possible to use jQuery .on and hover?是否可以使用 jQuery .on 和悬停?
【发布时间】:2012-04-07 07:09:52
【问题描述】:

我有一个<ul>,在初始页面加载后填充了 javascript。我目前正在使用.bindmouseovermouseout

该项目刚刚更新到 jQuery 1.7,所以我可以选择使用 .on,但我似乎无法让它与 hover 一起使用。 .on 可以和hover 一起使用吗?

编辑:我绑定到的元素在文档加载后使用 javascript 加载。这就是我使用on 而不仅仅是hover 的原因。

【问题讨论】:

  • 来自下面的评论 - On() 中的悬停事件支持在 jQuery 1.8 中已弃用,并在 jQuery 1.9 中删除。按照 calebthebrewer 的建议,尝试结合使用 mouseentermouseleave

标签: jquery


【解决方案1】:

如果您需要将.on() 与使用 JavaScript 填充的元素一起使用,请查看此答案中的最后一个编辑

将此用于未使用 JavaScript 填充的元素:

$(".selector").on("mouseover", function () {
    //stuff to do on mouseover
});

.hover() 有自己的处理程序:http://api.jquery.com/hover/

如果你想做多件事,把它们链接到.on() 处理程序中,如下所示:

$(".selector").on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
});

根据下面提供的答案,您可以使用hover.on(),但是:

虽然强烈建议不要使用新代码,但您可能会看到 伪事件名称“悬停”用作字符串的简写 “鼠标进入鼠标离开”。它为那些附加了一个事件处理程序 两个事件,处理程序必须检查 event.type 以确定 事件是 mouseenter 还是 mouseleave。不要混淆 使用 .hover() 方法的“悬停”伪事件名称,该方法接受一个 或两个函数。

此外,使用它并没有性能优势,而且它比仅使用 mouseentermouseleave 更庞大。我提供的答案需要更少的代码,并且是实现此类目标的正确方法。

编辑

这个问题已经有一段时间没有得到回答了,而且似乎已经引起了一些关注。上面的代码仍然有效,但我确实想在我原来的答案中添加一些东西。

虽然我更喜欢将mouseentermouseleave.on() 一起使用(帮助我理解代码中发生了什么),但它与使用hover() 编写以下内容相同

$(".selector").hover(function () {
    //stuff to do on mouse enter
}, 
function () {
    //stuff to do on mouse leave
});

由于最初的问题确实询问他们如何正确使用on()hover(),我想我会更正on() 的用法,并且当时没有必要添加hover() 代码.

2012 年 12 月 11 日编辑

下面提供的一些新答案详细说明了如果使用 JavaScript 填充所讨论的 div.on() 应该如何工作。例如,假设您使用 jQuery 的 .load() 事件填充 div,如下所示:

(function ($) {
    //append div to document body
    $('<div class="selector">Test</div>').appendTo(document.body);
}(jQuery));

.on() 的上述代码不成立。相反,您应该稍微修改您的代码,如下所示:

$(document).on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
}, ".selector"); //pass the element as an argument to .on

.load() 事件发生后,此代码将适用于使用 JavaScript 填充的元素。只需将您的参数更改为适当的选择器即可。

【讨论】:

  • @Scott,请注意 JonMcIntosh 的回答没有回答我的问题,因为他只使用了一半的悬停功能。
  • 这不适用于已添加到 DOM 的元素。正如@Nik Chankov 在下面指出的那样,这是正确使用 .on() 附加多个处理程序stackoverflow.com/questions/8608145/…
  • @soupy1976 编辑了我的答案,它现在考虑了使用 JavaScript 填充的元素。
  • @SethenMaleno - 确切地说,您的.on() 解决方案可以删除伪悬停事件并使用真实事件。我喜欢你用 mouseenter/mouseleave +1 说明的第一个
  • 那个编辑把我的投票从反对票变成了赞成票,打得很好,塞森,打得很好!
【解决方案2】:

当鼠标悬停在文档作为问题请求加载后创建的对象上时,这些解决方案都不适合我。我知道这个问题很老,但我有一个解决方案给那些仍在寻找的人:

$("#container").on('mouseenter', '.selector', function() {
    //do something
});
$("#container").on('mouseleave', '.selector', function() {
    //do something
});

这会将函数绑定到选择器,以便在文档准备好后使用此选择器的对象仍然能够调用它。

【讨论】:

  • 这个有正确的解决方案:stackoverflow.com/questions/8608145/…
  • 这也是我让它工作的方式,我发现接受的答案将选择器放在 .on 之前在 .load() 事件之后不起作用,但确实如此。
  • @calebthebrewer 编辑了我的答案,它现在考虑了使用 JavaScript 填充的元素。
  • 在此处使用mouseovermouseout 事件将导致代码在用户在元素内移动鼠标时不断触发。我认为mouseentermouseleave 更合适,因为它只会在进入时触发一次。
  • 使用文档作为根元素不是最佳实践,因为它的性能很差。您正在监视文档,而使用 load() 时,您大多数时候只操作网站的一部分(例如 #content)。所以最好尝试将其缩小到元素,这是操纵的..
【解决方案3】:

我不确定你的 Javascript 的其余部分是什么样的,所以我无法判断是否有任何干扰。但是.hover().on() 一起作为一个事件工作得很好。

$("#foo").on("hover", function() {
  // disco
});

如果您希望能够利用其事件,请使用事件返回的对象:

$("#foo").on("hover", function(e) {
  if(e.type == "mouseenter") {
    console.log("over");
  }
  else if (e.type == "mouseleave") {
    console.log("out");
  }
});

http://jsfiddle.net/hmUPP/2/

【讨论】:

  • 如何处理悬停使用的开/关的单独功能?例如:$('#id').hover(function(){ //on }, function(){ //off});
  • 对我来说,这不是必需的.. 当您可以轻松摆脱 .on() 并将其替换为 @ 时,您不需要使用 .on()hover 987654332@ 函数并得到相同的结果。 jQuery 不是要少写代码吗??
  • @Toast 它没有,请参阅下面的答案,了解如何使用 .on() 执行 mouseentermouseleave 函数
  • 我已经更新了我的答案以包括两种事件类型的使用。这与 Sethen 的答案相同,但风格不同。
  • On() 中的hover 事件支持在 jQuery 1.8 中被弃用,并在 jQuery 1.9 中被移除。
【解决方案4】:

jQuery 悬停功能提供了 mouseover 和 mouseout 功能。

$(选择器).hover(inFunction,outFunction);

$(".item-image").hover(function () {
    // mouseover event codes...
}, function () {
    // mouseout event codes...
});

来源:http://www.w3schools.com/jquery/event_hover.asp

【讨论】:

  • 绝对有效。你投了反对票,因为有些人是垃圾!谢谢老哥
  • 他投了反对票,因为如果你需要后期绑定,“on”方法就是这样,这是行不通的。
【解决方案5】:

刚从网上冲浪,觉得我可以做出贡献。我注意到@calethebrewer 发布的上述代码可能会导致对选择器的多次调用和意外行为,例如:-

$(document).on('mouseover', '.selector', function() {
   //do something
});
$(document).on('mouseout', '.selector', function() {
   //do something
});

这个小提琴http://jsfiddle.net/TWskH/12/ 说明了我的观点。在为插件等元素制作动画时,我发现这些多个触发器会导致意外行为,这可能会导致动画或代码被调用超过必要的次数。

我的建议是简单地用 mouseenter/mouseleave 替换:-

$(document).on('mouseenter', '.selector', function() {
   //do something
});
$(document).on('mouseleave', '.selector', function() {
   //do something
});

虽然这阻止了我的动画的多个实例被调用,但我最终还是选择了 mouseover/mouseleave,因为我需要确定何时将鼠标悬停在父级的子级上。

【讨论】:

  • 这个答案实际上提供了一个为文档选择器添加悬停事件的有效解决方案。 +1
【解决方案6】:

您可以按照附加说明部分的说明使用.on()hover

虽然强烈建议不要使用新代码,但您可能会看到 伪事件名称“悬停”用作字符串的简写 “鼠标进入鼠标离开”。它为那些附加了一个事件处理程序 两个事件,处理程序必须检查 event.type 以确定 事件是 mouseenter 还是 mouseleave。不要混淆 使用 .hover() 方法的“悬停”伪事件名称,该方法接受一个 或两个函数。

那就是执行以下操作:

$("#foo").on("hover", function(e) {

    if (e.type === "mouseenter") { console.log("enter"); }
    else if (e.type === "mouseleave") { console.log("leave"); }

});

编辑(jQuery 1.8+ 用户注意):

在 jQuery 1.8 中已弃用,在 1.9 中删除:名称“hover”用作 字符串“mouseenter mouseleave”的简写。它附有一个 这两个事件的事件处理程序,并且处理程序必须检查 event.type 来确定事件是 mouseenter 还是 mouseleave。 不要将“悬停”伪事件名称与 .hover() 方法混淆, 它接受一个或两个函数。

【讨论】:

  • 这只是更多的工作,因为它可以通过使用mouseentermouseleave 轻松完成...我知道,这不能回答 OP 的原始问题,但仍然使用hover这样,是不明智的。
  • 这样做完全符合 jQuery 团队建议您根据 OP 的问题进行的操作。然而,正如 jQuery 团队所建议的那样,强烈建议不要使用新代码。但是,它仍然是 OP 问题的正确答案。
  • @Scott - 你比我快:-)。 @Sethen - 两种方式都可以,但提问者要求使用.hover() 的功能。
  • 可以理解,但我仍然认为 OP 正在为mouseentermouseleave 寻找解决方案,而不是仅仅让它与hover 一起工作。如果出于性能原因没有真正的理由使用hover,为什么在强烈反对新代码时使用它?
  • On() 中的hover 事件支持在 jQuery 1.8 中被弃用,并在 jQuery 1.9 中被移除。
【解决方案7】:
$("#MyTableData").on({

 mouseenter: function(){

    //stuff to do on mouse enter
    $(this).css({'color':'red'});

},
mouseleave: function () {
    //stuff to do on mouse leave
    $(this).css({'color':'blue'});

}},'tr');

【讨论】:

    【解决方案8】:

    您可以提供一种或多种事件类型,以空格分隔。

    所以hover 等于mouseenter mouseleave

    这是我的建议:

    $("#foo").on("mouseenter mouseleave", function() {
        // do some stuff
    });
    

    【讨论】:

    • 我喜欢 jQ 对这个参数进行折旧的决定。 1.8 之前的版本,使用 to hover 作为命名空间与 DOM 事件不重合,hover,没有关系。
    【解决方案9】:

    如果您需要它作为其他事件的条件,我是这样解决的:

    $('.classname').hover(
         function(){$(this).data('hover',true);},
         function(){$(this).data('hover',false);}
    );
    

    然后在另一个事件中,你可以轻松使用它:

     if ($(this).data('hover')){
          //...
     }
    

    (我看到有些人使用is(':hover') 来解决这个问题。但这(还)不是一个有效的 jQuery 选择器,并且不适用于所有兼容的浏览器)

    【讨论】:

      【解决方案10】:

      jQuery 插件 hoverIntent http://cherne.net/brian/resources/jquery.hoverIntent.html 比这里列出的幼稚方法更进一步。虽然它们确实有效,但它们的行为不一定符合用户的期望。

      使用 hoverIntent 最重要的原因是 timeout 功能。它允许您执行诸如阻止菜单关闭之类的操作,因为用户在单击所需项目之前将鼠标向右或向左拖动得稍微太远。它还提供了在弹幕中不激活悬停事件并等待焦点悬停的功能。

      使用示例:

      var config = {    
       sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)    
       interval: 200, // number = milliseconds for onMouseOver polling interval    
       over: makeTall, // function = onMouseOver callback (REQUIRED)    
       timeout: 500, // number = milliseconds delay before onMouseOut    
       out: makeShort // function = onMouseOut callback (REQUIRED)
      };
      $("#demo3 li").hoverIntent( config )
      

      可以在https://stackoverflow.com/a/1089381/37055找到更多解释

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 1970-01-01
        • 2019-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多