2010-01-15 4 views
3

Je veux envoyer des séquences de touches tapées dans un champ de texte, mais seulement dans un intervalle de 1s.envoyer des frappes avec ajax après 1s?

est de réduire la charge d'envoi d'une requête ajax à chaque pression de touche.

ainsi par exemple. Si l'utilisateur tape 4 lettres en une seconde, la requête enverra toutes ces 4 lettres. et disons qu'il tape non-stop en 1 min, alors le script enverra à intervalle de 1s jusqu'à ce qu'il arrête de taper.

au moment de mon script ressemble à ceci:

$("#type_post").live('keyup', function() { 
     $.post('posts.php', {post: $("#type_post").val()}); 
}); 

mais qui envoie sur tout keypress.

quelqu'un pourrait me aider

MISE À JOUR: voici le code i utilisé.

var last_post = ''; 

$('#type_post').focus(function() { 
    // check if text has been changed every second when input field is focused 
    setInterval(function() { 
      if($('#type_post').val() != last_post) 
      { 
       // if changed, post it and set the new text as last text 
       $.post('posts.php', {post: $("#type_post").val()}); 
       last_post = $("#type_post").val(); 
      } 
    }, 1000); 
}); 

Répondre

4

Eh bien, sans tenir compte de la gêne de cette fonction sera, vous aurez envie d'utiliser setTimeout() (info here) pour exécuter une fonction à chaque seconde et saisir le texte. Si c'est différent, alors faites l'appel ajax. En outre, vous ne voulez que cette option activée lorsque la zone de texte est active, vous pouvez donc définir un champ et des actions pertinentes sur les événements 'focus' et 'flou'.

+0

mais que le son ne marche pas comme une solution ultime, il doit y avoir un autre moyen d'activer ce juste à chaque touche – ajsie

+0

noname: jspcal a la solution pour vous.Vous pouvez aussi l'activer sur keypress, mais vous devez savoir quand * arrêter * le timer (dans mon exemple), dans l'approche de jspcal, vous devez simplement comparer les temps et faire la mise à jour. Probablement, sa solution est meilleure –

+0

n'utilisez pas non plus la méthode de reliure en direct. Utilisez .bind ('keyup', ...) à la place, à moins que vous ne créiez de nouvelles boîtes de champ avec cette fonctionnalité dynamiquement .. –

3

Vous pouvez stocker l'heure de la dernière mise à jour dans une variable, puis vérifier si la période de délai s'est écoulée avant de faire le post.

+0

bonne idée, mal essayer et revenir avec une mise à jour – ajsie

1

J'utilise l'Ajax pour Autocomplete jQuery, la version 1.1 qui résout ce problème bien, c'est le morceau de code inclus dans l'événement OnKeyUp:

clearInterval(this.onChangeInterval); 
    if (this.currentValue !== this.el.val()) { 
    if (this.options.deferRequestBy > 0) { 
     // Defer lookup in case when value changes very quickly: 
     var me = this; 
     this.onChangeInterval = setInterval(function() { me.onValueChange(); }, this.options.deferRequestBy); 
    } else { 
     this.onValueChange(); 
    } 
    } 

Je vous suggère de le revoir encore pleinement comprendre.

+0

donc je dois télécharger le plugin autocomplete? – ajsie

3

C'est une idée horrible d'envoyer une requête AJAX toutes les secondes. Vous devriez plutôt utiliser une combinaison de setTimeout et clearTimeout pour envoyer uniquement les demandes de frappe après que l'utilisateur a cessé de taper. Je vais avoir un exemple réparé dans une minute chaude.

var timer = 0; 
$("#type_post").live('keyup', function(e) { 
    var val = $(this).val(); 
    // clear any existing timer 
    clearTimeout(timer); 
    // set a 1 second timeout 
    timer = setTimeout(function() { keyLogger(val) }, 1000); 
}); 

function keyLogger(val) { 
    $.post('posts.php', {post: $("#type_post").val()}); 
} 
+0

mais je veux envoyer chaque seconde parce que c'est une sorte de chose en direct où les autres utilisateurs voient ce que vous tapez. – ajsie

+1

@noname - ceci sera envoyé si l'utilisateur a mis en pause la saisie pendant 1 seconde. La pause est facilement réglable en changeant le 1000 (en millisecondes) à un nombre inférieur, peut-être ** 250 **. Cela permettra de réduire les demandes (et la bande passante) et d'envoyer lorsque l'utilisateur pense à quoi taper ensuite. –

3

Une chose importante à garder à l'esprit est que, en termes d'interaction utilisateur, 4 secondes est un très longtemps à attendre que quelque chose arrive. Il est peu pratique de s'attendre à ce que l'utilisateur attende autant de temps avant de recevoir des commentaires. Cela étant dit, voici une mise en œuvre partielle, j'ai travaillé. Il ne tient pas compte de l'envoi de données après que l'utilisateur se soit brouillé, ce qui pourrait être un peu gênant à la sortie, peut-être pas. Je ne l'ai pas testé, mais le principe général est là.

var sendInterval; 
var lastValue; 
$("#type_post").focus(function() { 
     var input = $(this); 
    sendInterval = setInterval(function() { sendData(input.val()); }, 4000); 
}); 

$("#type_post").blur(function() { 
    if(sendInterval) 
     clearInterval(sendInterval); 
}); 

function sendData(data) { 
    if(lastValue != data) { 
     lastValue = data; 
     $.post('posts.php', {post: data}); 
    } 
} 
1

Je l'ai fait quelque chose de semblable avant, sauf en utilisant MooTools au lieu de jQuery ... Jetez un oeil à la fiche d'inscription à http://obviousspoilers.com/member/register (tapez un nom d'utilisateur).

J'ai codé cela avant d'en savoir plus sur JavaScript discret, donc il utilise onkeyup = "..." onblur = "...". Le code pourrait certainement être nettoyé, mais n'hésitez pas à en utiliser. JavaScript est à http://obviousspoilers.com/res/script.js, jetez un oeil à l'objet Register.

Edit:.. N'a pas lu votre question, donc ce ne sera probablement pas aider :(