1

我有一个父元素,当悬停在上面时会显示一个元素。我还有一个子元素,当悬停在上面时会显示不同的元素。

我不希望它们同时触发 - 即,如果您将鼠标悬停在子元素上,我只想显示它的关联元素 - 并抑制父元素的悬停。

我无法让它可靠地工作。可能遗漏了一些明显的东西。有任何想法吗?

编辑 - 澄清:

在这种情况下,“父”和“子”是相互不了解的独立可重用组件,因此我实际上无法将上下文从一个注入另一个

这是我使用 jQuery 和hoverIntent插件设置的演示。

HTML:

<div id="parentBar">
    <ul id="childMenu">
        <li>Menu 1</li>
    </ul>
</div>

<div id="barInfo">
    <p>This is shown when hovering overing inside of the parent bar.</p>
</div>

<div id="menuInfo">
    <p>This is shown when hovering over inside of the child menu.</p>
</div>

CSS:

#parentBar{width:500px;border:solid 1px black;}
#childMenu{margin-left:10px;padding-left:10px;width:100px;border:solid 1px green;}
#menuInfo, #barInfo{display:none;}

JavaScript:

$('#parentBar').hoverIntent({
    //interval: 500,
    over: function(e) {
        $('#barInfo').show();
    },
    out: function(e) {
        $('#barInfo').hide();
    }
});

$('#childMenu').hoverIntent({
    //interval: 250,
    over: function(e) {
        $('#menuInfo').show();
    },
    out: function(e) {
        $('#menuInfo').hide();
    }
});

$('#childMenu').bind('mouseenter', function(e){
    e.stopPropagation();
});

您可以在 jsFiddle 上查看:http: //jsfiddle.net/hNqQ7/1

4

3 回答 3

2
var flag = false;
$('#parentBar').hoverIntent({
  interval: 500,
  over: function(e) {
    if(!flag) {
        $('#barInfo').show();
    }
  },
  out: function(e) {
    $('#barInfo').hide();
  }
});

$('#childMenu').hoverIntent({
  interval: 250,
  over: function(e) {
    $('#menuInfo').show();
  },
  out: function(e) {
    $('#menuInfo').hide();
  }
}).mouseenter(function(){
    flag= true;
}).mouseleave(function(){
    flag = false;
});
于 2011-05-25T19:31:50.340 回答
1

在子事件(两个函数)中,调用e.stopPropagation()

编辑:好的,对不起,我以前没有看过演示。您可以将子代码更改为以下内容:

$('#childMenu').hoverIntent({
   interval: 250,
   over: function(e) {
        $('#barInfo').hide();
        $('#menuInfo').show();
    },
    out: function(e) {
        $('#barInfo').show();
        $('#menuInfo').hide();
    }
});
于 2011-05-25T19:08:04.313 回答
0

此解决方案修改了核心插件。

使用最新版本的 hoverIntent,https://github.com/briancherne/jquery-hoverIntent ,我对从 mouseenter 触发的核心函数compare进行了简单的修改。

查找(~第 65 行):

if (Math.sqrt((s.pX - cX) * (s.pX - cX) + (s.pY - cY) * (s.pY - cY)) < cfg.sensitivity) {

并替换为:

if (!$el.hasClass("preventIntent") && Math.sqrt((s.pX - cX) * (s.pX - cX) + (s.pY - cY) * (s.pY - cY)) < cfg.sensitivity) {

这允许您从子/单独的交互中创建任何逻辑,并通过切换类preventIntent来抑制 hoverIntent 的“over”功能。

例子:

$(".child-ele").on("mouseenter", function(e) {
    $(this).closest(".parent-ele").addClass("preventIntent");
}).on("mouseleave", function(e) {
    $(this).closest(".parent-ele").removeClass("preventIntent");
});

或者,可以使用“ignoreChild”选项选择器来改进核心插件,该选择器对每个循环执行 .is(":hover") 的检查。这可以减少对额外鼠标事件的需求,但显然只能将其限制为悬停。

于 2016-07-13T18:46:00.850 回答