【问题标题】:jQuery: When not hovering over element X or Y, hide Y?jQuery:当不悬停在元素 X 或 Y 上时,隐藏 Y?
【发布时间】:2011-07-29 10:03:22
【问题描述】:

我有几张图像并排排列在一起,每当我悬停其中一张图像时,就会出现该图像的工具提示(包含一些信息等)。工具提示信息是用 ajax 加载的,但这无关紧要。

问题是当我将鼠标悬停在其中一个图像时会加载工具提示,而当我将鼠标悬停在它之外时它就会消失。所以我无法将鼠标悬停在工具提示上,我需要这样做。

所以我想到了记录我在对象中悬停的每个元素的解决方案。像这样:

$('*').mouseenter(function() {
    currently_hovering = $(this);
});

然后当我将鼠标悬停在图像外时,检查鼠标是否悬停在工具提示上,如果是,则什么也不做,如果不是,则隐藏工具提示。听起来不错,对吧?但是由于某种原因,每当我将鼠标悬停在工具提示上时,它都会拒绝记录。它仍然像我在图像上一样(但是当我在其中移动鼠标时,工具提示会严重闪烁)。

我假设它没有记录工具提示,因为它是绝对定位的?它位于图像上方(这样我就可以将鼠标移动到它而不隐藏它)。我试过使用 mouseenter/mouseover 和 hover,结果都一样。

有解决办法吗?

【问题讨论】:

    标签: jquery hover hide element


    【解决方案1】:

    部分问题可能是您使用 ajax 加载信息。

    您需要对正常页面加载后添加到页面的数据使用 live() 函数,以便脚本处理所述数据。

    有点像:

        $('.day').live('mouseover mouseout',function(e) {
            if (e.type === 'mouseover') {
                $(this).addClass('day-hover');
            } else {
                $(this).removeClass('day-hover');
            }
        });
    

    【讨论】:

    • 是的,它做到了。在玩了一些之后,我开始工作了。谢谢。
    【解决方案2】:

    闪烁是因为当您将鼠标移到工具提示上时,您不再将鼠标悬停在该图像上并且正在移除它,然后当它被移除时,您突然再次将鼠标悬停在该图像上,所以它重新- 出现。

    当您将鼠标悬停在工具提示上时,听起来像在工具提示的 onmouseover 之前调用图像的 onmouseout 调用,因此您的 currently_hovering 变量未设置为工具提示。

    当您将鼠标悬停在图像之外时,您可以尝试使用超时吗?即使是 0 秒的超时也可能起作用,这足以让浏览器在检查 currently_hovering 的值之前处理已悬停的工具提示?

    【讨论】:

    • 我会尝试使用超时,但我怀疑它是否会起作用,原因之一。即使我在将鼠标悬停在图像之外时删除了隐藏工具提示的隐藏功能,当我将鼠标悬停在工具提示上时它也无法识别。我可以随心所欲地将鼠标悬停在工具提示(它是儿童)上,但它仍然没有出现在日志中。不过我会尝试一下,一旦我完成就回来。 (我现在要离开一段时间,所以可能需要一些时间,所以你知道)
    • 啊哈,听起来马蒂斯当时已经破解了这个。如果您正在动态创建工具提示 div,如果您使用 bind(),它将没有它的事件处理程序,但是如果您使用 live(),则在创建对象时它将自动绑定事件。
    • 或者,您可以在页面加载时创建一个具有唯一 id 的隐藏工具提示元素,然后绑定事件,然后使用您的 AJAX 调用函数来更改 innerHTML、定位和显示工具提示。
    • 是的,这将是 Connel 的一种解决方案,但我不想为我希望它工作的每个页面添加一个 html 元素。我只想包含一个 javascript 文件并让它工作。
    • 你能在页面加载时让你包含的 javascript 文件添加 div 吗? $(function() { createDiv(); });
    【解决方案3】:

    也许您可以将您的图像包装到例如<div> 标记中,让 jquery 在该 div 标记的悬停时“侦听”并将您的工具提示添加到该标记中图像本身之后。然后将鼠标悬停在工具提示上不应导致闪烁,因为您“不离开”导致它可见的 div。类似的东西

    <div class="imageWrapper">
      <img src="source" />
      <span class="tooltip">tooltip text</span>
    </div>
    

    那么 js 会是这样的

    $('div.imageWrapper').hover(function(){
      var tooltipText = callWhateverMethodToLoadTooltipText();
      if($('span.tooltip',$(this)).length == 0)
        $(this).append('<span class="tooltip">' + tooltipText + '</span>');
      else
        $('span.tooltip',$(this)).text(tooltipText).show();
    }, function(){
      $('span.tooltip', $(this)).hide();
    });
    

    【讨论】:

    • 是的,但问题是每次我将鼠标悬停在具有特定类的元素上时都会动态加载工具提示。因此,我在关闭 body 标签之前将其定位。
    • hmmmm,你必须在正文标签结束之前添加它吗?我将尝试描述我在回答中的意思
    • 您是否对每个工具提示使用相同的工具提示元素并更改定位?如果没有,您已经将图像作为 jQuery 对象,您可以使用 .parent() 获取包装器,然后将 div 添加为子对象?
    • hmmmm 但你仍然需要一个包装器,它只包装我猜的那个图像,或者你的意思是完全不同的解决方案?
    猜你喜欢
    • 2019-12-29
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多