Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 问题清除<;textarea>;消息发送后_Javascript_Html - Fatal编程技术网

Javascript 问题清除<;textarea>;消息发送后

Javascript 问题清除<;textarea>;消息发送后,javascript,html,Javascript,Html,我目前正在制作一个基于网络的聊天系统,但我遇到了一个问题。我在javascript中设置了一个函数来检查用户是否在文本区域中按enter键,并在出现这种情况时发送消息。问题是,每次使用该函数时,textarea中都会留下一个回车符,就好像textarea的值是“\n”,而它应该是“”。代码如下: function checkEnter(e) { var charCode; if (e && e.which) { charCode = e.which; } else {

我目前正在制作一个基于网络的聊天系统,但我遇到了一个问题。我在javascript中设置了一个函数来检查用户是否在文本区域中按enter键,并在出现这种情况时发送消息。问题是,每次使用该函数时,textarea中都会留下一个回车符,就好像textarea的值是“\n”,而它应该是“”。代码如下:

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
        }
    });
}