Javascript: Wie vorübergehend alle Aktionen auf der Seite deaktivieren?

8

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.

%Vor%

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.

    
ami 20.04.2009, 08:27
quelle

5 Antworten

9

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%     
NickZoic 20.04.2009, 09:12
quelle
2

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

    
Steve Harrison 20.04.2009 08:54
quelle
1

AJAX. Asynchron. Machen Sie die HTTP-Anfrage einfach synchron. Problem gelöst.

    
annakata 20.04.2009 09:32
quelle
1

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.

    
ozan 20.04.2009 09:40
quelle
0

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.

    
LaustN 20.04.2009 10:37
quelle

Tags und Links