AJAX onreadystatechange在状态更改后执行


AJAX onreadystatechange executing before post state change?

好的,所以我一直在尝试让它工作几个小时......

这是我的简单 ajax 请求:

函数 ajaxRequest(){

var xmlhttp;
var activexmodes = ["Msxm12.XMLHTTP", "Microsoft.XMLHTTP"];
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
return new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE6, IE5
    for(var i = 0; i < activexmodes.length; i++)
    {
        try
        {
            return new ActiveXObject(activexmodes[i]);
        }
        catch (e)
        {
            // Suppress
        }
    }
}
else
{
    return false;
}

}

然后我有这个函数调用它:

功能run_ajax_form_submit_request(s_method、s_processor、s_params、b_syn){

var request = new ajaxRequest();
var message = null;
    request.onreadystatechange=function()
    {
        if (request.readyState == 4)
        {
            if (request.status == 200 || window.location.href.indexOf("http") == -1)
            {
                if (request.responseText == 'true')
                {
                    message = 'true';
                }
                else
                {       
                    message = request.responseText;
                }
            }
            else
            {
                messge = "There was a problem processing this request.";
            }
        }
        else if (request.readyState == 0)
        {
            message = "Error: 0.";
        }
        else if (request.readyState == 1)
        {
            message = "Error: 1.";
        }
        else if (request.readyState == 2)
        {
            message = "Error: 2.";
        }
        else if (request.readyState == 3)
        {
            message = "Error: 3.";
        }
    }
switch (s_method)
{
    case 'POST':
        request.open("POST", "./scripts/pages/index/index/form_processor.php?", true);
        request.setRequestHeader("Content-s_input_type", "application/x-www-form-urlencoded");
        request.send(s_params);
        break;
    case 'GET':
        request.open(s_method, s_processor, b_syn, true);
        request.send();
        break;
}
return message;

}

此语句称为:

var s_result = run_ajax_form_submit_request('POST', s_path, s_send_parameters, true);

!!结束代码!!

发生的事情是代码正在正确执行,直到它到达以下行:request.open("POST", "./scripts/pages/index/index/form_processor.php?", true);

然后它运行 onreadystatechange 函数,由于尚未运行任何内容,因此返回"错误 1."消息。

然后,后脚本的其余部分继续并再次更改状态,这次它运行 4,但 onreadystatechange 无法再次运行,导致最终消息"错误 1"。...代码将在调试器中正常运行,但无法在浏览器中运行...这是调用其他所有内容的javascript的第一页:

!!初始代码!!

功能submit_post_form(s_form_name、s_path、b_restrict、s_success_response){

var o_form = document.getElementById(s_form_name);
var oa_inputs = o_form.getElementsByTagName('input');
var oa_selects = o_form.getElementsByTagName('select');
var o_submit = form_find_submit(oa_inputs);
var o_messages = o_form.getElementsByClassName('messages')[0];
o_messages.className = 'messages';
switch (b_restrict)
{
    case true:
        for (i = 0; i < oa_inputs.length; i++)
        {
            oa_inputs[i].disabled = true;
        }
        for (i = 0; i < oa_selects.length; i++)
        {
            oa_selects[i].disabled = true;
        }
    break;
}
o_messages.classList.add('loading');
setTimeout(function(){
    o_messages.classList.add('active');
    setTimeout(function(){
        var sa_all_inputs_as_strings = new Array();
        var inputIDArray = new Array();
        var selectIDArray = new Array();
        var inputValArray = new Array();
        var selectValArray = new Array();
        var s_input_type = null;
        for (i = 0; i < oa_inputs.length; i++)
        {
            s_input_type = oa_inputs[i].type;
            var s_input_val_temp = null;
            if (s_input_type.trim() != 'button' && s_input_type.trim() != 'submit')
            {
                sa_all_inputs_as_strings[i] = new Array();
                sa_all_inputs_as_strings[i][0] = oa_inputs[i].getAttribute('name');
                if (s_input_type == 'text' || s_input_type == 'password')
                {
                    s_input_val_temp = oa_inputs[i].value;
                }
                else if (s_input_type == 'radio' || s_input_type == 'checkbox')
                {
                    if (oa_inputs[i].checked)
                    {
                        s_input_val_temp = 'true';
                    }
                    else
                    {
                        s_input_val_temp = 'false';
                    }
                }
                sa_all_inputs_as_strings[i][1] = s_input_val_temp;
            }
        }
        for (i = sa_all_inputs_as_strings.length; i < (sa_all_inputs_as_strings.length + oa_selects.length); ++i)
        {
            sa_all_inputs_as_strings[i] = new Array();
            sa_all_inputs_as_strings[i][0] = oa_selects.id;
            sa_all_inputs_as_strings[i][1] = oa_selects.options[(oa_selects[selectInterval]).selectedIndex].value;
        }
        var s_send_parameters = "form=" + s_form_name;
        for (i = 0; i < sa_all_inputs_as_strings.length; i++)
        {
            s_send_parameters +=  "&" + encodeURIComponent(sa_all_inputs_as_strings[i][0]) + "=" +  encodeURIComponent(base64Encode(sa_all_inputs_as_strings[i][1]));
        }
        var s_result = run_ajax_form_submit_request('POST', s_path, s_send_parameters, true);

        o_messages.classList.remove('active');
        setTimeout(function(){
            o_messages.className = 'messages';
            if (s_result == 'true')
            {
                o_messages.innerHTML = s_success_response;
                o_messages.classList.add('success');
            }
            else
            {       
                o_messages.innerHTML = s_result;
                o_messages.classList.add('error');

                for(i = 0; i < oa_inputs.length; i++)
                {
                    if (oa_inputs[i].type != 'submit')
                    {
                        oa_inputs[i].disabled=false;
                        oa_inputs[i].classList.remove('disabled');
                    }
                }
                for (i = 0; i< oa_selects.length; i++)
                {
                    oa_selects[i].disabled=false;
                    oa_selects[i].classList.remove('disabled'); 
                }
            }
            setTimeout(function(){
                o_messages.classList.add('active');
            }, 100);
        }, 200);
    },200);
},100);

}

我不知道我做错了什么...也许是超时(动画),但我不知道....

这就是它的工作方式,onreadystate事件在请求期间触发了几次,第一次甚至在发送任何东西之前,这就是为什么你必须侦听数字4,你出于某种原因假设12等是错误,它们不是,它们只是请求不同阶段的状态代码。

状态代码如下

0:请求未初始化
1:建立
服务器连接2:收到的
请求3:处理请求
4:请求完成,响应就绪

您会看到为什么1会触发,这不是错误代码,而是建立连接时的状态代码。

您可以通过删除已添加的所有错误错误处理来解决此问题。

你的代码还有另一个问题,你以这种方式设置ajax

function run_ajax_form_submit_request(s_method, s_processor, s_params, b_syn) {
    var request = new ajaxRequest();
    var message = null;
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            message = request.responseText;
        }
    }
    return message;
}

你叫它像

var s_result = run_ajax_form_submit_request('POST', s_path, s_send_parameters, true);

但这永远不会起作用,因为 ajax 是异步的,请参阅此答案以获取详细说明

如何从 Ajax 调用返回响应