Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AJAX POST请求取消,因为页面导航离开_Javascript_Php_Jquery_Ajax_Json - Fatal编程技术网

Javascript AJAX POST请求取消,因为页面导航离开

Javascript AJAX POST请求取消,因为页面导航离开,javascript,php,jquery,ajax,json,Javascript,Php,Jquery,Ajax,Json,我试图在表单中提交两个请求 1使用外部脚本将请求发送到外部数据库 但是,另一个请求是AJAX POST请求,它将表单字段存储在localStorage中,并将JSON发布到PHP文件中,然后将数据保存到当前服务器(表单所在的服务器)上的文本文件中 问题在于提交时AJAX POST请求会被取消,因为第一个操作(向外部DB发送数据的外部脚本)会离开当前页面,并向您提供提交的成功/失败状态 我之所以知道这一点,是因为有一个表单验证(它不会停止AJAX请求),如果电子邮件中有验证错误,表单不会导航到另一

我试图在表单中提交两个请求

1使用外部脚本将请求发送到外部数据库

但是,另一个请求是AJAX POST请求,它将表单字段存储在localStorage中,并将JSON发布到PHP文件中,然后将数据保存到当前服务器(表单所在的服务器)上的文本文件中

问题在于提交时AJAX POST请求会被取消,因为第一个操作(向外部DB发送数据的外部脚本)会离开当前页面,并向您提供提交的成功/失败状态

我之所以知道这一点,是因为有一个表单验证(它不会停止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 &amp; 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 &amp; 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>
<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));
?>

