2010-02-05 4 views
0

Je suis en train de créer un système de discussion en ligne, mais j'ai rencontré un problème. J'ai mis en place une fonction en javascript pour vérifier si l'utilisateur appuie sur entrer dans la zone de texte et envoyer le message si cela s'est produit. Le problème est que chaque fois que cette fonction est utilisée, la zone de texte est laissée avec un seul retour de chariot comme si la valeur de la zone de texte était "\ n" alors qu'elle devrait être juste "". Voici le code:Problèmes d'effacement <textarea> après l'envoi du message

function checkEnter(e) { 
var charCode; 
if (e && e.which) { 
    charCode = e.which; 
} else { 
    charCode = e.keyCode; 
} 
if (charCode == 13) { 
    say(); 
    document.getElementById('chatfieldbox').value = ""; 
    return false; 
} else { 
    return true; 
} 
} 
function say() { 
updateStats(); 
text = document.getElementById('chatfieldbox').value; 
xhr=new XMLHttpRequest(); 
xhr.open("POST", "say", false); 
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xhr.setRequestHeader("Content-length", text.length); 
xhr.setRequestHeader("Connection", "close"); 
xhr.send("text=" + text); 
document.getElementById('chatfieldbox').value = ""; 
update(); 
} 
function updateStats() { 
var text = document.getElementById('chatfieldbox').value; 
var num = text.length; 
var lines = 1; 
for (var i = 0; i < num; i++) { 
    if (text.charAt(i) == '\n') { 
    lines++; 
    } 
} 
document.getElementById('characters').innerHTML = num; 
document.getElementById('lines').innerHTML = lines; 
} 

say(); fait des trucs ajax pour envoyer le message. updateStats(); est juste un compteur de caractères et de lignes pour le bénéfice de l'utilisateur. dire(); envoie le message au serveur puis appelle à mettre à jour pour voir s'il y a des messages de quelqu'un d'autre à afficher (non pertinents). Le code HTML:

<textarea id="chatfieldbox" onKeyPress="checkEnter(event)"></textarea> 

Des suggestions?

+0

pouvez-vous publier les fonctions say() et updateStats()? – glomad

+0

Ajout des autres fonctions ... Je ne pense pas qu'elles soient pertinentes si ... – Puddingfox

+0

sûr qu'elles sont ... nous avons besoin de voir où va le contrôle. – glomad

Répondre

1

Un couple de choses que je pense que aiderait:

Utilisez l'événement keyDown (si pas déjà):

textarea.onkeyDown = checkEnter; 

En checkEnter vous devez passer la référence textarea à la fonction par exemple:

if (charCode == 13) { 
    elm = e.target || e.srcElement; 
    say(elm); 
    return false; 
} else { 
    return true; 
} 

Et dans la fonction say, effacez la valeur lorsque vous obtenez une réponse positive de la part de serveur.

function say(elm){ 
    var txt = elm.value; 
    //make the ajax call and when done, call the 2nd param function 
    call('say', function(resp){ 
     if(resp.ok){ 
      elm.value = ''; 
      doSomethingWith(txt); 
     }else{ 
      //show error 
     } 
    }); 
} 
+0

J'ai fini par le réparer moi-même en utilisant setTimeout ("clearTextarea()", 10); attendre 10 millisecondes après avoir appuyé sur enter pour effacer la zone de texte. Mais je suppose que votre réponse atteindrait la même chose, alors j'ai marqué comme réponse. – Puddingfox

+1

Vous ne devriez pas utiliser setTimeout de cette manière. D'abord espérer que 10 ms suffiront à tout le monde à chaque fois, qui sait ce qui peut arriver, et ensuite vous ne devriez pas utiliser string dans setTimeout, mais une fermeture setTimeout (function() {... votre code ...}, msecs). Merci pour le drapeau. – Mic

4

Dans votre code, la position return false; garantit que document.getElementById('chatfieldbox').value = ""; ne sera jamais appelé. Changez les positions des deux lignes et cela devrait fonctionner. Pourquoi ne supprimez-vous pas la zone de texte avant d'envoyer la requête ajax?

+0

Ok, j'ai résolu cela et le problème persiste. C'était un double de la même ligne à la fin de say(); en tous cas. – Puddingfox

+0

est votre '' tous sur une seule ligne (comme vous l'avez collé ici) ou sont-ils sur leurs lignes séparées? –

+0

Ils sont sur la même ligne. – Puddingfox

2

modifier: annuler l'événement bubbling.

function say() { 
    text = document.getElementById('chatfieldbox').value; 
    document.getElementById('chatfieldbox').value = ""; 
    xhr=new XMLHttpRequest(); 
    xhr.open("POST", "say", false); 
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xhr.setRequestHeader("Content-length", text.length); 
    xhr.setRequestHeader("Connection", "close"); 
    xhr.send("text=" + text); 
    update(); 
} 

function checkEnter(e) { 
    var charCode; 
    if (e && e.which) { 
     charCode = e.which; 
    } else { 
     charCode = e.keyCode; 
    } 
    if (charCode == 13) { 
     say(); 
     if (e.stopPropagation) { 
      e.stopPropagation(); 
     } else { 
      window.event.cancelBubble=true; 
     } 
     return false; 
    } else { 
     return true; 
    } 
} 
+0

Cela simplifie le code, mais n'a pas résolu le problème. – Puddingfox

+1

Je vois quel est le problème. Vous effacez le TA, mais l'événement de frappe 'entrée' est toujours envoyé après. Retour false ne suffit pas, vous devez ajouter e.stopPropagation() ou e.cancelEvent() avant de retourner de checkEnter(). – glomad

+0

J'ai essayé cela et aucune de ces fonctions n'a fonctionné. En fait, la console d'erreur de Firefox m'a dit cancelEvent() n'était pas une fonction. – Puddingfox

Questions connexes