30 votes

Comment arrêter l'événement bouillonnant avec jquery live?

Je suis en train d'essayer d'arrêter de certains événements, mais stopPropagation ne fonctionne pas avec "live" donc je ne sais pas quoi faire. J'ai trouvé ceci sur leur site.

Vivre les événements n'ont pas de bulle dans le de façon traditionnelle et ne peut pas être arrêté à l'aide de stopPropagation ou stopImmediatePropagation. Par exemple, prenons le cas de deux événements click - l'un lié à "li" et un autre "li"un. Si un clic se produire à l'intérieur ancrage de ces DEUX événements seront déclenchées. C'est parce que quand une $("li").bind("click", fn); il est lié vous êtes en train de dire "à Chaque fois qu'un cliquez sur événement se produit sur un élément LI - ou à l'intérieur d'un élément LI - déclencher cette cliquez sur l'événement." Pour arrêter l' le traitement d'un événement en direct, fn doit return false

Il dit que le fn doit retourner false si ce que j'ai essayé de faire

 $('.MoreAppointments').live('click', function(e) {
   alert("Hi");
   return false;
 });

mais cela ne fonctionne pas donc je ne suis pas sûr de savoir comment faire renvoyer false.

Mise à jour

Voici quelques informations supplémentaires.

J'ai une cellule de tableau et je lier un événement click pour elle.

 $('#CalendarBody .DateBox').click(function(e)
    {
        AddApointment(this);
    });

Ainsi, le AddApointment fait juste une interface utilisateur de la boîte de dialogue.

Maintenant, le code en direct(MoreAppointments) se trouve dans la cellule du tableau et c'est en fait une balise d'ancrage. Alors, quand je clique sur la balise d'ancrage, il va d'abord le code ci-dessus(addApointment - manches de sorte que le premier événement) s'exécute mais ne se lance pas mon boîte de dialogue au lieu de cela, elle va directement à l' (MoreAppointment) de l'événement et exécute le code. Une fois que le code a exécuter, il lance la boîte de dialogue "addApointment".

Mise à jour 2

Voici le code html. Je n'ai pas de copie de l'ensemble de la table car elle est un peu grosse et toutes les cellules se répète avec les mêmes données. Si nécessaire je le posterai.

 <td id="c_12012009" class="DateBox">
        <div class="DateLabel">
            1</div>
        <div class="appointmentContainer">
            <a class="appointments">Fkafkafk fakfka kf414<br />
            </a><a class="appointments">Fkafkafk fakfka kf414<br />
            </a><a class="appointments">Fkafkafk fakfka kf414<br />
            </a><a class="appointments">Fkafkafk fakfka kf414<br />
            </a><a class="appointments">Fkafkafk fakfka kf414<br />
            </a>
        </div>
        <div class="appointmentOverflowContainer">
            <div>
                <a class="MoreAppointments">+1 More</a></div>
        </div>
    </td>

52voto

Shog9 Points 82052

La réponse courte est tout simplement, vous ne pouvez pas.

Le problème

Normalement, vous pouvez vous arrêter à un événement de "remonter" aux gestionnaires d'événement sur les éléments externes, car les gestionnaires pour les éléments internes sont appelés en premier. Cependant, jQuery "live events" travaux en attachant un proxy gestionnaire pour l'événement de votre choix à l'élément de document, et puis l'appel de l'utilisateur approprié défini par gestionnaire(s) après l'événement bulles de ce document.

Bubbling illustration

C'est en général ce qui fait de "vivre" la liaison plutôt un moyen efficace de la liaison des événements, mais il a deux gros effets secondaires: d'abord, tout gestionnaire d'événements attachés à l'intérieure d'un élément peut empêcher le "live" des événements de tirer pour lui-même ou l'un de ses enfants; en second lieu, un "live" gestionnaire d'événement ne peut pas empêcher les gestionnaires d'événements attachés directement aux enfants du document à partir de tir. Vous pouvez arrêter le traitement, mais vous ne pouvez pas faire quelque chose à propos de la transformation qui a déjà eu lieu... Et le temps de votre événement en direct, les incendies, le gestionnaire directement attaché à l'enfant a déjà été appelée.

Solution

Votre meilleure option ici (pour autant que je peux dire de ce que vous avez posté) est d'utiliser la liaison en direct pour les gestionnaires de clic. Une fois cela fait, vous devriez être en mesure d' return false de la .MoreAppointments gestionnaire de prévenir l' .DateBox gestionnaire à partir de l'appelé.

Exemple:

$('.MoreAppointments').live('click', function(e) 
{
  alert("Hi");
  return false; // prevent additional live handlers from firing
});

// use live binding to allow the above handler to preempt
$('#CalendarBody .DateBox').live('click', function(e)
{
   AddApointment(this);
});

7voto

Andrey Zavarin Points 328

J'ai utilisé ce type de code si et cela a fonctionné pour moi:

 $('#some-link').live('click', function(e) {
    alert("Link clicked 1");
    e.stopImmediatePropagation();
});

$('#some-link').live('click', function(e) {
    alert("Link clicked 2");    
});
 

donc, il me semble, que maintenant JQuery supporte stopImmediatePropagation avec des événements en direct

5voto

gnarf Points 49213

Vous pouvez peut-être vérifier que l'événement de clic ne s'est pas produit sur un élément a :

 $('#CalendarBody .DateBox').click(function(e) {
  // if the event target is an <a> don't process:
  if ($(e.target).is('a')) return;

  AddApointment(this);
});
 

Pourrait fonctionner?

3voto

RainChen Points 332

J'utilise ceci:

 if(event.target != this)return; // stop event bubbling for "live" event
 

1voto

shinkou Points 3392

j'utilise

 e.stopPropagation(); // to prevent event from bubbling up
e.preventDefault(); // then cancel the event (if it's cancelable)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X