Javascript-更新textarea冻结浏览器选项卡

Javascript-更新textarea冻结浏览器选项卡,javascript,jquery,textarea,freeze,Javascript,Jquery,Textarea,Freeze,我每2秒钟用javascript更新一次文本区域中的文本,但有时整个页面会冻结,您必须关闭该选项卡(浏览器中的其他选项卡工作正常,这会发生在所有访问该页面的人身上) 我的代码是这样的: function ajaxSyncRequest(reqURL) { var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", reqURL, f

我每2秒钟用javascript更新一次文本区域中的文本,但有时整个页面会冻结,您必须关闭该选项卡(浏览器中的其他选项卡工作正常,这会发生在所有访问该页面的人身上)

我的代码是这样的:

                function ajaxSyncRequest(reqURL) {
                    var xmlhttp = new XMLHttpRequest();
                    xmlhttp.open("POST", reqURL, false);
                    xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
                    xmlhttp.send('server=" + server + "');
                    if (xmlhttp.readyState == 4) {
                        if (xmlhttp.status == 200){
                            document.getElementById(\"1\").innerHTML = xmlhttp.responseText;
                            if (document.getElementById('check').checked) { document.getElementById(\"1\").scrollTop = document.getElementById(\"1\").scrollHeight; }
                        } else {
                            document.getElementById(\"1\").innerHTML = "Could not connect to remote server!";\n
                        }
                    }
                }
这是2秒计时器:

                        function timer() {
                            ajaxSyncRequest("ConsoleGenerator");
                            window.setTimeout("timer()", 2000);
                        }
我正在使用POST方法将文本发送到Javaservlet。它有时工作几个小时,然后冻结,浏览器会说“页面不在重新发布…”或者有时工作几分钟,然后冻结

有人能帮忙吗?

(假设我们修复了代码中的基本语法错误)。您可以愉快地启动后续请求,而不必等待前面的请求完成。如果ajax调用的时间超过两秒钟,则会出现重叠调用。这本身并不是问题,除非后端正在序列化调用或类似的调用,但它确实会造成混乱的情况

您还可以通过指定
false
作为POST调用的第三个参数来进行同步请求。不需要使请求同步,这样做(特别是每两秒钟一次)确实会锁定浏览器的UI

我建议先等待上一个请求完成,然后再安排下一个请求,并使请求异步,这样浏览器UI就不会被锁定:

// Accept callback --------------v
function ajaxSyncRequest(reqURL, callback) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("POST", reqURL, true);
    // async, not sync ----------^
    xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xmlhttp.send('server=" + server + "');
    if (xmlhttp.readyState == 4) {
        if (xmlhttp.status == 200) {
            document.getElementById("1").innerHTML = xmlhttp.responseText;
            if (document.getElementById('check').checked) {
                document.getElementById("1").scrollTop = document.getElementById("1").scrollHeight;
            }
        } else {
            document.getElementById("1").innerHTML = "Could not connect to remote server!\n";
        }
        callback(); // <== Call it
    }
}

function timer() {
    ajaxSyncRequest("ConsoleGenerator", function() { // Pass in a callback
        setTimeout(timer, 2000);
    });
}


旁注:无需使用
窗口。
setTimeout上的前缀(尽管如果全局
窗口没有阴影,那么前缀是无害的),只需传递函数引用,而不必向其传递字符串。

您是否碰巧有一个可用于此的JSFIDLE?
文档.getElementById(\'1').innerHTML
?那些反斜杠在那里干什么?这是一个语法错误。这里:
“无法连接到远程服务器!”\n
请花点时间发布没有基本语法错误的代码。(理想情况下,不要毫无意义地插入15个以上的字符,将其中的一半挤出视野。)谢谢,反斜杠之所以存在,是因为该代码在java中位于一个字符串中。每个优秀的浏览器都会警告主线程上不推荐使用同步xmlhttprequest-这是一个警告,您可能希望重写代码,使其不在主线程上使用同步xmlhttprequest。@JaromandaX:Wow,我甚至没有注意到最后的
false
。同意,绝对应该是异步的。谢谢,这里有反斜杠,因为这段代码在java的字符串中。我会尝试一下。我不确定哪里出了问题,但当我用你的代码替换我的代码时,它完全停止工作,我只是得到一个空白文本区域。我发现了问题,每当我将参数(异步)设置为true时,它就停止工作。
function timer() {
    var started = Date.now();
    ajaxSyncRequest("ConsoleGenerator", function() { // Pass in a callback
        setTimeout(timer, Max.max(0, 2000 - (Date.now() - started));
    });
}