Auf einer Seite mit Ajax-Ereignis möchte ich alle Aktionen deaktivieren, bis der Ajax-Aufruf zurückkehrt (um Probleme mit doppeltem Senden usw. zu vermeiden).
Ich habe das probiert, indem ich return false;
den aktuellen onclick-Ereignissen vorstellte, wenn ich die Seite "sperrte", und dies später entfernte, wenn ich die Seite entsperrte. Die Aktionen sind jedoch nicht mehr aktiv, nachdem sie "entsperrt" wurden - Sie können sie einfach nicht auslösen.
Warum funktioniert das nicht? Siehe Beispielseite unten. Irgendeine andere Idee, um mein Ziel zu erreichen?
Beispielcode:
Sowohl der Link als auch die Schaltfläche zeigen eine JS-Warnung. Wenn Sie die Sperre drücken, entsperren Sie den Ereignishandler genauso wie zuvor, aber nicht ...?!?
Der Code soll am Ende mit Trinidad arbeiten, sollte aber auch draußen funktionieren.
Danke Jungs für Ihre Ideen und Antworten.
Jetzt sehe ich, dass ich Strings und Funktionen durcheinander gebracht habe, was offensichtlich nicht funktionieren kann (
Ich hätte klarstellen sollen, dass wir einige Web-FW- und -Tag-Bibliotheken (Trinidad) verwenden, die den Code für die Ereignisbehandlung (und Ajax) erstellen, daher kann ich diesen nicht direkt bearbeiten oder synchrone Ajax usw. verwenden.
Außerdem ist Ajax nur ein Szenario, in dem dieser Code ausgeführt werden soll. Der Zweck besteht darin, zu verhindern, dass der Benutzer eine Seite / Aktion doppelt einreicht, was auch für Nicht-Ajax-Seiten relevant ist, auf die Sie auf eine Schaltfläche klicken können. Ich weiß, dass dies nicht wirklich sicher ist, und es ist nur ein "Bequemlichkeits" -Ding, um zu vermeiden, die Navigationsfehlerseite zu oft zu bekommen (wir haben natürlich serverseitigen Schutz).
Also, werde wahrscheinlich die div-Überlagerung versuchen.
Danke nochmal,
Christoph.
Wie wäre es mit der Einrichtung einer globalen var
? %Vor%wird erhöht, wenn der AJAX-Aufruf beginnt und wird dann dekrementiert, wenn der AJAX-Aufruf beendet ist. Alle Ihre "action" -Handler können dann mit
beginnen %Vor%Viel einfacher als das Debuggen von selbst modifizierendem Code!
Alternativ können Sie zum Sperren Ihrer Steuerelemente Folgendes festlegen:
%Vor%, die den Bonus haben, sie auszugrauen, so dass es für den Benutzer offensichtlich ist, dass sie sich nicht einreichen können. Um zu entsperren, einfach:
%Vor%NEUE IDEE BASIEREND AUF KOMMENTAREN (kann Code in Kommentaren nicht zitieren, es erscheint ...):
Sie können immer nur zusätzliche Attribute von Javascript-Objekten hängen:
Zum Sperren könnten Sie:
%Vor%Zum Entsperren könnten Sie:
%Vor% Ich habe dieses Ziel einmal erreicht, indem ich ein DIV erstellt habe, das den Bereich abdeckte, den ich deaktivieren wollte, sein z-index
höher als jedes der anderen Elemente auf der Seite setzte und dann opacity
auf 0
einstellte. Standardmäßig wurde dieses DIV von display: none
versteckt, so dass es nichts stören würde. Als ich jedoch wollte, dass der Bereich deaktiviert wird, setze ich einfach display
auf block
.
Steve
Das Problem mit Ihrem Code ist ein Ergebnis davon, dass Sie sich nicht mit JavaScript-Typen beschäftigen.
Wenn Sie sagen:
%Vor%was dies tut ist coerce el [i] .onclick (was eine Funktion ist) zu einer Zeichenkette, dann verkettet es mit der Zeichenkette 'return false;'. Dann, wenn Sie es wie folgt neu zuweisen:
%Vor%onclick, das zuvor eine Funktion war, ist jetzt eine Zeichenkette.
Dann versuchen Sie, Ihre alte Funktion aus der Zeichenkette wiederzubeleben, indem Sie eine Teilzeichenkette nehmen:
%Vor%was gut ist, außer newEvent ist immer noch eine Zeichenkette! Wenn Sie es also wieder onclick zuweisen, weisen Sie die Zeichenfolgendarstellung der ursprünglichen Funktion zu, nicht die Funktion selbst.
Sie könnten eval verwenden, um die Zeichenfolge auszuwerten und die Funktion zurückzugeben, aber tun Sie das bitte nicht. Es gibt eine Reihe von besseren Möglichkeiten, dies zu tun, wie von anderen Kommentatoren vorgeschlagen wurde.
Ich würde auch fragen, warum Sie AJAX überhaupt verwenden möchten, wenn Sie keine asynchronen Anfragen zulassen wollen.
Die Verwendung eines Div-Overlays verhindert nicht, dass ein Benutzer auf Ihre Seite ein Tabstop ausführt. Normalerweise ist das in Ordnung, da die meisten Benutzer sowieso keine Seite durchblättern.
Wenn Sie auf Ihrer Seite Tastaturkürzel verwenden, sind diese immer noch verfügbar, so dass für diese eine separate Handhabung erforderlich ist.
Alse, ich gehe davon aus, dass das Klicken auf ein Element, das einen Fokus haben kann (zB ein <a>
-Tag) und dann das Drücken der Eingabetaste, immer noch zu einer doppelten Übergabe führen würde.
Tags und Links javascript events