$(文档).ready(函数(){
localStorage.clear();
$(“表格”)。在(“提交”,函数()上{
if(window.localStorage!==未定义){
变量字段=$(this.serialize();
setItem(“eloqua字段”,JSON.stringify(字段));
$.ajax({
类型:“POST”,
url:“backend.php”,
数据:字段
});
}否则{
警报(“存储失败,请尝试刷新”);
}
});
});
函数validateForm()
{
var a=document.forms[“EloquaForm”][“C_FirstName”]。值;
如果(a==null | | a==“”)
{
警告(“必须填写姓名”);
返回false;
}
var b=document.forms[“EloquaForm”][“C_LastName”]。值;
如果(b==null | | b==“”)
{
警告(“必须填写姓氏”);
返回false;
}
var y=document.forms[“EloquaForm”][“C_EmailAddress”]。值;
var atpos=y.indexOf(“@”);
var dotpos=y.lastIndexOf(“.”);

if(atpos通过在ajax调用中传递'async:false'来对php页面进行同步调用

 $.ajax({
           type: "POST",
           async:false;
           url: "backend.php",         
           data: fields
        });

通过在ajax调用中传递“async:false”,对php页面进行同步调用

 $.ajax({
           type: "POST",
           async:false;
           url: "backend.php",         
           data: fields
        });
如果你改变这个

 $("form").on("submit", function() {
    if(window.localStorage!==undefined) {

这将阻止表单自然提交

!update:忘记将事件传递给函数!代码已更新

如果您更改此选项

 $("form").on("submit", function() {
    if(window.localStorage!==undefined) {

这将阻止表单自然提交

!update:忘记将事件传递给函数!代码已更新


当我理解正确时,您的问题是基于这样一个事实,即您希望在一次提交后做两件完全不同的事情。您可以通过几种方法来完成这一点

变体一:不使用Ajax,发布数据,在backend.php中执行任何操作,然后使用到其他服务器

变体二:如果您想用ajax实现这一点,可以这样尝试:

// this is your old anonymus function a bit modified...
var ajaxSubmitHandler = function(e) {
    e.preventDefault();
    if(window.localStorage!==undefined) {
        var fields = $(this).serialize();
        localStorage.setItem("eloqua-fields", JSON.stringify( fields ));
        $.ajax({
           type: "POST",
           url: "backend.php",
           data: fields,
           // and when ajax is done ... remove the event handler 
           done : function() {
                // deactivate submit handler....
                $("form").off("submit", ajaxSubmitHandler);
                // and simply retrigger the submit
                // this time it will only do the normal action
                $("form").submit();
           }
        });

    } else {
        alert("Storage Failed. Try refreshing");
    }
}

// per default you use the handler with the nested ajax request
$("form").on("submit", ajaxSubmitHandler);

当我理解正确的时候,你的问题是基于这样一个事实,你想在一次提交后做两件完全不同的事情。你可以通过几种方式来做到这一点

变体一:不使用Ajax,发布数据,在backend.php中执行任何操作,然后使用到其他服务器

变体二:如果您想用ajax实现这一点,可以这样尝试:

// this is your old anonymus function a bit modified...
var ajaxSubmitHandler = function(e) {
    e.preventDefault();
    if(window.localStorage!==undefined) {
        var fields = $(this).serialize();
        localStorage.setItem("eloqua-fields", JSON.stringify( fields ));
        $.ajax({
           type: "POST",
           url: "backend.php",
           data: fields,
           // and when ajax is done ... remove the event handler 
           done : function() {
                // deactivate submit handler....
                $("form").off("submit", ajaxSubmitHandler);
                // and simply retrigger the submit
                // this time it will only do the normal action
                $("form").submit();
           }
        });

    } else {
        alert("Storage Failed. Try refreshing");
    }
}

// per default you use the handler with the nested ajax request
$("form").on("submit", ajaxSubmitHandler);

如果要等待两个ajax请求完成,可以使用jquery延迟对象。这样,只有当两个请求都完成时,才能重定向到另一个页面。下面是使用延迟对象的简单示例代码

var fn1 = $.ajax("/url-1.php");
var fn2 = $.ajax("/url-2.php");

$.when(fn1, fn2).done(function(fn1, fn2) {
  alert("all complete");
});

如果要等待两个ajax请求完成,可以使用jquery延迟对象。这样,只有当两个请求都完成时,才能重定向到另一个页面。下面是使用延迟对象的简单示例代码

var fn1 = $.ajax("/url-1.php");
var fn2 = $.ajax("/url-2.php");

$.when(fn1, fn2).done(function(fn1, fn2) {
  alert("all complete");
});
在ajax请求完成后执行form.submit()。根据这一点,它应该绕过事件处理程序并获得所需的结果

var isSubmitted = false;
$(document).ready(function(){
    localStorage.clear();

    $("form").on("submit", function(evt) {
        if (!isSubmitted) {
            evt.preventDefault();
            var $this = $(this);
            if(window.localStorage!==undefined) {
                var fields = $(this).serialize();

                // Not an async task so don't need promise.
                localStorage.setItem("eloqua-fields", JSON.stringify( fields ));

                $.ajax({
                  type: "POST",
                  url: "backend.php",         
                  data: fields
                }).done(function() {
                  isSubmitted = true;
                  $this.submit();
                });
            } else {
                alert("Storage Failed. Try refreshing");
            }
            return false;
        } else {
            return true;
        }
    });
});
这是未经测试的,因此不确定它是否能正常工作。尽管如此,这是一种相当复杂的处理方式。在我看来,执行AJAX请求+提交表单感觉是错误的。我认为坚持执行两个AJAX请求(包括表单提交)。

执行表单提交()在您的ajax请求完成之后。根据这一点,它应该绕过您的事件处理程序并获得您想要的结果

var isSubmitted = false;
$(document).ready(function(){
    localStorage.clear();

    $("form").on("submit", function(evt) {
        if (!isSubmitted) {
            evt.preventDefault();
            var $this = $(this);
            if(window.localStorage!==undefined) {
                var fields = $(this).serialize();

                // Not an async task so don't need promise.
                localStorage.setItem("eloqua-fields", JSON.stringify( fields ));

                $.ajax({
                  type: "POST",
                  url: "backend.php",         
                  data: fields
                }).done(function() {
                  isSubmitted = true;
                  $this.submit();
                });
            } else {
                alert("Storage Failed. Try refreshing");
            }
            return false;
        } else {
            return true;
        }
    });
});

这是未经测试的,所以不确定它是否能正常工作。尽管如此,这是一种相当复杂的处理方式。在我看来,做一个AJAX请求+表单提交后感觉是错误的。我认为坚持做两个AJAX请求(包括表单提交).

这不是一个很好的方法。有点违背了Ajax的目的。这不是一个很好的方法。有点违背了ajaxUncaught引用的目的错误:e没有正确定义。它可以工作,但不运行外部脚本
action=”http://s33.t.eloqua.com/e/f2"
在submit按钮上。这是因为事件阻止了它的运行,这会将数据发布到您的ajax.url:backend.php您可以从该文件中运行另一个脚本,只要您对外部资源有权限!@Marty-外部源,您是指backend.php还是?未捕获引用错误:e未定义正确。这可以工作,但它不运行外部脚本
action=”http://s33.t.eloqua.com/e/f2"
在submit按钮上。这是因为事件阻止了它的运行,这会将数据发布到您的ajax.url:backend.php您可以从该文件中运行另一个脚本,只要您对外部资源有权限!@Marty-通过外部源,您是指backend.php还是?感谢您回答Vivek,但如果您看到我的同事de,一个是AJAX请求,另一个是提交操作。我该怎么办?谢谢你回答Vivek,但如果你看到我的代码,一个是AJAX请求,另一个是提交操作。我该怎么办?不确定第二个变体是否有效。你能用原始文件在本地进行测试吗:非常感谢,我不会这么做,这是你的项目不是我的,我