是否可以使用jQuery .on和悬停?

Ryr*_*yre 315 jquery

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

该项目刚刚更新到jQuery 1.7,所以我可以选择使用.on,但我似乎无法使用它hover.是否有可能使用.onhover

编辑:我绑定的元素在文档加载后加载javascript.这就是为什么我使用on而不仅仅是hover.

Set*_*hen 652

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

对于未使用JavaScript填充的元素使用此选项:

$(".selector").on("mouseover", function () {
    //stuff to do on mouseover
});
Run Code Online (Sandbox Code Playgroud)

.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
    }
});
Run Code Online (Sandbox Code Playgroud)

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

虽然强烈建议不要使用新代码,但您可能会看到伪事件名称"悬停"用作字符串"mouseenter mouseleave"的简写.它为这两个事件附加单个事件处理程序,并且处理程序必须检查event.type以确定事件是mouseenter还是mouseleave.不要将"hover"伪事件名称与.hover()方法混淆,后者接受一个或两个函数.

此外,使用它没有性能优势,而且比使用mouseenter或更笨重mouseleave.我提供的答案需要更少的代码,并且是实现这样的事情的正确方法.

编辑

已经有一段时间了,因为这个问题得到了解答,似乎已经获得了一些牵引力.上面的代码仍然有效,但我确实想在我的原始答案中添加一些内容.

虽然我更喜欢使用mouseentermouseleave(帮助我理解代码中发生的事情),.on()但它与编写以下内容完全相同hover()

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

由于原来的问题没有问他们如何能正确使用on()hover(),我想我会改正的使用on(),并没有觉得有必要添加hover()的时间码.

编辑2012年12月11日

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

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

上面的代码.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
Run Code Online (Sandbox Code Playgroud)

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

  • 这不适用于已添加到 DOM 的元素。正如@Nik Chankov 在下面指出的那样,这是 .on() 用于附加多个处理程序的正确用法 http://stackoverflow.com/questions/8608145/jquery-on-method-with-multiple-event-handlers-to-一选一 (2认同)

caz*_*zer 81

当在文档作为问题请求加载之后创建对象时,这些解决方案都不适用于我.我知道这个问题已经过时了,但我仍然有一个解决方案

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

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

  • 这个有适当的解决方案:http://stackoverflow.com/questions/8608145/jquery-on-method-with-multiple-event-handlers-to-one-selector (5认同)
  • 在这里使用`mouseover`和`mouseout`事件将导致代码在用户在元素内部移动鼠标时不断触发.我认为`mouseenter`和`mouseleave`更合适,因为它只会在进入时触发一次. (5认同)

Jon*_*osh 19

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

$("#foo").on("hover", function() {
  // disco
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 在`On()`中的``hover`事件支持在jQuery 1.8中被弃用,并在jQuery 1.9中删除.** (23认同)

小智 9

jQuery悬停功能提供鼠标悬停和鼠标悬停功能.

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

$(".item-image").hover(function () {
    // mouseover event codes...
}, function () {
    // mouseout event codes...
});
Run Code Online (Sandbox Code Playgroud)

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

  • 绝对有效.你投了一票,因为有些人是甩了!谢了哥们 (3认同)

Cod*_*ick 5

您可以使用.on()hover通过执行附加注释部分所说的话:

虽然强烈建议不要使用新代码,但您可能会看到伪事件名称"悬停"用作字符串"mouseenter mouseleave"的简写.它为这两个事件附加单个事件处理程序,并且处理程序必须检查event.type以确定事件是mouseenter还是mouseleave.不要将"hover"伪事件名称与.hover()方法混淆,后者接受一个或两个函数.

那将是做以下事情:

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

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

});
Run Code Online (Sandbox Code Playgroud)

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

在jQuery 1.8中不推荐使用,在1.9中删除:名称"hover"用作字符串"mouseenter mouseleave"的简写.它为这两个事件附加单个事件处理程序,并且处理程序必须检查event.type以确定事件是mouseenter还是mouseleave.不要将"hover"伪事件名称与.hover()方法混淆,后者接受一个或两个函数.

  • 在`On()`中的``hover`事件支持在jQuery 1.8中被弃用,并在jQuery 1.9中删除.** (5认同)

Kry*_*ove 5

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

$(document).on('mouseover', '.selector', function() {
   //do something
});
$(document).on('mouseout', '.selector', function() {
   //do something
});
Run Code Online (Sandbox Code Playgroud)

这个小提琴http://jsfiddle.net/TWskH/12/ illustrait代表了我的观点。当对诸如插件中的元素进行动画处理时,我发现这些多个触发器会导致意外的行为,这可能导致动画或代码被调用的次数超过了必要。

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

$(document).on('mouseenter', '.selector', function() {
   //do something
});
$(document).on('mouseleave', '.selector', function() {
   //do something
});
Run Code Online (Sandbox Code Playgroud)

尽管这阻止了我动画的多个实例被调用,但最终我还是决定使用鼠标悬停/ mouseleave来确定何时将父级的孩子悬停在上面。


小智 5

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

所以hover等于mouseenter mouseleave.

这是我的建议:

$("#foo").on("mouseenter mouseleave", function() {
    // do some stuff
});
Run Code Online (Sandbox Code Playgroud)


小智 5

$("#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');
Run Code Online (Sandbox Code Playgroud)