2011-08-23 5 views
2

http://jsbin.com/ezecun/edit#javascript,htmlonkeyup trop lent

Je dois écrire cette façon parce qu'il est dynamicly fait, le code réel ci-dessous. Je l'ai simplifié un peu dans le jsbin. Fondamentalement, il faut si longtemps pour mettre à jour le tableau avec la valeur de la boîte, il est inutilisable.

Merci d'avoir regardé.

CODE: php

echo "<label style='float:left'>Comments: </label> <textarea onKeyUp=\"editItemInCart(this.value,'comments',".$itemNum.")\" onChange=\"editItemInCart(this.value,'comments',".$itemNum.")\" >".$cart['comments']."</textarea><br />"; 

javascript

function editItemInCart(newValue,fieldName,itemNum) { 
    jQuery.ajax({ 
     type:"POST", 
     url: "editItem.html", 
     data: "newvalue=" + newValue + "&fieldname=" + fieldName + "&itemNum=" + itemNum, 
    }) 
    //alert(newValue + fieldName + itemNum); 
} 
+0

À quoi vous attendez-vous? –

+2

Ce n'est pas l'événement de touche qui est lent, mais le script doit attendre que le serveur réponde à la requête AJAX. Avez-vous mesuré le temps nécessaire à editItem.html pour traiter la requête? – JJJ

+0

Je veux mettre à jour un tableau avec de nouvelles valeurs basées sur les deux événements là-bas. La page est en moins d'une seconde, pas de problème. Je pense que l'ajout d'un délai où il attend l'inactivité, puis les mises à jour seraient mieux, donc ce n'est pas constamment tirant. – oneadvent

Répondre

2

Voulez-vous vraiment poster sur chaque touche dactylographiées ou lorsque l'utilisateur se termine taper? La plupart des gens peuvent taper un mot entier avant qu'une lettre ne soit traitée. Vous avez besoin d'un compte. Quelque chose comme ceci:

var count = 0; 
function doEditItemInCart(newValue,fieldName,itemNum) 
{ 
    count++; 
    setTimeout("editItemInCart('"+newValue+"','"+fieldName+"',"+itemNum+","+count+")",200); 
} 
function editItemInCart(newValue,fieldName,itemNum,cnt) { 
if (count == cnt) { 
     count = 0; 
     jQuery.ajax({ 
      type:"POST", 
      url: "editItem.html", 
      data: "newvalue=" + newValue + "&fieldname=" + fieldName + "&itemNum=" + itemNum, 
     }) 
     //alert(newValue + fieldName + itemNum); 
    } 
} 
+0

D'accord, cela fonctionne beaucoup mieux, c'est toujours un retard, mais pas aussi mauvais. Je pense que je dois mettre un div "sauvegardé" quelque part afin que le client le sache. Marqué répondu. – oneadvent

0

Sur la base de vos commentaires, il semble que vous voulez debounce l'événement keyup. Je recommande jQuery throttle/debounce plugin de Ben Alman. Le code ci-dessus élimine les gestionnaires d'événements en ligne, vous offrant ainsi une bonne séparation entre le code et le balisage.

+0

Je ne veux pas vraiment ajouter une autre bibliothèque, même petite. La réponse que j'ai marquée utilise le code que j'ai déjà. Merci quand même! – oneadvent