Javascript 浏览器冻结了几秒钟

Javascript 浏览器冻结了几秒钟,javascript,Javascript,当下列代码运行时,它会使浏览器冻结几秒钟。 我怎样才能避免呢?谢谢 function rsfp_changePage(formId, page, totalPages, validate) { if (validate) { var form = rsfp_getForm(formId); if (!ajaxValidation(form, page)) return false; } for (var i=0; i<=totalPages; i++) {

当下列代码运行时,它会使浏览器冻结几秒钟。 我怎样才能避免呢?谢谢

function rsfp_changePage(formId, page, totalPages, validate)
{
if (validate)
{
    var form = rsfp_getForm(formId);
    if (!ajaxValidation(form, page))
        return false;
}

for (var i=0; i<=totalPages; i++)
{
    var thePage = document.getElementById('rsform_' + formId + '_page_' + i);
    if (thePage)
        document.getElementById('rsform_' + formId + '_page_' + i).style.display = 'none';
}

var thePage = document.getElementById('rsform_' + formId + '_page_' + page);
if (thePage)
{
    thePage.style.display = '';
    try {
        eval('if (typeof rsfp_showProgress_' + formId + ' == "function") rsfp_showProgress_' + formId + '(' + page + ')');
    }
    catch (err) { }
}
}
如果我把它改成

xmlHttp.open("POST", url, true);
那么它应该是一个异步请求,不是吗


当我测试它时,它没有冻结浏览器,但是如果表单上没有填写字段,它不会显示错误。相反,它验证了这并不意味着什么。有什么帮助吗?

正如IAbstractDownvoteFactory提到的,您可能在同步模式下调用ajax,这意味着在等待网络调用时冻结屏幕

它看起来如此的原因是您的
ajaxValidation
正在返回一个值。通常,您会发送一个异步请求,
ajaxValidation
将接受回调。这样UI就不会挂起等待XHR了

// This is an improvement over what you had
// Still poor code, since it's hard to tell what the function is doing
function rsfp_changePage(formId, page, totalPages, validate)
{
  var form = rsfp_getForm(formId);
  if (validate) {
    // Change your AJAX validation function to take a callback, which passes the return
    // value (asynchronous) instead of relying on a return value (synchronous)
    ajaxValidation(form, page, function(validationResult){
      if (validationResult) {
        showProgress();
      }
    });        
  } else {
    showProgress();
  }

  function showProgress() {
    for (var i=0; i<=totalPages; i++) {
      var thePage = document.getElementById('rsform_' + formId + '_page_' + i);
      if (thePage) {
        thePage .style.display = 'none';
      }

      var thePage = document.getElementById('rsform_' + formId + '_page_' + page);
      if (thePage) {
        thePage.style.display = '';
        // Don't use eval, use window and bracket to  avoid it
        var func = window["rsfp_showProgress_" + formId];
        if (typeof func  == "function") {
            func(page);
        }
      }
    }        
  }    
}
//这是对您的改进
//代码仍然很差,因为很难判断函数在做什么
函数rsfp_changePage(formId、page、totalpage、validate)
{
变量形式=rsfp_getForm(formId);
如果(验证){
//将AJAX验证函数更改为接受回调,该回调传递返回
//值(异步),而不是依赖返回值(同步)
ajaxValidation(表单、页面、函数)(validationResult){
if(验证结果){
showProgress();
}
});        
}否则{
showProgress();
}
函数showProgress(){

对于(var i=0;我不知道,但是ajaxValidation可能没有与async True一起使用。这个问题中缺少很多东西。例如,
ajaxValidation
做什么?尝试删除尽可能多的代码,同时仍然使浏览器冻结并再次发布。无法从这些代码中判断-这些东西是什么时候发布的调用?这只是一个函数声明。ajaxValidation做什么呢?我怀疑,在上述代码示例之外的某个地方,您正在执行一个同步AJAX请求,以便获取
ajaxValidation
返回值。为了防止这种情况,您需要使
ajaxValidation
异步并使用回调函数蒂德。你好@胡安,我把代码贴在ajaxvalidation所在的地方。我做了一些研究,但我无法更改ajaxvalidation以接听电话。你能帮我一下吗?谢谢;-)你尝试了什么?尝试一下,我会帮你的,我不能为你全部写。另外,请缩进你的代码
xmlHttp.open("POST", url, true);
// This is an improvement over what you had
// Still poor code, since it's hard to tell what the function is doing
function rsfp_changePage(formId, page, totalPages, validate)
{
  var form = rsfp_getForm(formId);
  if (validate) {
    // Change your AJAX validation function to take a callback, which passes the return
    // value (asynchronous) instead of relying on a return value (synchronous)
    ajaxValidation(form, page, function(validationResult){
      if (validationResult) {
        showProgress();
      }
    });        
  } else {
    showProgress();
  }

  function showProgress() {
    for (var i=0; i<=totalPages; i++) {
      var thePage = document.getElementById('rsform_' + formId + '_page_' + i);
      if (thePage) {
        thePage .style.display = 'none';
      }

      var thePage = document.getElementById('rsform_' + formId + '_page_' + page);
      if (thePage) {
        thePage.style.display = '';
        // Don't use eval, use window and bracket to  avoid it
        var func = window["rsfp_showProgress_" + formId];
        if (typeof func  == "function") {
            func(page);
        }
      }
    }        
  }    
}