2014-01-29 169 views
0

我的$ .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();"> 

的問題是,作爲後是異步的,形式可以即使迴歸後不會submited滿足條件。 是否有可能在提交表單之前等待帖子循環結束?我嘗試了一些計算器解決方案(如回調),但它不工作...

編輯部分:

我想這種方式在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);"> 

但它不工作太...

+1

回調確實有效,它們是您擁有異步代碼的唯一實用解決方案。你的函數將不起作用,因爲你的驗證在AJAX調用返回之前執行。您可能需要重構您的代碼才能完成此工作,但這不僅僅影響您在此處的功能。 – 2014-01-29 10:45:58

+0

回調是解決這個問題的方法。這是唯一的解決方案。如果它不適合你,那麼你需要告訴我們你的回調代碼並尋求幫助解決它;您向我們展示的代碼在沒有變成回調的情況下永遠不會起作用,因爲帖子的性質是異步的。 – Spudley

+0

感謝您的回答。我不是JavaScript的專家這不是我的代碼,我不知道如何重構它... –

回答

0

您應該更好地使用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(""); 
     } 

祝你好運!

0

$。員額簡直是$.ajax({類型: 「POST」,...})的快捷方式。

隨着$就可以使用參數{異步:假}等待的任何時間之前與執行回事(超時參數也可)。

+0

將「異步」設置爲false並不是一個好實踐。很多開發人員不推薦使用這種方法 –