【问题标题】:jQuery: How to check if the mouse is over an elementjQuery:如何检查鼠标是否在元素上
【发布时间】:2011-12-21 23:18:56
【问题描述】:

我有一个绑定 mouseenter 事件的延迟函数:

$(window).load(function(e) {
  var $container = $('.container');
  $container.mouseenter(function(e) {
    //do something
  });
  ...
});

问题是当加载事件触发时鼠标可能已经在元素上方,因此在 mouseenter 事件被绑定之前。
我可以通过在页面加载处理程序的末尾放置一些代码来解决这个问题,以一次性检查鼠标是否在元素内并手动触发 mouseenter 事件:

// check if the mouse is inside $container
if(mouse is inside $container)
  $container.mouseenter();

如何检查鼠标是否在加载事件中的元素上方?

我尝试了$container.is(':hover'),但它不起作用。

【问题讨论】:

  • 你尝试过 mouseenter 和 mouseleave 事件吗?
  • $container.is(':hover') - 这在什么方面不起作用?我担心它不是特别交叉兼容(例如,它在 IE7 中不起作用,因为它依赖于 qSA 行为),但它似乎可以满足您对我的要求...
  • @lonesomeday:查看jsfiddle.net/UVJgF/1 并将鼠标放在黑框上并按 ctr+enter。它不会在 FF8 上触发

标签: jquery


【解决方案1】:

我还没有测试它,但认为你想要这样......

function checkMouseCollision(obj) {
    var offset = obj.offset();
    objX= offset.left;
    objY=offset.top;
    objW=obj.width();
    objH=obj.height();

    var mouseX = 0;
    var mouseY = 0;
    $().mousemove( function(e) {
    mouseX = e.pageX;
    mouseY = e.pageY;
    });

    if((mouseX>objX&&mouseX<objX+objW)&&(mouseY>objY&&mouseY<objY+objH)){
        alert("hovered")     
    };
};
checkCollision($(".box"))

【讨论】:

  • 这可以工作,但是 mousemove 会被调用很多。如果可能的话,我希望有一种方法可以进行一次性检查:)
  • @spb 您是否考虑过使用 .one() 而不是 .on() 来进行您的活动?
【解决方案2】:

执行此操作的最佳方法是获取元素的左、右、上和下偏移量,并查看鼠标位置是否位于这些值之间。

Example.

第一次加载时将鼠标放在 div 上。然后刷新页面(单击 F5,这样您就不必移动鼠标了)。当页面下次完全加载时,它应该会发出“悬停!”的警报。即使您没有移动鼠标。

或者更简单的方法。只需检查 mousemove 事件的 e.target.id (显然在页面加载后触发,即使不移动鼠标)与元素的 id 对比,如下所示:

$(document).mousemove(function(e){
    if( e.target.id === 'hoverTest'){
        alert("Hovered!");
    }
});

Example(执行与上述相同的步骤)。

【讨论】:

  • 这似乎无法在 FF8 上解决。要清楚 - 如果我将鼠标放在块上并获得第一个悬停弹出窗口并按 Enter,然后按 F5(或 Ctrl-F5)刷新,即使鼠标悬停在框上,我也不会收到另一个弹出窗口,直到我稍微移动一下鼠标。
  • 在 Chrome 上对我来说很好——看起来像另一个跨浏览器的混乱。哪一个为您产生了该错误?
  • FireFox 8.0 在 Cr-48 笔记本电脑上的 Chrome 16.0.912.59 上,即使鼠标没有移动,它也会不断弹出警报,因此很难测试,但我点击了不再弹出然后移到盒子上然后按 F5 直到我开始移动鼠标它才弹出,然后它一直弹出。
  • @Purmou:这个变体可以工作:在 mousemove 中,我可以检查鼠标是否在元素上并设置一个标志 true 或 false。然后我可以在 window.load 事件处理程序中检查该标志。如果没有更简单的方法,我会这样做。
【解决方案3】:

使用 jQuery 1.7+,你会想要使用 .on(): http://api.jquery.com/on/

$(document).ready(function(){
    $('body').on("mouseover", "your_element_selector_here", function() {
        // do stuff here
    });
});

.live 已弃用。您也可以将任何其他事件放入 .on 中,具体取决于您的需要。 :hover 不起作用,因为它只适用于特定元素并且它是基于 css 的。

在页面完成加载之前将此方法与偏移检测方法结合使用,可以让您到达想要的位置。

【讨论】:

  • 有趣。 .mouseenter 或 .mouseover 也被弃用了吗?这些似乎不如 .on 冗长
  • 不,但您应该使用 .on()。与旧的不推荐使用的 .live 一样,即使绑定元素 (your_element_here) 通过 ajax 重绘重新绘制,绑定也会存在。这里有一个问题,它的父元素(你称之为'on'的那个)不能在页面的生命周期中重新绘制。因为它是 .on() 分配给它的,所以它必须始终存在。
【解决方案4】:

我选择了 Detect mouse hover on page load with jQuery 中的 CSS 悬停解决方案,因为它不需要 mousemove 事件。

【讨论】:

    【解决方案5】:

    Mouseover 事件完全符合您的要求。

    如果.conteiner不存在你附加鼠标悬停事件(将来动态添加)你必须使用.live方法来附加事件。

    $(".conteiner").live("mouseover", function() {
       alert("hovered!");
    }) 
    

    当鼠标已经在新元素出现的位置时,它也可以工作。 Example here!

    对于 jQuery 1.7+,您应该改用 .on 方法,因为不推荐使用 .live 方法。 Example here!

    【讨论】:

    • 我希望有一种方法可以在不使用事件的情况下进行检查。
    • 如果页面加载时鼠标已经在某个元素上,mouseover 事件将不会触发。这就是问题的全部意义所在。
    • 您确定mouseover 事件不会触发吗?
    【解决方案6】:
    $('.container').mouseover(function(e) {
        //do something
    });
    

    【讨论】:

    • 我需要等待页面首先加载,到那时鼠标可能已经在元素上。
    猜你喜欢
    • 2014-09-20
    • 2010-11-19
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    相关资源
    最近更新 更多