Comment dissocier le «survol» dans jQuery?


107

Comment dissocier le "survol" dans jQuery?

Cela ne fonctionne pas:

$(this).unbind('hover');

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')


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');


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

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.


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: ">)


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);
  });

});

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");

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.