Verhindern, dass mehrere Klickereignisse JQuery auslösen

Lesezeit: 4 Minuten

Verhindern dass mehrere Klickereignisse JQuery auslosen
Liam

Hier ist das Szenario, mein Inhalt wird basierend auf einer Klasse asynchron geladen. Wenn ich also einen Link mit der Klasse ajaxLink habe, wird er wie folgt ausgelöst:

$('a.ajaxLink').click(function (e) {
        e.preventDefault();
        var container = $(this).parents('div.fullBottomContent');
        var href = $(this).attr('href');
        container.fadeOut('fast', function () {
            $.ajax({
                url: href,
                dataType: "html",
                type: "GET",
                success: function (data) {
                    container.html(data);
                    BindEventHandlers();
                    container.fadeIn();
                    $.validator.unobtrusive.parse('form');
                },
                error: function () {
                    alert('An error has occurred');
                }
            });
        });

    });

Alles schön. Jetzt möchte ich dem Benutzer in einem Fall eine Warnung anzeigen, um confirm dass sie die Seite laden und alle ihre Änderungen verlieren möchten, also habe ich dies geschrieben:

$('a.addANewHotel').click(function (e) {
        if (!confirm('Adding a new hotel will loose any unsaved changes, continue?')) {
            e.stopPropagation();
        }
    });

jetzt habe ich es versucht return false, e.preventDefault() und e.stopPropagation(); aber egal was die erste methode immer gefeuert wird? Wie kann ich verhindern, dass das zusätzliche Klickereignis ausgelöst wird? Ist das eine Sache mit der Reihenfolge der Ereignisse?

Verstehe nicht, inwiefern dies relevant ist, aber mein HTML ist:

<a style="" href="https://stackoverflow.com/CMS/CreateANewHotel?regionID=3&amp;destinationID=1&amp;countryName=Australia" class="button wideBorderlessButton ajaxLink addANewHotel">Add a new hotel</a>

  • Wie sieht dein HTML-Code aus?

    – Asciiom

    3. Okt ’12 um 12:44

  • Ich verstehe nicht, warum Sie dies tun, indem Sie 2 verschiedene Ereignisse an dasselbe Element binden. Ich würde die Bestätigungsnachricht nur anzeigen/nicht anzeigen, je nachdem, auf welches Element geklickt wurde, aber alle innerhalb desselben Klickereignisses (z. B. mithilfe einer hasClass if)

    – Th0rndike

    3. Okt. ’12 um 12:49


  • Natürlich ist es relevant, erst jetzt wissen wir, dass es nur eines gibt aTag mit mehreren Klassen und Sie binden zwei Klick-Handler an dasselbe Tag.

    – Asciiom

    3. Okt. ’12 um 12:49

  • @ThOrndike Ich nehme an, ich könnte das tun, aber es ist nicht sehr elegant. Der Ajax-Link-Code funktioniert, es scheint schade, ihn mit vielen anderen zu überladen

    – Liam

    3. Okt. ’12 um 12:52

  • Sind die zwei $(..).click() Anrufe in der gleichen Reihenfolge ausgeführt, die Sie in Ihrem Beitrag geschrieben haben?

    – FixMaker

    3. Okt. ’12 um 12:56

1641972315 834 Verhindern dass mehrere Klickereignisse JQuery auslosen
bstakes

Hast du es versucht: event.stopImmediatePropagation?

Ich glaube das ist das was du suchst:

http://api.jquery.com/event.stopImmediatePropagation/

$('a.addANewHotel').click(function (e) {
        if (!confirm('Adding a new hotel will loose any unsaved changes, continue?')) {
            e.stopImmediatePropagation();
            e.preventDefault();
        }
    });

  • Wird nicht funktionieren. Er hat zwei Handler für dasselbe Element, dies würde nur die Weitergabe an die übergeordneten Elemente stoppen und ihm bei diesem Problem nicht helfen.

    – Asciiom

    3. Okt. ’12 um 12:54

  • Aus den Dokumenten: “Verhindert die Ausführung des Rests der Handler und verhindert, dass das Ereignis den DOM-Baum aufbläst.”

    – bStakes

    3. Okt. ’12 um 12:55

  • ändere meine Meinung, das ist eine schönere Lösung! Es war eine kleine Anpassung erforderlich, sodass der Code schließlich so aussah: if (!confirm('Adding a new hotel will loose any unsaved changes, continue?')) { e.stopImmediatePropagation(); e.preventDefault(); }

    – Liam

    3. Okt ’12 um 13:07

  • Wow… Mein Leben gerettet! Danke 🙂 das funktioniert sogar mit Angular2, wenn ich die Situation habe, jquery click event unter Angular2 zu verwenden!!!

    – normalUser

    29. August ’16 um 12:00

Verhindern dass mehrere Klickereignisse JQuery auslosen
Asciiom

stopPropagation würde das Bubbling des Ereignisses zu den übergeordneten Elementen stoppen, nicht aber das Auslösen anderer Klick-Handler auf demselben Element verhindern. Deine Lösung wird also nicht funktionieren.

Du könntest es zum Beispiel so machen:

$('a.ajaxLink').click(function (e) {
    e.preventDefault();

    if($(this).hasClass("a.addANewHotel") &&
           !confirm('Adding a new hotel will loose any unsaved changes, continue?')){
        return false;
    }

    var container = $(this).parents('div.fullBottomContent');
    var href = $(this).attr('href');
    container.fadeOut('fast', function () {
        $.ajax({
            url: href,
            dataType: "html",
            type: "GET",
            success: function (data) {
                container.html(data);
                BindEventHandlers();
                container.fadeIn();
                $.validator.unobtrusive.parse('form');
            },
            error: function () {
                alert('An error has occurred');
            }
        });
    });

});

Wenn Sie viele verschiedene Arten von Links haben, sollten Sie den gemeinsamen Code in eine Funktion einfügen und die Handler mithilfe der differenzierenden Klasse binden. Diese Handler können dann gegebenenfalls den allgemeinen Code aufrufen.

  • +1 Ja, das könnte ich, wäre es schöner, wenn ich meinen generischen AjaxLink-Klick nicht mit vielen anderen überladen müsste?

    – Liam

    3. Okt. ’12 um 12:54

  • Hängt davon ab, wenn Sie viele verschiedene Arten von Links haben würden, die eine andere Handhabung benötigen, würde dies überladen, aber für diese eine Ausnahme ist es meiner Meinung nach akzeptabel. Zusätzlicher Vorschlag zur Antwort hinzugefügt.

    – Asciiom

    3. Okt. ’12 um 12:56


.

428120cookie-checkVerhindern, dass mehrere Klickereignisse JQuery auslösen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy