Intereting Posts

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

}

Затем я вызываю эту функцию:

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) { 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, которая вызывает все остальное:

!!! НАЧАЛЬНЫЙ КОД !!!

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

}

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