【问题标题】:jQuery .mouseleave not workingjQuery .mouseleave 不工作
【发布时间】:2018-01-16 00:23:27
【问题描述】:

我正在尝试用悬停时的注销按钮替换用户名。当页面加载时,我将其作为导航之一。元素...

<li id="logout_name">
    <span class="nav_icon_sizing hidden-xs no_focus" style="position: relative; top: 10px; left: 8px; color: white;"><?php echo ucfirst($user->data()->fname); ?></span>
</li>

我正在尝试让文本切换为带有此功能的注销图标...

$('#logout_name').mouseover(function(){
    $('#logout_name').replaceWith('<li id="logout_name"><a href="<?=$us_url_root?>users/logout.php" class="nav_icon_sizing hidden-xs no_focus" style="padding-top: 15px; padding-bottom: 10px;" data-tooltip="tooltip" title="Logout" data-placement="bottom"><i class="fa fa-fw fa-sign-out"></i></a><li>')
});
$('#logout_name').mouseleave(function(){
    $('#logout_name').replaceWith('<span class="nav_icon_sizing hidden-xs no_focus" style="position: relative; top: 10px; left: 8px; color: white;"><?php echo ucfirst($user->data()->fname); ?></span>');
});

当我将鼠标悬停在名称上时,它确实会变为注销图标,但是...

  1. 鼠标移开时不会变回用户名,并且
  2. 精美的引导工具提示无法正确显示注销图标。我得到的是标准的 HTML 工具提示。

我觉得如果$(document).ready() 可以重新称为mouseover/mouseleave 一切都会好起来的,但我不认为这是真的。

有什么想法吗?

【问题讨论】:

  • 你应该做的是设置元素的.text() content。而且您不需要一遍又一遍地执行 DOM 选择。 $(this).find("span").text("...new data...") 什么的。
  • ...坦率地说,我认为您可能应该退后一步,找出解决问题的更好方法。似乎您有几个元素将按照您选择的方式一遍又一遍地创建。通常最好只显示和隐藏元素。
  • @rockstar:那是我的第一个计划,但是当我做这种事情时(不替换 &lt;li id="logout_name"&gt;),将鼠标悬停在注销图标上时会不断闪烁,就像它正在重新加载一样不断地。而且mouseleave不起作用。想法?

标签: javascript jquery html


【解决方案1】:

不久之后,您只需使用 CSS 和 :hover 伪即可实现所需的一切。
现在到 JS


使用mouseover 而不是mouseenter

mouseover 只要(组成这个词)鼠标你的元素上触发。

你可以:

$('#logout_name').on({
  mouseenter: function () { /*enters code here */ },
  mouseleave: function () { /*leaves code here */ }
});

此外,您将&lt;li&gt; 替换为&lt;span&gt; 的方式会让人怀疑您在其中做错了什么。 &lt;ul&gt; 仅接受 &lt;li&gt; 元素,不接受 SPAN。

这里的重要问题是你用一个新元素替换一个 DOM 元素,因此新创建的元素将不再响应你的事件 - 因为它绑定到现在删除的一个

.on 与动态事件委托一起使用可能(没有)帮助:

$(document /*or some static parent selector */ ).on({
  mouseenter: function () { /*enters code here */ },
  mouseleave: function () { /*leaves code here */ }
}, '#logout_name');

防止由于重新创建相同元素并重新附加新事件而进入无限循环的更好示例是仅使用 .html() 修改其内容,但保留原始 &lt;li&gt; 包装器:

$('#logout_name').on({
    mouseenter: function () { 
        $(this).html('<a>ENTER</a>');
    },
    mouseleave: function () { 
        $(this).html('<a>LEAVE</a>');
    }
});
<ul id="settings">
  <li id="logout_name">
    <a>LEAVE</a>
  </li>
</ul>

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

http://api.jquery.com/on/

P.S:不要使用内联样式。使用您的样式表。

【讨论】:

  • "当鼠标悬停在你的元素上时(由这个词组成)触发。" 它在进入元素以及任何后代元素时触发一次。这将产生一遍又一遍地执行相同替换的效果。它不会影响mouseleave,它只会在离开绑定元素时发生一次。真正的问题是更换。
  • ...并且不建议对文档进行委派。这确实效率低下,尤其是在 mouseenter/leave 事件中。
  • @Roko C. Buljan:使用 .html() 替换是我最初的计划,但是当我这样做时,将鼠标悬停在注销图标上时会不断闪烁,就像它不断重新加载一样。并且mouseleave 不起作用。我试过你的代码,但它对我不起作用。我不知道为什么。想法?
  • 顺便说一句,我最初是使用:hover 开始工作的,但我认为它不能显示 HTML……可以吗?
  • 不知道为什么,但要改变的是链接文本(即&lt;a href="#"&gt;link text&lt;/a&gt;)似乎已经完成了这项工作。尽管我使用了代码,但仍将其标记为已接受的答案。
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2014-03-03
  • 2014-08-02
  • 2013-03-05
相关资源
最近更新 更多