【问题标题】:Hover, mouseover and mouse out悬停、鼠标悬停和鼠标移出
【发布时间】:2011-05-26 16:33:45
【问题描述】:

我正在学习和使用 jQuery,并希望为某些元素显示一个删除图标。

我有一个外部主 div,其中包含元素的包装器数量。在元素包装器内部,我想在用户将鼠标悬停在元素包装器上时显示一个删除图标,并在用户移出元素包装器时将其删除。

使用mouseovermouseout,我可以显示和删除图标,但是只要我将鼠标移到删除图标上,它就会被删除,因为它会触发元素包装器的mouseout 事件。我做错了什么?

【问题讨论】:

  • 在“doh!”中片刻,我将缺少的 CSS 答案添加到我的答案中。你实际上并没有说你不得不用 JavaScript 来做这件事,对吗? :-) 但是还有一个 JavaScript 选项(如果你想要 IE6 支持,你将需要它)。

标签: jquery hover mouseover


【解决方案1】:

两种选择

  1. CSS 的 :hover 伪类(但前提是您不必支持 IE6)
  2. mouseentermouseleave 事件

CSS 的 :hover 伪类

如果您不需要 IE6 支持,您可以使用 :hover 伪类让浏览器完成所有工作:

/* Don't show `child` elements inside `parent` elements...*/
parent child {
    display: none;
}

/* ...unless the `parent` element is being hovered over */
parent:hover child {
    display: block; /* or inline-block or whatever */
}

Live example

但是,IE6 不支持 :hover 伪类,a 元素除外。 IE7+ 和所有最近的其他浏览器都可以。

mouseentermouseleave 事件

如果 CSS 不适合您,您正在寻找 mouseentermouseleave 事件,它们是 IE 特定的,但在所有其他浏览器上由 jQuery 模拟。 jQuery 甚至还有一个方便的函数hover,用于将处理程序连接到这两个事件,这样您就可以轻松完成您想要做的事情。

$(...your parent element...).hover(
    function() {
        // Called when the mouse enters the element
    },
    function() {
        // Called when the mouse leaves the element
    }
 );

这是一个完整的live example

HTML:

<div>Hover over me <span class='del'>[X]</span></div>
<div>And me <span class='del'>[X]</span></div>
<div>And me <span class='del'>[X]</span></div>

使用 jQuery 的 JavaScript:

$('div').hover(
  function() {
    $(this).find('span.del').show();
  },
  function() {
    $(this).find('span.del').hide();
  }
);

mouseovermouseout 遇到问题的原因是它们冒泡,因此父元素上的 mouseout 处理程序从底层元素中看到冒泡的 mouseout当您的鼠标移动到删除元素时。 mouseentermouseleave 不会冒泡,所以他们没有这个问题。

【讨论】:

  • 嘿,谢谢,实际上我已经使用 jquery 使用了这种方法,但就我而言,我想在悬停时附加图标。使用上述方法,当我将鼠标移到图标上时,多个图标会添加到元素包装器中。如何阻止这种情况?
  • @KutaPHP:根据您的描述,听起来您尝试使用mouseovermouseout 而不是mouseentermouseleave。同样,它们是不同的事件,它们的行为也不同(请参阅上面答案末尾的注释)。但如果你真的使用mouseentermouseleave,听起来你并没有删除mouseleave 上的元素。如果你这样做,效果很好:jsbin.com/umalu4/2 但是添加到 DOM 和从 DOM 中删除是比显示/隐藏更重的操作,建议显示/隐藏。
  • 嘿,再次感谢...我修复了这个...我直接添加图像,我将它作为背景添加到跨度中,我做到了。 :)
【解决方案2】:

您是否尝试过改用 mouseentermouseleave 事件?

【讨论】:

    【解决方案3】:

    您可以在 jQuery 事件 onmouseover 和 onmouseout 上应用样式。当用户将鼠标悬停在菜单上时,此事件将触发,您可以在那里设置效果。

    <style type="text/css">
            .menu {
                background-color: #CDDC39;
                list-style: none;
                margin: 100px;
                padding: 0;
                width: 10em;
            }
                .menu li {
                   margin: 0;
                   padding: 5px;
               }
                .menu a {
                color: #333;
               }
        </style>
        <ul class="menu">
            <li onmouseover="this.style.backgroundColor='#F44336';" onmouseout="this.style.backgroundColor='transparent';" style="background-color: transparent;">
                <a href="http://www.infinetsoft.com/">learn dot net skills</a>
            </li>
            <li onmouseover="this.style.backgroundColor='#F44336';" onmouseout="this.style.backgroundColor='transparent';" style="background-color: transparent;">
                <a href="http://www.infinetsoft.com/htmltry">Work out html</a>
            </li>
            <li onmouseover="this.style.backgroundColor='#F44336';" onmouseout="this.style.backgroundColor='transparent';" style="background-color: transparent;">
                <a href="http://www.infinetsoft.com/Category/JQuery/9/1">jQuery tutorials</a>
            </li>
        </ul>
    

    for more details

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 2011-08-04
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多