忽略重叠div的鼠标事件

时间:2011-02-02 00:48:13

标签: jquery events mouse event-bubbling overlapping

一个页面有4个div:

  1. 项目A
  2. 项目B
  3. 项目C
  4. 详情(隐藏)
  5. 所需的效果是,当将鼠标悬停在“项目”框上时,将显示“详细信息”框,并在鼠标移出后隐藏。显示时,“详细信息”框将与“项目”框右侧的约20%重叠。

    然而,我得到的当前错误效果是,当我将鼠标悬停在任何Item框的右边缘时,它会进入显示和隐藏Details框的永久循环。大概这是因为它触发了Item框的mouseout事件(当显示Details时),但是当隐藏Details按钮时立即再次触发mouseover事件。我想知道如何解决这个问题。

    我目前的代码是:

    $('div.item').hover(
        function() {
            $(this).showDetails();
        },
        function() {
            $(this).hideDetails();
        }
    );
    

    提前感谢任何指针! 这是任何无法想象它的人的jsfiddle链接。尝试将鼠标悬停在右侧的“项目”框上,然后稍微移动鼠标,您将看到闪烁发生。

    http://jsfiddle.net/s6CjP/1

    Xavier,我已经尝试了appendTo的详细信息框,但我想要的效果是我想让鼠标事件只针对可操作的div(即Item)。经过一些研究后,我甚至非常确定这是否可行,因为“详细信息”框覆盖了div(因此无法将事件附加到其下方)

4 个答案:

答案 0 :(得分:1)

一个解决方法是让细节DIV成为您正在悬停的项目的子项。这样,当指针在细节DIV上方时,指针仍然处于正确的项目中,并且在鼠标离开两个 DIV之前不会发送mouseout。你至少可以用两种方法做到这一点:

  1. 每个项目DIV都有一个单独的详细信息DIV(无论如何它们都有不同的细节,对吗?)。
  2. 将详细信息DIV从DOM中删除,并将其附加到showDetails()函数中的正确项目DIV。
  3. 你必须做一些CSS技巧才能让它显示出你想要的东西,但只要父子关系存在,你就不必担心错误的鼠标事件。

    希望这有帮助!

答案 1 :(得分:0)

我无法直观地查看您的问题。目前还不清楚详细信息框在所有情况下是否看起来相同,页面上的项目div在哪里,以及彼此之间的关系。

请为此创建JSFiddle并在其中粘贴一些CSS,HTML和JS。然后我可以看看。

答案 2 :(得分:0)

试试这个:

我认为这就是你要找的:

<强> HTML:

<div class="divItem" style="width:50px;height:50px;background-color:#FFEFC6">Item A</div>
<br />
<div class="divItem" style="width:50px;height:50px;background-color:#FFEFC6">Item B</div>
<br />
<div class="divItem" style="width:50px;height:50px;background-color:#FFEFC6">Item C</div>
<div id="divMove" style="width:100px;height:100px;background-color:#D9E9D0;display:none">
</div>

<强> JAVASCRIPT:

$(".divItem").mousemove(function(e){
    var left  = e.pageX + 10 + "px";
    var top  = e.pageY + 20 + "px";

    $("#divMove").show().css("top",top).css("left",left).css("position","absolute");
}).mouseout(function(){
    $("#divMove").hide();
   }).mouseenter(function(){
        $("#divMove").text($(this).text());    
});

<强> CLICK HERE TO SEE THE SAMPLE

答案 3 :(得分:0)

Nando,那里有一些更好的答案,但我只是想把它扔到那里,虽然我确信你试过了。

特别是因为你正在使用hover(),听起来有点像你遇到了一个非常简单的问题。

我确定你试过停止(真实,真实)对吗?

//
$('div.item').hover(
    function() {
        $(this).stop(true, true).showDetails();
    },
    function() {
        $(this).stop(true, true).hideDetails();
    }
);
//