Как читать функции обратного вызова связанного наведения в jquery
Я использовал 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 behavior
$('#foo').hover($('#foo').data('oldhoverin'),$('#foo').data('oldhoverout'));
Но как мне получить зарегистрированные функции зависания с jquery?
Shadow2531, я пытаюсь сделать это, не изменяя код, который первоначально регистрировал обратные вызовы. В противном случае ваше предложение будет работать нормально. Спасибо за предложение и за помощь в разъяснении того, что я ищу. Возможно, мне нужно войти в источник jquery и выяснить, как эти обратные вызовы хранятся внутри. Может быть, я должен изменить вопрос на "Можно ли это сделать без изменения jquery?"
Ответы
Ответ 1
Вызов метода события bind
(например, hover
) не удаляет старые обработчики событий, а только добавляет новые события, поэтому ваша идея "восстановить" старые функции событий не будет работать, t удалите свои события.
Вы можете добавить свои собственные события, а затем удалить их, не затрагивая никаких других событий, а затем использовать пространство имен имен: http://docs.jquery.com/Events_(Guide)#Namespacing_events
Ответ 2
Не уверен, что это сработает, но вы можете попробовать следующее:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Jquery - Get, change and restore hover handlers</title>
<script src="jquery.js"></script>
<script>
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);
});
</script>
</head>
<body>
<p><a id="test" href="">test</a></p>
</body>
</html>
Если нет, возможно, это даст вам несколько идей.
Ответ 3
Я не уверен, что это то, что вы имеете в виду, но вы можете связывать пользовательские события и затем запускать их.
http://docs.jquery.com/Events/bind
Итак, добавьте ваше событие hover, script функциональность, необходимую для этого наведения, а затем запустите свое настраиваемое событие.
Ответ 4
Может быть, было бы проще просто скрыть старый элемент и создать клон с прикрепленными обработчиками событий? Затем просто поменяйтесь обратно в старый элемент, когда закончите.