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