我正在嘗試在窗體中提交2個請求。AJAX POST請求取消,因爲頁面導航
使用外部腳本將請求發送到外部數據庫。
另一請求然而是存儲在localStorage的表單字段和帖子的JSON的PHP文件,然後將數據保存到當前服務器上的文本文件(其中形式託管)
一個AJAX POST請求問題是,在提交時AJAX POST請求被取消,因爲第一個操作(向外部數據庫發送數據的外部腳本)導航離開當前頁面,併爲您提交提交的成功/失敗狀態。
我知道這是因爲有一個表單驗證(不停止AJAX請求),並且如果電子郵件中存在驗證錯誤,表單不會導航到另一個頁面,但AJAX POST請求是成功和JSON數據正確傳遞到服務器上的文本文件。
以下是HTML/JS和PHP代碼:
HTML/JS:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="eloqua.css">
<script src="http://code.jquery.com/jquery-1.9.0.js"></script>
<script type="text/javascript">
$(document).ready(function(){
localStorage.clear();
$("form").on("submit", function() {
if(window.localStorage!==undefined) {
var fields = $(this).serialize();
localStorage.setItem("eloqua-fields", JSON.stringify(fields));
$.ajax({
type: "POST",
url: "backend.php",
data: fields
});
} else {
alert("Storage Failed. Try refreshing");
}
});
});
</script>
<script type="text/javascript">
function validateForm()
{
var a=document.forms["EloquaForm"]["C_FirstName"].value;
if (a==null || a=="")
{
alert("First name must be filled out");
return false;
}
var b=document.forms["EloquaForm"]["C_LastName"].value;
if (b==null || b=="")
{
alert("Last name must be filled out");
return false;
}
var y=document.forms["EloquaForm"]["C_EmailAddress"].value;
var atpos=y.indexOf("@");
var dotpos=y.lastIndexOf(".");
if (atpos<1 || dotpos<atpos+2 || dotpos+2>=y.length)
{
alert("Not a valid e-mail address");
return false;
}
}
</script>
</head>
<body>
<p><img src="red-asterix.jpeg"> indicates a required field</p>
<div class="form-container" style="width: 625px">
<form class="form-eloqua" name="EloquaForm" action="http://s33.t.eloqua.com/e/f2" onsubmit="return validateForm();" method="post">
<span class="form-eloqua-label"><span>First Name</span></span><input id="firstname" type="text" name="C_FirstName" />
<span class="form-eloqua-label"><span>Last Name</span></span><input id="lastname" type="text" name="C_LastName" />
<span class="form-eloqua-label"><span>Email Address</span></span><input id="email" type="text" name="C_EmailAddress" />
<span class="form-eloqua-label">Title</span><input id="title" type="text" name="C_Title" />
<span class="form-eloqua-label">Company</span><input id="company" type="text" name="C_Company" />
<span class="form-eloqua-label">ZIP or Postal Code</span><input id="postcode" type="text" name="zipOrPostalCode" />
<span class="form-eloqua-label">Country</span><select id="country" name="country">
<option value="">Please select ...</option>
<option value="AF">Afghanistan</option>
<option value="AL">Albania</option>
<option value="DZ">Algeria</option>
<option value="AS">American Samoa</option>
<option value="AD">Andorra</option>
<option value="AG">Angola</option>
<option value="AI">Anguilla</option>
<option value="AG">Antigua & Barbuda</option>
<option value="AR">Argentina</option>
<option value="AA">Armenia</option>
<option value="AW">Aruba</option>
<option value="AU">Australia</option>
<option value="AT">Austria</option>
<option value="AZ">Azerbaijan</option>
<option value="BS">Bahamas</option>
<option value="BH">Bahrain</option>
<option value="BD">Bangladesh</option>
<option value="BB">Barbados</option>
<option value="BY">Belarus</option>
<option value="BE">Belgium</option>
<option value="BZ">Belize</option>
<option value="BJ">Benin</option>
<option value="BM">Bermuda</option>
<option value="BT">Bhutan</option>
<option value="BO">Bolivia</option>
<option value="BL">Bonaire</option>
<option value="BA">Bosnia & Herzegovina</option>
<option value="BW">Botswana</option>
<option value="BR">Brazil</option>
<option value="BC">British Indian Ocean Ter</option>
<option value="BN">Brunei</option>
<option value="BG">Bulgaria</option>
<option value="BF">Burkina Faso</option>
<option value="BI">Burundi</option>
<option value="KH">Cambodia</option>
<option value="CM">Cameroon</option>
<option value="CA">Canada</option>
<option value="IC">Canary Islands</option>
<option value="CV">Cape Verde</option>
<option value="KY">Cayman Islands</option>
<option value="CF">Central African Republic</option>
<option value="TD">Chad</option>
<option value="CD">Channel Islands</option>
<option value="CL">Chile</option>
<option value="CN">China</option>
<option value="CI">Christmas Island</option>
<option value="CS">Cocos Island</option>
<option value="CO">Colombia</option>
<option value="CC">Comoros</option>
<option value="CG">Congo</option>
<option value="CK">Cook Islands</option>
<option value="CR">Costa Rica</option>
<option value="CT">Cote D'Ivoire</option>
<option value="HR">Croatia</option>
<option value="CU">Cuba</option>
<option value="CB">Curacao</option>
<option value="CY">Cyprus</option>
<option value="CZ">Czech Republic</option>
<option value="DK">Denmark</option>
<option value="DJ">Djibouti</option>
<option value="DM">Dominica</option>
<option value="DO">Dominican Republic</option>
</select>
<div class="form-eloqua-separator"></div>
<span class="form-eloqua-label">Annual Revenue Range</span><select name="C_Annual_Revenue1"> <option value="">Please select ...</option> <option value="0-100,000,000">0-100,000,000</option><option value="100,000,001-300,000,000">100,000,001-300,000,000</option><option value="300,000,001-500,000,000">300,000,001-500,000,000</option><option value="500,000,001-2,000,000,000">500,000,001-2,000,000,000</option><option value="2 Billion +">2 Billion +</option></select>
<div class="submit-button"><input type="submit" id="submit" value="Submit" /></div>
<div id="output"></div>
<input type="hidden" name="elqoffer" value="GGB2BContentMktg" />
<input type="hidden" name="elqchannel" value="TheMarketer" />
<input type="hidden" name="elqbq" value="14Q2" />
<input type="hidden" name="elqbc" value="UK" />
<input type="hidden" name="elqFormName" value="2013-Syndication-1372365875136" />
<input type="hidden" name="elqSiteId" value="33" />
</form>
</div>
</body>
</html>
PHP:
<h1>Below is the data retrieved from SERVER</h1>
<?php
date_default_timezone_set('America/Chicago'); // CDT
echo '<h2>Server Timezone : ' . date_default_timezone_get() . '</h2>';
$current_date = date('d/m/Y == H:i:s ');
print "<h2>Server Time : " . $current_date . "</h2>";
$file_content = array();
if (file_exists('your_data.txt')){
$file_content = (array)json_decode(file_get_contents('your_data.txt'));
unlink('your_data.txt');
}
$file_content['users'][] = array('user'=>$_POST);
file_put_contents('your_data.txt',json_encode($file_content));
?>
形式的LIVE VERSION:http://bhanuchawla.me/dev/redactive/marketerform/
,其中JSON數據發佈文字檔案:http://bhanuchawla.me/dev/redactive/marketerform/your_data.txt
注:如果您在提交表單得到投稿成功消息,這意味着在行動外部腳本成功,而不是跑AJAX。要測試數據是否通過AJAX提交,請查看your_data.txt文件(上面的URL)
如何確保在頁面導航之前完成AJAX POST?
無限循環隊友。繼續發佈到backend.php –
好的,所以它不會繞過事件處理程序。這有點不好意思,但你可以做的是設置一個全局變量/標誌,以跟蹤是否Ajax事件完成,如果有,不要做preventDefault並返回false,而是返回true; – narak
更新了答案 – narak