| 

.NET C# Java Javascript Exception

3
Hi
Kann man mit jQuery irgendwie verhindern dass innerhalb einer kurzen Zeit nur 1 Request an den Server geschickt wird?
Grund, hat jemand eine defekte Maus oder ist etwas nervös ;), dass der Server nur 1 Request bearbeiten muss.
Dabei soll aber beim ersten Aufruf keine Verzögerung auftreten.
Grüße
24.09.2009
Chany 51 1 3
Chany 51 1 3
6 Antworten
5
Am Besten regelst du das über die Callback-Funktion, die nach einem erfolgreichen AJAX-Request optional aufgerufen werden kann, und änderst dort einfach den Zustand einer Variable.

Javascript (jQuery)-Code

var ajaxRequestInProgress= false;
function deinAufruf {
if (!ajaxRequestInProgress) {
ajaxRequestInProcess = true;
$('#deinElement').load('http://google.de/', function() {
ajaxRequestInProgress= false;
});
}
}

Diese ungetestete Beispielfunktion führt einen Request nur dann auf, wenn derzeit kein Rquest läuft. jQuery setzt hierbei das Flag/die Variable "ajaxRequestInProgress" wieder auf "false", wenn der Request abgeschlossen wurde.
24.09.2009
Blauesocke 637 2 8
und wie reagierst du wenn der Request fehlschlägt? dann bleibt ajaxRequestInProcess immer auf true und du kannst keinen weiteren Request mehr abschicken.
schulz3000 24.09.2009
Zitat aus der Dokumentation: "The function called when the ajax request is complete (not necessarily success).". Ist doch extra verlinkt.
Blauesocke 25.09.2009
1
Du könntest den betreffenden Button für die Zeit X einfach ausblenden, oder Disabled schalten.

Alternativ setzt du einfach ein WindowTimeout und prüfst vor dem Request, ob das auch schon abgelaufen ist.
24.09.2009
Martin Bassus 486 1 8
1
Als Ergänzung zu meinen Vorrednern:

Alternativ solltest du auf dem Server Anfragen ablehnen, wenn diese zu häufig kommen.
Dazu kannst du beispielsweise eine Memory-Tabelle in einer Datenbank anlegen und dort die Sessiondaten (IP, Letzter Aufruf, evtl. eine Session_ID) speichern.
Wenn die Anfragen in einem zu kurzen Intervall kommen, solltest du im Serverscript einfach einen HTTP-Header (z.Bsp.: 424, oder 503 mit entsprechendem Retry-After-Header) rausschicken und das Script beenden.

Es kann ja durchaus sein, daß der Benutzer F5 drückt, die Adresse in den Brwoser per Hand eingibt, das ganze per Script ansteuert.
25.09.2009
MiW 1,0k 1 8
1
Das hier sollte global für alle Ajax-Requets funktionieren. Du muss also nicht jeden einzelnen Ajax-Request anpassen.

jQuery.ajaxSetup({
'beforeSend': function(xhr) {
if(jQuery.ajaxSetup.requestInProgress == true)
xhr.abort();
jQuery.ajaxSetup.requestInProgress = true;
},
'success': function(){
jQuery.ajaxSetup.requestInProgress = false;
},
'error': function(){
jQuery.ajaxSetup.requestInProgress = false;
}
})
11.02.2011
Floyd 14,6k 3 9
0
liefer mit deiner Ajax-Anfrage einen Token mit, den du am Server entwertest. Kommt der Token erneut am Server an, verwerfe diese, da der Token ungültig ist.
Ich hab es in einem Projekt so eingesetzt, allerdings nicht vor dem Hintergrund des bervösen Zeigefingers, sondern aus Sicherheitsaspekten heraus.

Gruß
Rene
11.02.2011
Rene Drescher-Hackel 1,1k 1 8
0
Ähnlich wie der Code von Floyd, aber wirkt nicht global auf alle Requests, sondern nur auf die von buttons initiierten (ungetestet).
$('button, input[type=button], input[type=submit]').ajaxSend( function(e, xhr, settings)
{
if( $(this) == $(e.target) )
if( $(this).data('req_running') )
xhr.abort();
else
$(this).data('req_running',true);
}).ajaxComplete( function(e, xhr, settings)
{
if( $(this) == $(e.target) )
$(this).data('req_running',false);
});
11.02.2011
DaSpors 4,2k 2 8

Stelle deine Javascript-Frage jetzt!