2017-05-09 148 views
0

我在嘗試使此表單正常工作時遇到了一些麻煩。表格應該驗證每個字段並在提交之前成功收取信用卡費用。Javascript:從異步函數返回false

問題是我無法將我的返回值傳遞給父函數以防止表單提交。我讀this post,並嘗試使用延遲對象,回調函數,並將遍歷所有地方的return語句,但我錯過了一些東西。我已經在這裏待了大約一個星期,而且我感到沮喪。任何人都可以幫助我嗎?我將不勝感激,謝謝!

HTML:

<form onSubmit="return billingfunction1();" name="form5" method="post" action="" id="newform"> 
    </form> 

JS:(裁剪尺寸)

function billingfunction1() { 
var first_name = $.trim($("#first_name").val()); 
var last_name = $.trim($("#last_name").val()); 
var cardtype = $.trim($("#cardtype").val()); 

var maxlen = 16; 


var digits = cardnumber.toString().length; 
var submiteval; 


if (cardtype == '') { 
    // alert("Enter Card Type"); 
    $('#cardtype_msg').html('Enter Card Type.'); 
    $('#cardtype').css('border','1px solid #28a616'); 
    $('#cardtype').css('box-shadow','0 0 3px 0 #28a616'); 
    return false; 
} else if (nameoncardfirst == '') { 
    //alert("Enter Name On Card"); 
    $('#nameoncardfirst_msg').html('Enter First Name On Card.'); 
    $('#nameoncardfirst').css('border','1px solid #28a616'); 
    $('#nameoncardfirst').css('box-shadow','0 0 3px 0 #28a616'); 
    return false; 
} else if (nameoncardlast == '') { 
    //alert("Enter Name On Card"); 
    $('#nameoncardlast_msg').html('Enter Last Name On Card.'); 
    $('#nameoncardlast').css('border','1px solid #28a616'); 
    $('#nameoncardlast').css('box-shadow','0 0 3px 0 #28a616'); 
    return false; 
} else {  
    function foo(callback) { 
     return $.ajax({ 
     url: 'edit_billing2.php', 
     data: "nameoncardfirst=" + nameoncardfirst+ "&nameoncardlast=" + nameoncardlast + "&street_address2=" + street_address2 +"&city2=" + city2 +"&state=" + state +"&zip=" + zip + "&cardnumber=" + cardnumber + "&expirationdate=" + expirationdate + "&cvv=" + cvv + "&cardtype=" + cardtype+ "&amount=" + amount + "&gender=" + gender + "&first_name=" + first_name + "&last_name=" + last_name + "&address=" + address + "&address2=" + address2 + "&city=" + city + "&post_code=" + post_code + "&country=" + country + "&mobile=" + mobile + "&email=" + email + "&newsletter=" + newsletter + "&make=" + vehicle + "&model=" + model + "&model_year=" + model_year, 

     success: callback     
     }); 
    } 
    function myCallback(response) { 
     console.log("Success response. Attempting to authorize payment."); 
      //alert(response); 
      result = response.split('_'); 
      //alert("Successfully Saved"); 
      alert(result[0]); 
      if(result[0]=="Your Payment has completed successfully") 
      { 
      console.log("Payment Success"); 

      submiteval = true; 
      } 
      else 
      { 
      console.log("Payment Failed, Aborting form submission."); 
      submiteval = false; 
      } 
      return submiteval; 
    } 
    console.log("Valid inputs: attempting to pass via AJAX"); 
    foo(myCallback).done(function(response) { 
     return submiteval; 
    }); 
} 

編輯:

我嘗試使用event.preventDefault()停止提交併手動處理提交,但表單會重新加載當前頁面並跳過一些PHP我表單代碼之前有,我忘了提及:

if (isset($_POST[Submit])) 
{ 
// do registration things 
} 

我結束了改變$ _ POST [提交]以

if ($_SERVER['REQUEST_METHOD'] == 'POST') 
{ 
// do registration things 
} 

去除我的形式onsubmit屬性:

<form name="form5" method="post" action="" id="newform"> 

並將其移動到我的提交按鈕:

<input onClick="return billingfunction1();" type="submit" value="Submit" 
name="Submit" class="submit_btn"> 

我的新的回調函數將手動提交表單成功的條件下:

function myCallback(response) { 
    console.log("Success response. Attempting to authorize payment."); 
    result = response.split('_'); 
    alert(result[0]); 
    if(result[0]=="Your Payment has completed successfully") { 
      console.log("Payment Success"); 
      document.forms["form5"].submit(); 
    } else { 
     console.log("Payment Failed, Aborting form submission."); 
    } 
} 

一切似乎是工作,因爲它應該。非常感謝你的幫助!

+2

沒有什麼可以幫助你在這裏。關於是否取消默認動作的決定必須*同步*。回調,承諾等使異步代碼更容易處理,但它不會使其同步。在這種情況下,典型的解決方案是在異步代碼執行檢查後,始終取消默認操作並在必要時重新觸發事件。很多相關的問題/潛在的重複:https://stackoverflow.com/search?q=%5Bjavascript%5D+prevent+submit+ajax –

+0

我明白了。我一直在思考這些問題,但我遇到的唯一解決方案是使用async:false,但它似乎違背了最佳實踐。取消和重新觸發是要走的路,謝謝! – DH3

回答

-1

$ .ajax有一個名爲beforeSend(func)的選項。你可以在這個函數中驗證你的數據,並返回false來取消ajax。

0

你可以只添加一個提交監聽器的形式

$("#newform").submit(function(){...})

阻止默認動作

event.preventDefault()

並提交表單手動

$("#newform").submit()

如果在AJAX調用的響應返回時條件滿足。

0

強調文本

function billingfunction1() { 
 
var first_name = $.trim($("#first_name").val()); 
 
var last_name = $.trim($("#last_name").val()); 
 
var cardtype = $.trim($("#cardtype").val()); 
 

 
var maxlen = 16; 
 

 

 
var digits = cardnumber.toString().length; 
 
var submiteval; 
 

 

 
if (cardtype == '') { 
 
    // alert("Enter Card Type"); 
 
    $('#cardtype_msg').html('Enter Card Type.'); 
 
    $('#cardtype').css('border','1px solid #28a616'); 
 
    $('#cardtype').css('box-shadow','0 0 3px 0 #28a616'); 
 
    return false; //show error to the user instead of returning false 
 
} else if (nameoncardfirst == '') { 
 
    //alert("Enter Name On Card"); 
 
    $('#nameoncardfirst_msg').html('Enter First Name On Card.'); 
 
    $('#nameoncardfirst').css('border','1px solid #28a616'); 
 
    $('#nameoncardfirst').css('box-shadow','0 0 3px 0 #28a616'); 
 
    return false; //show error to the user instead of returning false 
 
} else if (nameoncardlast == '') { 
 
    //alert("Enter Name On Card"); 
 
    $('#nameoncardlast_msg').html('Enter Last Name On Card.'); 
 
    $('#nameoncardlast').css('border','1px solid #28a616'); 
 
    $('#nameoncardlast').css('box-shadow','0 0 3px 0 #28a616'); 
 
    return false; //show error to the user instead of returning false 
 
} else {  
 
     $.ajax({ 
 
     url: 'edit_billing2.php', 
 
     data: "nameoncardfirst=" + nameoncardfirst+ "&nameoncardlast=" + nameoncardlast + "&street_address2=" + street_address2 +"&city2=" + city2 +"&state=" + state +"&zip=" + zip + "&cardnumber=" + cardnumber + "&expirationdate=" + expirationdate + "&cvv=" + cvv + "&cardtype=" + cardtype+ "&amount=" + amount + "&gender=" + gender + "&first_name=" + first_name + "&last_name=" + last_name + "&address=" + address + "&address2=" + address2 + "&city=" + city + "&post_code=" + post_code + "&country=" + country + "&mobile=" + mobile + "&email=" + email + "&newsletter=" + newsletter + "&make=" + vehicle + "&model=" + model + "&model_year=" + model_year, 
 

 
     success: myCallback     
 
     }); 
 
    function myCallback(response) { 
 
     console.log("Success response. Attempting to authorize payment."); 
 
      //alert(response); 
 
      result = response.split('_'); 
 
      //alert("Successfully Saved"); 
 
      alert(result[0]); 
 
      if(result[0]=="Your Payment has completed successfully") 
 
      { 
 
      console.log("Payment Success"); 
 

 
      submiteval = true; 
 
      document.forms["form5"].submit(); 
 
      } 
 
      else 
 
      { 
 
      console.log("Payment Failed, Aborting form submission."); 
 
      submiteval = false; //show error to the user instead of returning false 
 
      } 
 
      return submiteval; 
 
    } 
 
}
<form name="form5" method="post" action="" id="newform"> 
 
<input type="button" value ="submit" onClick="billingfunction1();" /> 
 
    </form>

分配billingfunction1到onclick事件,而不是提交。 使用document.forms [「form5」]。submit()在驗證來自服務器的響應後手動提交表單。

+0

這最終會做到這一點! – DH3