Как читать связанные функции обратного вызова в jQuery - PullRequest
3 голосов
/ 08 сентября 2008

Я использовал 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 ]

3 голосов
/ 08 сентября 2008

Вызов метода bind (например, hover) не удаляет старые обработчики событий, а только добавляет новые события, поэтому ваша идея «восстановления» старых функций событий не будет работать, как это было бы t удалить ваши события.

Вы можете добавить свои собственные события, а затем удалить их, не затрагивая другие события, а затем использовать пространство имен событий: http://docs.jquery.com/Events_(Guide)#Namespacing_events

1 голос
/ 08 сентября 2008

Не уверен, что это будет работать, но вы можете попробовать это:


<!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>

Если нет, возможно, это даст вам некоторые идеи.

0 голосов
/ 08 сентября 2008

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

0 голосов
/ 08 сентября 2008

Я не уверен, что это то, что вы имеете в виду, но вы можете связать пользовательские события и затем вызвать их.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...