Hier ist ein Beispiel. Angenommen, ich möchte eine Bildüberlagerung wie bei vielen Websites. Wenn Sie also auf eine Miniaturansicht klicken, wird über Ihrem gesamten Fenster eine schwarze Überlagerung angezeigt, in der eine größere Version des Bildes zentriert ist. Durch Klicken auf das schwarze Overlay wird es geschlossen. Durch Klicken auf das Bild wird eine Funktion aufgerufen, die das nächste Bild anzeigt.
Das HTML:
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
<img src="http://some_src" ng-click="nextImage()"/>
</div>
Das Javascript:
function OverlayCtrl($scope) {
$scope.hideOverlay = function() {
// Some code to hdie the overlay
}
$scope.nextImage = function() {
// Some code to find and display the next image
}
}
Das Problem ist, dass bei diesem Setup, wenn Sie auf das Bild klicken, beide nextImage()
und hideOverlay()
aufgerufen werden. Aber ich möchte nur nextImage()
angerufen werden.
Ich weiß, dass Sie das Ereignis in der folgenden nextImage()
Funktion erfassen und abbrechen können:
if (window.event) {
window.event.stopPropagation();
}
... Aber ich möchte wissen, ob es eine bessere AngularJS-Methode gibt, bei der ich nicht alle Funktionen von Elementen innerhalb des Overlays mit diesem Snippet voranstellen muss.
return false
am Ende der Veranstaltungonclick
, nichtng-click
.Antworten:
Was @JosephSilber gesagt hat, oder übergeben Sie das $ event-Objekt an einen
ng-click
Rückruf und stoppen Sie die Weitergabe darin:quelle
Verwendung
$event.stopPropagation()
:Hier ist eine Demo: http://plnkr.co/edit/3Pp3NFbGxy30srl8OBmQ?p=preview
quelle
ReferenceError: $event is not defined
in die Konsole.$event.stopPropagation()
an einem Ort zu platzieren, an dem es nicht funktioniert. Ich habe vergessen, es zu entfernen. Selbst wenn ich es dort platzierte, wo es funktionierte, wurde es ein zweites Mal aufgerufen, wo es nicht funktionierte. Das dysfunktionale Duplikat wurde entfernt und es ist erfolgreich. Danke für Ihre Hilfe.Ich mag die Idee, eine Richtlinie dafür zu verwenden:
Verwenden Sie dann die Direktive wie folgt:
Wenn Sie möchten, können Sie diese Lösung allgemeiner gestalten, wie diese Antwort auf eine andere Frage: https://stackoverflow.com/a/14547223/347216
quelle
stop-event
ein HTML-Attribut? Ich konnte es weder im Mozilla Developer Network noch anderswo finden.angular-eat-event
Richtlinie über Laube registriert, die auf ähnliche Weise funktioniert!Manchmal ist es am sinnvollsten, dies einfach zu tun:
Ich habe mich dafür entschieden, weil ich
myClickHandler()
die Ereignisausbreitung an den vielen anderen Orten, an denen sie verwendet wurde, nicht stoppen wollte .Sicher, ich hätte der Handlerfunktion einen booleschen Parameter hinzufügen können, aber das
stopPropagation()
ist viel aussagekräftiger als nurtrue
.quelle
$event.stopPropagation()
interne Elemente hinzufügen .checkbox
indiv
Element eingewickelt . Meindiv
nimmt 12 Spalten undcheckbox
nimmt beispielsweise 3 Spalten. Ich wollte eine Funktion aufzurufen ,A
auf klickendiv
und die FunktionB
der auf Klickcheckbox
. Als ich darauf klickte, wurdencheckbox
beide Funktionen aufgerufen. Als ich hinzufügenng-click="$event.stopPropagation()"
zucheckbox
, habe ich nur die FunktionB
aufgerufen.stopPropagation()
es darum, die Ausbreitung des Ereignisses auf übergeordnete Elemente zu stoppen. Ich bin nicht sicher, wie Sie anrufen,B
da es nicht angegeben istng-click
, aber der Sinn der Antwort ist, dass Sie dies tun können :<checkbox ng-click="B(); $event.stopPropagation()">
. Sie müssen diestopPropagation()
Funktion nicht einschließenB
.Das funktioniert bei mir:
quelle
Wenn Sie nicht möchten, dass die Stop-Weitergabe zu allen Links hinzugefügt wird, funktioniert dies ebenfalls. Ein bisschen skalierbarer.
quelle
event.target.classList.indexOf('overlay')
Und dieser Trick funktioniert auch dann gut, wenn der Div in anderen Divs verschachtelt istWenn Sie ng-click = "$ event.stopPropagation" in das übergeordnete Element Ihrer Vorlage einfügen, wird stopPropogation beim Sprudeln des Baums abgefangen, sodass Sie es nur einmal für Ihre gesamte Vorlage schreiben müssen.
quelle
Sie können eine weitere Direktive registrieren,
ng-click
die das Standardverhalten von ändertng-click
und die Ereignisausbreitung stoppt. Auf diese Weise müssten Sie nicht$event.stopPropagation
von Hand hinzufügen .quelle
IN Controller verwenden
quelle