2013-07-17 10 views
13

Ich möchte einen zusätzlichen Klick-Handler machen (Client-Seite kann nicht sein js/html ändern), und es sollte in meinem Skript wie folgt funktionieren:stopPropagation und startPropagation

1) event.stopPropagation (Pause Client Klick Propagation)
2) meine Funktion (nicht meine Funktion, wenn alles als nächstes zu tun ist, tun)
3) event.startPropagation (weiterhin Standard-Client Aktion)

Gerade jetzt, die erste und die zweite Arbeit. Das dritte ist das Problem.
Ich weiß event.startPropagation nicht existiert, aber ich will, dass so etwas. Irgendwelche Hinweise?

Antwort

4

Sie stoppen Ausbreitung in erster Linie nicht.

Testen Sie, ob my function das tut, was Sie wollen, und entscheiden Sie dann, ob Sie die Verbreitung stoppen wollen oder nicht.

+1

Wenn ich Anker klicken, um meine Funktion (auf DB GET) hat keine Zeit auszuführen. Ich denke, die notwendig stopPropagation auf Start –

+0

Sie dort die mögliche Benutzererfahrung Schaden zu berücksichtigen sind: Der Benutzer klickt auf etwas und es passiert nichts, bis ein Datenbank-Aufruf abgeschlossen ist. Worst-Case, das könnte eine lange Zeit des Nicht-Reagierens sein. – ehdv

+0

Dies ist eine schlechte Antwort, da das Stoppen der Propagierung häufig erforderlich ist, wenn mehrere Ereignisse auf demselben Element auftreten. Es ist der ganze Grund, warum die Methode existiert. – kjdion84

0

Hinzufügen und den Click-Handler entfernen, wenn Sie möchten, jeweils das Click-Ereignis aktivieren/deaktivieren. Weil event.stopPropagation() die Ereignisse davon abhält, den Dom-Baum weiter zu verbreiten.

Update:

Wenn Sie jQuery verwenden, verwenden .trigger() Funktion.

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

9

Sie können wieder lösen die gleiche Ereignisobjekts auf dem Eltern-Knoten, f.ex (jQuery). Sie müssen das Ereignisobjekt zuerst kopieren und in den Trigger passieren, um die gleichen Ereigniseigenschaften in der Blase (f.ex e.pageX) zu erfassen:

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

Demo: http://jsfiddle.net/GKkth/

EDIT

Basierend auf Ihren Kommentar, ich glaube, Sie nach etwas suchen, wie:

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

Dieser Prototyp ermöglicht es Ihnen, ein „Premium-Handler“ zu binden, die eine next Funktion enthält, die alle bisherigen Handler auf das gleiche Element ausgeführt wird, wenn Sie wollen. Verwenden Sie es wie:

$('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/

+0

Ok, ich habe es auf viele Arten versucht, ohne gutes Ergebnis. Vielleicht mache ich etwas falsch. Zum Beispiel: // Client-Seite, sein eigener Click-Handler $ ('p').click (function (e) { document.location = 'http://www.onet.pl'; }); . // mein Skript $ ('p') klicken (function (e) { e.stopPropagation(); e.preventDefault(); $ .get ( ...., ... ., Funktion() { // wenn in Ordnung, dann tun Sie etwas wie startPropagation } ) }); –

+2

@ PiotrWójcik klingt wie Sie nach 'stopImmediatePropagation()' suchen, da der Handler an das gleiche Element angefügt ist: http://api.jquery.com/event.stopImmediatePropagation/. Erinnere dich daran, dass es keine Handler stoppen wird, die zuvor daran gehindert wurden, ausgeführt zu werden. Oder vielleicht müssen Sie nur die Handler finden, die bereits gebunden sind, speichern Sie sie und führen Sie sie später in Ihrem eigenen Auslöser aus. – David

+2

@ PiotrWójcik Ich habe meine Antwort mit einer möglichen Lösung bearbeitet, ist das, was Sie brauchen? – David

Verwandte Themen