2014-11-17 4 views
0

Хорошо, так что я пытался получить эту работу в течение нескольких часов теперь ....AJAX onreadystatechange выполняется перед изменением состояния сообщения?

Вот мой простой запрос 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; 

}

, который вызывается этим утверждением:

вар s_result = run_ajax_form_submit_request ('POST', s_path, s_send_parameters, правда);

!!! КОНЕЦ КОДА !!!

Что происходит, код корректно выполняется до тех пор, пока он не достигнет этой строки: 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); 

}

Я не знаю, что я делаю неправильно ... Может быть, это время ожидания (для анимации), но я понятия не имею ....

ответ

2

Так оно и работает, событие onreadystate срабатывает несколько раз во время запроса, первое, прежде чем что-либо даже послано, вот почему вы должны прослушивать номер 4, вы почему-то предполагаете, что 1, 2 и т. Д. Являются ошибками, они не являются, они являются только кодами состояния для разных этапов запроса.

Коды состояния имеют следующие

0: Запрос не инициализирован
1: соединение с сервером установлено
2: запрос получен
3: Обработка запроса
4: Запрос закончен и ответ готов

Вы видите, почему стреляет 1, это не код ошибки, это код состояния, когда соединение установлено.

Вы решили это, удалив всю ошибочную обработку ошибок, которую вы добавили.

Там же еще одна проблема с вашим кодом, вы настраиваете Аякса таким образом

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 является асинхронным см этого ответа для подробного объяснения

How to return the response from an Ajax call

+0

Хорошо, я достал все сообщения об ошибках, но теперь он просто ничего не возвращает ... Отладчик все еще прав, однако браузер все равно не работает ... Что-то еще не так? – Jingrah1

+0

Да, вызов ajax - ** async **, вы не можете сделать это таким образом. – adeneo

+0

Спасибо. Я очень это ценю, я бы был здесь гораздо дольше, пытаясь понять это. – Jingrah1

Смежные вопросы