Как читать связанные функции обратного вызова при наведении в jQuery
-
09-06-2019 - |
Вопрос
Я использовал 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?»
Решение
Вызов события bind
метод (например, hover
) не удаляет старые обработчики событий, а только добавляет новые события, поэтому ваша идея «восстановления» старых функций событий не сработает, поскольку она не удалит ваши события.
Вы можете добавить свои собственные события, а затем удалить их, не затрагивая другие события, а затем использовать пространство имен событий: http://docs.jquery.com/Events_(Guide)#Namespacing_events
Другие советы
Не уверен, что это сработает, но вы можете попробовать следующее:
<!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>
Если нет, возможно, это натолкнет вас на некоторые идеи.
Я не уверен, что вы это имеете в виду, но вы можете связать пользовательские события, а затем запускать их.
http://docs.jquery.com/Events/bind
Поэтому добавьте событие наведения, создайте сценарий функций, необходимых для этого наведения, а затем запустите свое собственное событие.
Может быть, было бы проще просто скрыть старый элемент и создать его клон с прикрепленными обработчиками событий?Затем просто замените старый элемент, когда закончите.