Javascript 问题清除<;textarea>;消息发送后
我目前正在制作一个基于网络的聊天系统,但我遇到了一个问题。我在javascript中设置了一个函数来检查用户是否在文本区域中按enter键,并在出现这种情况时发送消息。问题是,每次使用该函数时,textarea中都会留下一个回车符,就好像textarea的值是“\n”,而它应该是“”。代码如下:Javascript 问题清除<;textarea>;消息发送后,javascript,html,Javascript,Html,我目前正在制作一个基于网络的聊天系统,但我遇到了一个问题。我在javascript中设置了一个函数来检查用户是否在文本区域中按enter键,并在出现这种情况时发送消息。问题是,每次使用该函数时,textarea中都会留下一个回车符,就好像textarea的值是“\n”,而它应该是“”。代码如下: function checkEnter(e) { var charCode; if (e && e.which) { charCode = e.which; } else {
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;
}
功能检查输入(e){
var字符码;
if(e&e.which){
charCode=e.which;
}否则{
charCode=e.keyCode;
}
if(charCode==13){
say();
document.getElementById('chatfieldbox')。value=“”;
返回false;
}否则{
返回true;
}
}
函数say(){
updateStats();
text=document.getElementById('chatfieldbox')。值;
xhr=newXMLHttpRequest();
xhr.open(“POST”、“say”、false);
setRequestHeader(“内容类型”,“应用程序/x-www-form-urlencoded”);
setRequestHeader(“内容长度”,text.length);
setRequestHeader(“连接”、“关闭”);
xhr.send(“text=“+text”);
document.getElementById('chatfieldbox')。value=“”;
更新();
}
函数updateStats(){
var text=document.getElementById('chatfieldbox')。值;
var num=text.length;
var线=1;
对于(变量i=0;i
say();执行一些ajax操作来发送消息。updateStats();只是一个字符和行计数器,以方便用户。say();将消息发送到服务器,然后调用update以查看是否有其他人的消息要显示(不相关)。HTML:
<textarea id="chatfieldbox" onKeyPress="checkEnter(event)"></textarea>
有什么建议吗?在您的代码中
的位置返回false
确保document.getElementById('chatfieldbox').value=“”代码>从不被调用。切换这两行的位置,它应该可以工作。为什么不在发送ajax请求之前清除文本框呢
编辑:同时取消事件冒泡
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;
}
}
我想有几件事会有帮助:
使用keyDown事件(如果尚未使用):
在checkEnter中,您应将textarea引用传递给say函数:
if (charCode == 13) {
elm = e.target || e.srcElement;
say(elm);
return false;
} else {
return true;
}
在say函数中,当从服务器获得肯定响应时,清除该值
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
}
});
}
好的,我解决了这个问题,问题依然存在。这是say()结尾的同一行的副本;不管怎样。你的
和
都在一行上(就像你在这里粘贴的那样)还是在各自的行上?你能发布say()和updateStats()函数吗?添加了其他函数…我认为它们不相关…当然它们是。。。我们需要看看控制在哪里,我知道问题出在哪里。清除TA,但之后仍会发送“回车”按键事件。返回false是不够的,在从checkEnter()返回之前,需要添加e.stopPropagation()或e.cancelEvent()。我试过了,但这两个函数都不起作用。实际上Firefox错误控制台告诉我cancelEvent()不是函数。这就是为什么我在回答中更改了代码。对于firefox和window.event.cancelBubble=true的e.stopPropagation(),对于IE.cancelEvent是一个输入错误,但我无法编辑我的评论。我最终通过使用setTimeout(“clearTextarea()”,10)自己修复了它;在按下enter键清除文本区域后等待10毫秒。但我想你的答案也会达到同样的效果,所以我将其标记为答案。你不应该以这种方式使用setTimeout。首先希望每次10毫秒对所有观众都足够了,谁知道会发生什么,然后不应该在setTimeout中使用字符串,而应该使用闭包setTimeout(function(){…您的代码…},毫秒)。谢谢你的旗帜。
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
}
});
}