2011-11-22 1 views
1

Je fais un système de MP, et j'ajoute actuellement le système vedette du message (de sorte que l'utilisateur peut afficher des messages en étoile). Le problème est que si l'utilisateur garde un message très rapidement en train d'afficher et de déconnecter un message (en cliquant dessus encore et encore), il dérangera le serveur (l'hôte mettra une erreur 503 jusqu'à ce que les processus s'arrêtent). Pour démarrer un message, il suffit de cliquer sur l'étoile pour l'activer/cliquer de nouveau pour la désapparaître.Comment puis-je limiter le nombre de clics sur un élément dans une minute?

est-il un moyen de l'empêcher d'être cliqué beaucoup, ou plutôt faire une erreur pop-up après avoir cliqué est x nombre de fois dans une minute? Cela l'empêcherait de surcharger le serveur car lorsque vous cliquez sur l'étoile, il envoie une requête AJAX et met à jour la base de données; quand vous le désengagez, ça fait la même chose.

Existe-t-il un moyen jQuery d'afficher une erreur si l'utilisateur a cliqué sur l'étoile au bout d'une minute environ?

Ce sont mes fonctions pour la vedette:

function addStar(id) { 
    $('#starimg_' + id).removeClass("not_starred").addClass("starred"); 
    $('#star_' + id).attr({ 
     'title': 'Starred', 
     'onclick': 'removeStar(' + id + ')' 
    }); 
    $.get('tools.php?type=addstar', {id: id}, function(data) { 
    if(data=='true') { // tools.php will echo 'true' if it is successful 
    alertBox('The message has been starred successfully', 2500); 
    } 
    else { alertBox('An error has occurred. Please try again later.'); } 
}); 
} 

function removeStar(id) { 
    $('#starimg_' + id).removeClass("starred").addClass("not_starred"); 
    $('#star_' + id).attr({ 
     'title': 'Not starred', 
     'onclick': 'addStar(' + id + ')' 
    }); 
    $.get('tools.php?type=removestar', {id: id}, function(data) { 
    if(data=='true') { // tools.php will echo 'true' if it is successful 
    alertBox('The message has been unstarred successfully', 2500); 
    } 
    else { alertBox('An error has occurred. Please try again later.'); } 
}); 
} 

Merci à l'avance!

+2

http://stackoverflow.com/questions/5031501/how-to-rate-limit-ajax-requests – SuitedSloth

+0

vous pouvez aussi utiliser ceci: http://stackoverflow.com/questions/7804312/remy- sharps-function-throttler – SuitedSloth

+0

@juand: merci. – Nathan

Répondre

1

est ici une solution d'échantillon pour votre fonction addStar. Cela enverra la requête 2 secondes après le dernier clic des utilisateurs, donc si l'utilisateur est cliqué, ces clics intermédiaires n'enverront pas de requêtes puisque le temporisateur sera réinitialisé.

function addStar(id, delayRequests) 
{ 
    ... 
    if(delayRequests == true){ 
     clearTimeout(timer); 
     timer= setTimeout(function() { sendRequestToAddStar(id); },2000); 
    } 
    else{ 
     sendRequestToAddStar(id); 
    } 
} 

function sendRequestToAddStar(id) 
{ 
    $.get('tools.php?type=removestar', {id: id}, function(data) {... 
} 
+0

Wow, merci. :) Je ferais aussi la même chose pour la fonction 'removeStar()', ou en aurais-je besoin pour la fonction 'addStar()'? – Nathan

+0

que vous pouvez .. ou vous pouvez également avoir un sendRequest et un paramètre de passe pour décider d'ajouter ou de supprimer des étoiles, c'est à vous de décider. – zero7

+0

Très bien. Je vais essayer ça maintenant. C'est juste parfait. Et je viens de remarquer qu'il est stupide de dire "Le message a été joué" parce que lorsque vous cliquez sur l'étoile, cela indique que vous l'avez joué. – Nathan

1

Dans tous les cas, IMO il est préférable de ne pas afficher un message d'erreur.

Envisagez de démarrer/réinitialiser un compte à rebours à chaque fois que vous cliquez sur l'étoile. Une fois le décompte terminé, envoyez l'état actuel de l'étoile. Les commentaires des utilisateurs sont conservés et la limitation de débit est respectée.

Ils n'ont pas besoin de savoir qu'il y a une limite de débit ou qu'ils n'envoient pas de demande à chaque fois.

(Ce fut beaucoup de mots pour décrire un problème simple, et je pense que nous savons ce que « avec un message » signifie w/o une image :)

+0

C'est une très bonne idée. Merci. Et oui c'était beaucoup de mots, et l'image était inutile, c'est pourquoi je l'ai enlevé :) – Nathan

Questions connexes