Как читать связанные функции обратного вызова при наведении в jQuery

StackOverflow https://stackoverflow.com/questions/48931

  •  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

Поэтому добавьте событие наведения, создайте сценарий функций, необходимых для этого наведения, а затем запустите свое собственное событие.

Может быть, было бы проще просто скрыть старый элемент и создать его клон с прикрепленными обработчиками событий?Затем просто замените старый элемент, когда закончите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top