2012-05-31 258 views
2

我有一個PHP腳本來檢查電子郵件地址以確定它是否有效。該功能只需返回truefalse。我正在嘗試執行一個對php文件的ajax調用,並將truefalse返回給javascript函數。目前我什麼也沒有。從AJAX獲取返回值

function validateForm() { 
    var email = document.forms["contact"]["email"].value; 
    var validEmail; 

    $.ajax({ 
     type: "POST", 
     url: "validateEmail.php", 
     data: "email=" + email, 
     success: function(result) { 
      validEmail = result; 
      console.log('result: ' + validEmail); 
     } 
    }); 
} 

如果我能找回truefalse我會然後做一些布爾檢查,以確定如何繼續。當用戶單擊表單提交按鈕時,將調用validateForm()功能。

<form name="contact" action="submitOrder.php" onsubmit="return validateForm();" method="post"> 

我想要validateForm()函數返回false,如果電子郵件地址是無效的,這樣submitOrder.php是從來沒有所謂的,但由於AJAX的異步性,我不知道如何做到這一點。

UPDATE

請求工作正常(我敢肯定)。這就是我在Firebug中看到的。 enter image description here 我還沒有看到任何返回。控制檯打印「結果:」。我也改變了validateEmail.php返回數字17,我仍然沒有得到任何回報。

感謝您的幫助!

+0

檢查您的控制檯和網絡流量,看看是否發送請求 – Galen

+0

如何檢查電子郵件地址是否有效? –

+0

它似乎正確發佈。請參閱截圖。 –

回答

1

使用JQuery Validate插件。將會從頭開始更簡單得多。

+0

我補充說,我很喜歡它。謝謝。我認爲它沒有檢查電話號碼。這是我可以添加的東西嗎? –

+0

是的。你可以像這樣添加它:http://docs.jquery.com/Plugins/Validation/CustomMethods/phoneUS –

0

jQuery的ajax函數默認是異步的。這意味着它使ajax請求,然後返回。您可能需要將async參數設置爲false,然後在您的成功功能中設置validEmail,就像您正在做的那樣。然後你可以在ajax調用之後安全地返回validEmail。

function validateForm() { 
    var email = document.forms["contact"]["email"].value; 
    var validEmail = false; 

    $.ajax({ 
    type: "POST", 
    url: "validateEmail.php", 
    async: false, 
    data: "email=" + email, 
    success: function(result) { 
     validEmail = result; 
     console.log('result: ' + validEmail); 
    } 
    }); 

    return validEmail; 
} 
0

我想你有一個失蹤;在您的jQuery呼叫

$.ajax({ 
    type: "POST", 
    url: "validateEmail.php", 
    data: "email=" + email, 
    success: function(result) { 
     validEmail = result; 
     console.log('result: ' + validEmail); 
    } 
}); 

結束時,我會建議安裝螢火所以你可以看到發生了什麼事情與Ajax調用&反應 - 你應該能夠調試它輕鬆很多呢。

+0

我有Firebug(見截圖),我認爲這是張貼,但我只是沒有得到迴應。 –

0

如果您不想讓AJAX調用同步,那麼如果結果有效,則可以使Ajax調用提交。調用您的validateForm並將false返回給onsubmit。 (我不會讓validateForm本身返回false,因爲這不會是正交的)。

0

我想你需要一個event.preventDefault();使異步調用正常工作

$('#submit-button-id')。click(function(event){ event.preventDefault(); });

這應該會阻止瀏覽器在完成任何驗證之前提交表單。 (請注意,您需要爲您的提交按鈕提供一個您可以參考的類或ID,以便觸發此類)。

http://api.jquery.com/event.preventDefault/

0

建議不要爲ajax調用使用同步選項,因爲它可以暫時鎖定瀏覽器。請注意下面的報價jquery's ajax() page

請注意,同步請求可能會暫時鎖定瀏覽器, 禁用請求處於活動狀態時的任何操作。

相反,您可以讓提交表單的按鈕調用validateForm函數,並且在調用ajax成功時可以提交表單。

function validateForm() { 
    var email = document.forms["contact"]["email"].value; 

    $.ajax({ 
     type: "POST", 
     url: "validateEmail.php", 
     data: "email=" + email, 
     success: function(result) { 
      if (result == true) 
       document.forms["contact"].submit(); 
     } 
    }); 
} 
0

使用async: false是使用AJAX,你不必要地阻礙了你的JavaScript一個好辦法。使用客戶端驗證器(如jQuery Validate)是危險的,因爲攻擊者可以禁用JavaScript並提交無效表單。服務器端驗證是必須的,並且可以使用良好的舊AJAX來完成!

關鍵是回調。因爲AJAX是異步的(非阻塞),所以您嘗試從validateForm返回的任何內容都將在您的AJAX調用返回之前返回。這意味着你不能在不暫停所有JavaScript執行的情況下從AJAX成功函數中返回值。相反,您傳遞一個回調函數作爲您的AJAX成功函數可以調用的參數。在該回調中,您可以執行布爾檢查以確定如何繼續。你也可以直接在成功函數(這實際上是一個回調函數)中執行此操作,但回調參數和其他函數會將代碼解耦一點,這是很好的做法。我修改了你的代碼給你一個我的意思的例子。

function validateForm(callback) { 
    var email = document.forms["contact"]["email"].value; 
    var validEmail; 

    $.ajax({ 
     type: "POST", 
     url: "validateEmail.php", 
     data: "email=" + email, 
     success: function(result) { 
      validEmail = result; 
      console.log('result: ' + validEmail); 
      callback(result); 
     } 
    }); 
} 

function doSomethingWithResult(result) { 
    if (result === True) { 
     // Do true stuff 
    } else { 
     // Do false stuff 
    } 
} 

validateForm(doSomethingWithResult);