Pergunta

Usei jQuery para definir retornos de chamada flutuantes para elementos em minha página.Agora estou escrevendo um módulo que precisa definir temporariamente um novo comportamento de foco para alguns elementos.O novo módulo não tem acesso ao código original das funções de foco.

Quero armazenar as funções de foco antigas antes de definir novas, para que possa restaurá-las quando terminar o comportamento de foco temporário.

Eu acho que eles podem ser armazenados usando o jQuery.data() função:

//save old hover behavior (somehow)

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

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

//set new hover behavior

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

Faça coisas com o novo comportamento de pairar...

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

Mas como obtenho as funções de foco atualmente registradas no jQuery?

Shadow2531, estou tentando fazer isso sem modificar o código que registrou originalmente os retornos de chamada.Sua sugestão funcionaria bem de outra forma.Obrigado pela sugestão e por ajudar a esclarecer o que procuro.Talvez eu tenha que ir até a fonte do jquery e descobrir como esses retornos de chamada são armazenados internamente.Talvez eu deva mudar a pergunta para "É possível fazer isso sem modificar o jquery?"

Foi útil?

Solução

Chamando um evento bind método (como hover) não exclui manipuladores de eventos antigos, apenas adiciona seus novos eventos, portanto, sua ideia de 'restaurar' as funções de eventos antigas não funcionaria, pois não excluiria seus eventos.

Você pode adicionar seus próprios eventos e removê-los sem afetar nenhum outro evento. Em seguida, use o namespace de eventos: http://docs.jquery.com/Events_(Guide)#Namespacing_events

Outras dicas

Não tenho certeza se isso funcionará, mas você pode tentar o seguinte:


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

Se não, talvez lhe dê algumas ideias.

Não tenho certeza se é isso que você quer dizer, mas você pode vincular eventos personalizados e acioná-los.

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

Portanto, adicione seu evento de foco, crie o script da funcionalidade necessária para esse foco e acione seu evento personalizado.

Talvez fosse mais fácil simplesmente ocultar o elemento antigo e criar um clone com seus manipuladores de eventos anexados?Em seguida, basta trocar de volta o elemento antigo quando terminar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top