web-dev-qa-db-fra.com

stopPropagation et startPropagation

Je veux créer un gestionnaire de clic supplémentaire (page client, ne pouvant pas modifier son js/html) et il devrait fonctionner comme ceci dans mon script: 

1) event.stopPropagation (mettre en pause la propagation des clics du client)
2) ma fonction (faire ma fonction, puis tout faire ensuite)
3) event.startPropagation (poursuivre l'action standard du client)

En ce moment, le premier et le deuxième travail. Le troisième est le problème.
Je sais que event.startPropagation n'existe pas, mais je veux quelque chose comme ça. Avez-vous des indices?

14
Piotr Wójcik

Vous pouvez relancer le même objet événement sur le noeud parent, f.ex (jQuery). Vous devez d'abord copier l'objet événement et le transmettre au déclencheur afin de capturer les mêmes propriétés d'événement dans la bulle (f.ex e.pageX):

var copy = $.extend(true, {}, e);
setTimeout(function() {
    $(copy.target.parentNode).trigger(copy);
},500);
e.stopPropagation();

Démo: http://jsfiddle.net/GKkth/

EDIT

Sur la base de votre commentaire, je pense que vous recherchez quelque chose comme:

$.fn.bindFirst = function(type, handler) {
    return this.each(function() {
        var Elm = this;
        var evs = $._data(this).events;
        if ( type in evs ) {
            var handlers = evs[type].map(function(ev) {
                return ev.handler;
            });
            $(Elm).unbind(type).on(type, function(e) {
                handler.call(Elm, e, function() {
                    handlers.forEach(function(fn) {
                        fn.call(Elm);
                    });
                });
            });
        }
    });
};

Ce prototype vous permet de lier un "gestionnaire premium" contenant une fonction next qui exécutera tous les gestionnaires précédents sur le même élément lorsque vous le souhaitez. Utilisez-le comme :

$('button').click(function() {
    console.log('first');
}).click(function() {
    console.log('second');
}).bindFirst('click', function(e, next) {
    console.log('do something first');
    setTimeout(next, 1000); // holds the other handlers for 1sec
});

DEMO: http://jsfiddle.net/BGuU3/1/

10
David Hellsing

Ne pas arrêter la propagation en premier lieu.

Testez si my function fait ce que vous voulez, puis décidez si vous allez arrêter la propagation ou non.

4
Quentin

Ajoutez et supprimez le gestionnaire de clic si vous souhaitez activer/désactiver l'événement click, respectivement. Parce que event.stopPropagation() empêchera les événements de se propager dans l’arborescence.

Mise à jour:

Si vous utilisez jQuery, utilisez la fonction .trigger().

http://api.jquery.com/trigger/

0
Dinesh