2016-03-25 8 views
0

Ich habe die iframes auf meiner Website mit AJAX ersetzt. Es ist jetzt viel besser und viel schneller. Benutzer können auf die Schaltfläche zum Aktualisieren klicken, um die dynamischen Bereiche zu aktualisieren.Timeout JavaScript-Funktion nach dem Klicken

Ich bin mit dieser Funktion dafür:

function djrefresh() { 
    $('#dj_status').load('inc/dj_status_frame.php'); 
    $('#djbanner').load('inc/djbanner.php'); 
    $('#djknopjes').load('inc/dj_knopjes_frame.php'); 
    $('#djzegt').load('inc/dj_zegt_frame.php'); 
    $('#djfooter').load('inc/footer_frame.php'); 
    $('#berichtenbalkframe').load('inc/berichtenbalk_frame.php'); 
} 

Arbeiten völlig in Ordnung, aber meine Website braucht eine Menge Sachen auf einmal zu laden. Ich möchte, dass der Benutzer in der Lage ist, einmal darauf zu klicken und eine Zeitüberschreitung von 30 Sekunden zu erhalten.

... oder wenn Sie eine bessere Idee haben, bitte sagen Sie mir. Ich möchte nicht, dass der Benutzer meine Website mit meinen eigenen Skripten DDOS. Danke im Voraus.

+0

was sollte nach der Zeitüberschreitung geschehen? – phenxd

+0

'setInterval (djrefresh, 30000)' – dfsq

+0

Zu beachten: Es gibt nichts, was einen Benutzer davon abhält, Ihren Code wie gezeigt zu nehmen und ihn einfach 10000-mal zu wiederholen. Zum Beispiel: 'für (var i = 0; i <10000; i ++) $ ('# dj_status'). Load ('inc/dj_status_frame.php');'. Dies könnte von der Konsole Ihrer Webseite aus ausgeführt werden. Es ist sehr wichtig, dass Sie diese Probleme serverseitig und nicht clientseitig angehen, da dem Client nicht vertraut werden kann, nicht einmal deren Anrufe. Darüber hinaus wird ein DDoS normalerweise von einer großen Vielzahl von IPs durchgeführt, die nur Spam-Anfragen senden; Sie neigen nicht dazu, mit Seiten zu interagieren, wenn sie nicht einfach zu automatisieren sind. –

Antwort

1

Ändern Ihrer Websites Arcituct ist wahrscheinlich die beste Option, aber ohne weitere Informationen ist es schwierig, irgendwelche Empfehlungen zu geben. Um Anrufe auf djrefresh zu beschränken, können Sie eine Entprellfunktion verwenden. UnderscoreJS enthält die Funktion oder Sie können selbst eine schreiben.

function debounce(func, wait, immediate) { 
    var timeout; 
    return function() { 
     var context = this, args = arguments; 
     var later = function() { 
      timeout = null; 
      if (!immediate) func.apply(context, args); 
     }; 
     var callNow = immediate && !timeout; 
     clearTimeout(timeout); 
     timeout = setTimeout(later, wait); 
     if (callNow) func.apply(context, args); 
    }; 
}; 

Dieses von https://davidwalsh.name/javascript-debounce-function genommen wird (ich habe es durchaus ein wenig persönlich in Anspruch genommen).
Dies setzt voraus, dass der "Refresh-Button" eine Schaltfläche ist, die die Seite aktualisiert, nicht den Browser.
Edit: Wenn Sie eine Schaltfläche zum Aktualisieren auf Ihrer Website haben, wäre es einfacher, es für 30 Sekunden zu deaktivieren, nachdem es geklickt wurde.

+0

Scheint wie ein gutes Skript, das Sie dort bekommen haben. Allerdings bin ich noch nicht so weit mit Javascript und könnte eine Frage sein, aber wie könnte ich es mit meinem Skript verwenden? –

+0

Die Implementierung von Debouce für Sie wäre 'debounce (djrefresh, 30000)', wo Sie gerade 'djrefresh' aufrufen. –

+0

Yup, das funktioniert, vielen Dank! –

0

Erstellen Sie einfach eine Anzahl der Anrufe, verwenden Sie einen Rückruf für die Anrufe, wenn die Belastung für alle beendet ist, dann können Sie die Funktion fortsetzen.

var djrefresh; 

//close values to reduce variable name collision 
(function(){ 
var locked = false; 
var callcount = 0; 
djrefresh = function() { 
    if(locked) return; 
    locked = true; 
    $('#dj_status').load('inc/dj_status_frame.php',unlock); 
    $('#djbanner').load('inc/djbanner.php',unlock); 
    $('#djknopjes').load('inc/dj_knopjes_frame.php',unlock); 
    $('#djzegt').load('inc/dj_zegt_frame.php',unlock); 
    $('#djfooter').load('inc/footer_frame.php',unlock); 
    $('#berichtenbalkframe').load('inc/berichtenbalk_frame.php',unlock); 
} 
function unlock(){ 
    if(++callcount == 6) locked = false; 
} 
})() 
Verwandte Themen