如何在jQuery中读取绑定的悬停回调函数

5
我使用jQuery为页面上的元素设置了悬停回调。现在我正在编写一个模块,需要暂时为某些元素设置新的悬停行为。新模块无法访问原悬停函数的原始代码。
我想在设置新的悬停行为之前存储旧的悬停函数,以便在完成临时悬停行为后恢复它们。
我认为可以使用jQuery.data()函数来存储这些。
//save old hover behavior (somehow)

$('#foo').data('oldhoverin',???)

$('#foo').data('oldhoverout',???);

//set new hover behavior

$('#foo').hover(newhoverin,newhoverout);

使用新的悬停行为来执行操作...

//restore old hover behaviour
$('#foo').hover($('#foo').data('oldhoverin'),$('#foo').data('oldhoverout'));

但是我如何从jQuery中获取当前注册的悬停函数呢?

Shadow2531,我正在尝试在不修改最初注册回调函数的代码的情况下完成此操作。否则你的建议很好用。感谢您的建议,并帮助澄清我的搜索内容。也许我需要进入jquery的源代码并找出这些回调函数在内部是如何存储的。也许我应该将问题更改为“是否可能在不修改jquery的情况下完成此操作?”

4个回答

4
调用事件绑定方法(例如 hover)不会删除旧的事件处理程序,只会添加新的事件,因此您的“恢复”旧事件函数的想法行不通,因为它不会删除您的事件。您可以添加自己的事件,然后使用事件命名空间将其删除而不影响其他事件:http://docs.jquery.com/Events_(Guide)#Namespacing_events

1

不确定这是否有效,但你可以尝试一下:

function setHover(obj, mouseenter, mouseleave) {
  obj.data("_mouseenter", mouseenter);
  obj.data("_mouseleave", mouseleave);
  obj.hover(obj.data("_mouseenter"), obj.data("_mouseleave"));
}

function removeHover(obj) {
  obj.unbind("mouseenter", obj.data("_mouseenter"));
  obj.unbind("mouseleave", obj.data("_mouseleave"));
  obj.data("_mouseenter", undefined);
  obj.data("_mouseleave", undefined);
}

$(document).ready(function() {
  var test = $("#test");
  setHover(test, function(e) {
    alert("original " + e.type);
  }, function(e) {
    alert("original " + e.type);
  });
  var saved_mouseenter = test.data("_mouseenter");
  var saved_mouseleave = test.data("_mouseleave");
  removeHover(test);
  setHover(test, function() {
    alert("zip");
  }, function() {
    alert('zam');
  });
  removeHover(test);
  setHover(test, saved_mouseenter, saved_mouseleave);
});
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>Jquery - Get, change and restore hover handlers</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>
  <p><a id="test" href="">test</a></p>
</body>

</html>

如果不行的话,也许它会给你一些灵感。

0

我不确定这是否是您的意思,但您可以绑定自定义事件,然后触发它们。

http://docs.jquery.com/Events/bind

因此,添加您的悬停事件,编写所需的悬停功能,然后触发自定义事件。


0
也许更容易的方法是隐藏旧元素并创建一个带有事件处理程序的克隆元素?然后在完成后只需切换回旧元素即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接