JQuery: дождитесь возврата $.post
У меня проблема с моим запросом $.post. Вот мой код:
function verif_subscribe_sale() {
var URL_ROOT = "http://my_website.com/";
var email_sale = document.getElementById('email-sale');
var name_sale = document.getElementById('name-sale');
var url_sale = document.getElementById('url-sale');
var password_sale = document.getElementById('password-sale');
var token = document.getElementsByName('_token');
test = 0;
$.post(URL_ROOT + 'check-url', { url: url_sale.value, token: token.value } ).done(function( data ) {
if(data == "notok" || data.length < 4){
document.getElementById('error_url').style.display="block";
test = 1;
}
});
if(name_sale.value.length < 4){
document.getElementById('error_name_length').style.display="block";
test = 1;
}
if(check_email(email_sale) != true) {
document.getElementById('error_mail').style.display="block";
test = 1;
}
if(test == 0){
return true;
}else{
return false;
}}
Этот код вызывается из формы HTML:
<form action="{{{ URL::to('create_my_sale') }}}" method="post" onsubmit="return verif_subscribe_sale();">
Проблема в том, что пост является асинхронным, форма может быть отправлена, даже если пост-возврат не удовлетворяет условию. Можно ли дождаться окончания цикла постов, прежде чем отправлять форму? Я попробовал какое-то решение для работы со стеком (например, обратный вызов), но оно не работает...
Редактировать часть:
Я попробовал этот способ в JS:
function verif_subscribe_sale(callback) {
var URL_ROOT = "http://www.mysite.com/";
var url_sale = document.getElementById('url-sale');
var token = document.getElementsByName('_token');
test = 0;
$.post(URL_ROOT + 'check-url', { url: url_sale.value, token: token.value } ).done(function( data ) {
if(data == "notok" || data.length < 4){
document.getElementById('error_url').style.display="block";
test = 1;
}
});
callback(test);
}
function test_callback(test){
var name_sale = document.getElementById('name-sale');
var email_sale = document.getElementById('email-sale');
var password_sale = document.getElementById('password-sale');
if(name_sale.value.length < 4){
document.getElementById('error_name_length').style.display="block";
test = 1;
}
if(check_email(email_sale) != true) {
document.getElementById('error_mail').style.display="block";
test = 1;
}
if(test == 0){
return true;
}else{
return false;
}
}
и я назвал это так:
<form action="{{{ URL::to('create_my_sale') }}}" id="form-sale" method="post" onsubmit="return verif_subscribe_sale(test_callback);">
Но это тоже не работает...
2 ответа
Вам лучше использовать ajax и контролировать свои ответы (работает асинхронно): Вот пример кода:
var tout;
// ...
// some code ...
// ...
function setExpressCheckout() {
'use strict';
var xmlhttp;
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function () {
var s;
if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
if (tout) {
clearTimeout(tout);
}
s = xmlhttp.responseText;
// put your own code here
}
};
function ajaxTimeout() {
xmlhttp.abort();
// put some message here, or whatever ...
clearTimeout(tout);
}
clearTimeout(tout);
tout = setTimeout(function () {
ajaxTimeout();
}, 15000); // 15000 miliseconds = 15 seconds. you can choose your own timeout.
xmlhttp.open("POST", "yourPage.php", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("");
}
Удачи!!!
$.post - это просто сокращение для $.ajax({type: "POST",...}).
С $.ajax вы можете использовать параметр {async: false}, чтобы ждать сколько угодно времени, прежде чем продолжить выполнение (также доступен параметр timeout).