Comment dissocier le «survol» dans jQuery?

107

Comment dissocier le "survol" dans jQuery?

Cela ne fonctionne pas:

$(this).unbind('hover');
zsharp
la source
2
Essayez-vous de dissocier une fonction que vous avez attribuée à l'événement de survol, ou essayez-vous de modifier un <a> </a> survol?
Justin Niessner
Pour clarifier la question de Justin Niessner, essayez-vous de supprimer les événements Javascript / DOM ou les déclarations CSS? Ce dernier est une question plus compliquée.
absence de paupières

Réponses:

214

$(this).unbind('mouseenter').unbind('mouseleave')

ou plus succinctement (merci @Chad Grant ):

$(this).unbind('mouseenter mouseleave')

Croissant frais
la source
42
ou $ (this) .unbind ('mouseenter mouseleave')
Chad Grant
est-ce une séquence nécessaire pour mouseenter puis après mouseleave?
sanghavi7
70

En fait, la documentation jQuery a une approche plus simple que les exemples en chaîne montrés ci-dessus (bien qu'ils fonctionnent très bien):

$("#myElement").unbind('mouseenter mouseleave');

À partir de jQuery 1.7, vous pouvez également utiliser $.on()et $.off()pour la liaison d'événement, donc pour dissocier l'événement de survol, vous utiliseriez le plus simple et le plus ordonné:

$('#myElement').off('hover');

Le pseudo-nom d'événement "hover" est utilisé comme raccourci pour "mouseenter mouseleave" mais était géré différemment dans les versions précédentes de jQuery; vous obligeant à supprimer expressément chacun des noms d'événements littéraux. Utiliser $.off()maintenant vous permet de supprimer les deux événements de souris en utilisant le même raccourci.

Modifier 2016:

Encore une question populaire, il vaut donc la peine d'attirer l'attention sur le point de @ Dennis98 dans les commentaires ci-dessous que dans jQuery 1.9+, l'événement "hover" était obsolète au profit des appels standard "mouseenter mouseleave". Ainsi, votre déclaration de liaison d'événement devrait maintenant ressembler à ceci:

$('#myElement').off('mouseenter mouseleave');

Phil.Wheeler
la source
4
J'ai jQuery 1.10.2 et le $.off("hover")ne fonctionne pas. Cependant, l'utilisation des deux événements fonctionne très bien.
Alexis Wilke
Il convient de mentionner que lorsque plusieurs arguments de filtrage sont donnés, tous les arguments fournis doivent correspondre pour que le gestionnaire d'événements soit supprimé. Je note également que la documentation de l'API jQuery indique que la méthode .off () supprime les gestionnaires d'événements qui étaient attachés avec .on (). Que cela signifie que cela s'applique UNIQUEMENT aux événements ajoutés à l'aide de .on (), je ne suis pas sûr. Mais ça ne devrait pas.
Phil.Wheeler
@AlexisWilke Oui, il a été supprimé dans la v1.9, recherchez le dernier lien ..;)
Dennis98
1
@ Dennis98 - Vous parlez simplement du piratage du hover jQuery déplacé vers deprecated.js, non? la liaison d'événement $ .off () est toujours disponible dans les versions ultérieures de jQuery.
Phil.Wheeler
Droite. :) $.off()est toujours là, c'est la méthode recommandée pour dissocier les événements actuellement. Donc, à partir de maintenant, vous devez écrire $(element).off("mouseenter mouseleave");.
Dennis98
10

Dissociez les événements mouseenteret mouseleaveindividuellement ou dissociez tous les événements sur le ou les éléments.

$(this).unbind('mouseenter').unbind('mouseleave');

ou

$(this).unbind();  // assuming you have no other handlers you want to keep
Tvanfosson
la source
4

unbind () ne fonctionne pas avec les événements en ligne codés en dur.

Ainsi, par exemple, si vous souhaitez dissocier l'événement mouseover <div id="some_div" onmouseover="do_something();">, j'ai trouvé que $('#some_div').attr('onmouseover','')c'était un moyen rapide et sale de le réaliser.

Jaytop
la source
4

Une autre solution est .die () pour les événements qui se sont attachés avec .live () .

Ex.:

// attach click event for <a> tags
$('a').live('click', function(){});

// deattach click event from <a> tags
$('a').die('click');

Vous pouvez trouver une bonne référence ici: Exploration de jQuery .live () et .die ()

(Désolé pour mon anglais: ">)

Briganti
la source
2

Tout ce que fait le survol dans les coulisses est lié à la propriété mouseover et mouseout. Je lierais et délierais vos fonctions de ces événements individuellement.

Par exemple, disons que vous avez le code HTML suivant:

<a href="#" class="myLink">Link</a>

alors votre jQuery serait:

$(document).ready(function() {

  function mouseOver()
  {
    $(this).css('color', 'red');
  }
  function mouseOut()
  {
    $(this).css('color', 'blue');
  }

  // either of these might work
  $('.myLink').hover(mouseOver, mouseOut); 
  $('.myLink').mouseover(mouseOver).mouseout(mouseOut); 
  // otherwise use this
  $('.myLink').bind('mouseover', mouseOver).bind('mouseout', mouseOut);


  // then to unbind
  $('.myLink').click(function(e) {
    e.preventDefault();
    $('.myLink').unbind('mouseover', mouseOver).unbind('mouseout', mouseOut);
  });

});
Bendewey
la source
Correction, après avoir regardé le hover jquery src est en fait lié à mouseenter / mouseleave. Tu devrais faire pareil.
bendewey
2

Vous pouvez supprimer un gestionnaire d'événements spécifique qui était attaché par on, en utilisantoff

$("#ID").on ("eventName", additionalCss, handlerFunction);

// to remove the specific handler
$("#ID").off ("eventName", additionalCss, handlerFunction);

En utilisant cela, vous ne supprimerez que handlerFunction
Une autre bonne pratique consiste à définir un namespace pour plusieurs événements attachés

$("#ID").on ("eventName1.nameSpace", additionalCss, handlerFunction1);
$("#ID").on ("eventName2.nameSpace", additionalCss, handlerFunction2);
// ...
$("#ID").on ("eventNameN.nameSpace", additionalCss, handlerFunctionN);

// and to remove handlerFunction from 1 to N, just use this
$("#ID").off(".nameSpace");
Halayem Anis
la source
0

J'ai trouvé que cela fonctionne comme deuxième argument (fonction) de .hover ()

$('#yourId').hover(
    function(){
        // Your code goes here
    },
    function(){
        $(this).unbind()
    }
});

La première fonction (argument de .hover ()) est un survol de la souris et exécutera votre code. Le deuxième argument est mouseout qui dissociera l'événement de survol de #yourId. Votre code ne sera exécuté qu'une seule fois.

Foppe
la source
1
Est $.unbind()-ce que cela ne supprimerait pas tous les événements de cet objet? Dans quel cas des choses comme vos $.click()événements échoueraient maintenant, non?
Alexis Wilke