PHP函数响应不同,在preventDefault()之后提交

时间:2011-05-19 19:09:59

标签: php javascript jquery submit preventdefault

我正在使用PHP文件(作为wordpress插件的一部分),其中包含多个功能 其中一个构建一个html表单,另一个处理提交的表单 我已添加到构建表单submit()函数的函数中,我在其中调用异步函数 为了在提交表单之前完成,我正在使用preventDefault()并在异步函数完成时调用submit()
问题是我在submit()之后调用preventDefault()导致处理提交表单的PHP函数与原始提交不同。

这是PHP代码:

if(isset($_POST['submit-reg']))
{
    $output = sreg_process_form($atts); 
    return $output;
}
else
{
    $data = array();
    $form = simplr_build_form($data, $atts);        
    return $form;               
}

当我不使用preventDefault()submit()时,条件为正,表格正常提交。
当我使用它们时,第二部分被执行,表格正在重建而不是提交 问题是:preventDefault()然后submit()导致isset($_POST['submit-reg']))错误,我该如何解决? 编辑:这是JS:

$('#simplr-reg').submit(function(event)
{           
    event.preventDefault();
    codeAddress(function(success){}); //callback from googlemaps
});

function codeAddress(callback)
{               
    var geocoder = new google.maps.Geocoder();

    geoCodingStarted = true;

    geocoder.geocode( { 'address': address}, function(results, status)
    {
        if (status == google.maps.GeocoderStatus.OK) 
        {   
            var latitude = results[0].geometry.location.lat();
            var longitude = results[0].geometry.location.lng();
            $("input[name=latitude]").val(latitude); 
            $("input[name=longitude]").val(longitude);      

            $('#simplr-reg').submit();          
        }                   
    });         
}  // end of code address

2 个答案:

答案 0 :(得分:3)

当您通过常规方法提交表单时,会设置submit-reg。当您使用preventDefaul()并以异步方式发送表单时,永远不会设置该值,因为表单永远不会被提交,尽管它是异步处理的。您应该使用另一种方法来检查表单是否正在处理或构建。也许是隐藏的领域。或另一面旗帜在页面上设置dinamicaly。

From the W3C

  

17.13.3处理表单数据

     

当用户提交表单时(例如,通过   激活用户submit button)   代理处理如下。

     

第一步:确定successful controls

     

第二步:构建表单数据集

     

表单数据集是一系列的   控制名/当前值对   由成功的控制构建

     

第三步:对表单数据集进行编码

     

然后对表单数据集进行编码   根据内容类型   由enctype属性指定   FORM元素。

     

第四步:提交已编码的表格   * 数据集 *

     

最后,编码数据被发送到   由...指定的处理代理   使用协议的action属性   由method属性指定。

     

此规范未指定   所有有效的提交方法或   可以使用的内容类型   形式。但是,HTML 4用户代理   必须支持既定的   以下情况中的约定:

     
      
  • 如果方法是"get"并且操作   是一个HTTP URI,用户代理   行动的价值,附加一个“?”至   它,然后附加表单数据集,   用。编码   “应用程序/ x WWW的形式进行了urlencoded”   内容类型。然后是用户代理   遍历此URI的链接。在   这个场景,表单数据是   限制为ASCII码。
  •   
  • 如果方法为"post"且操作为   HTTP URI,用户代理进行   HTTP“post”事务使用   action属性的值和a   根据创建的消息   enctype指定的内容类型   属性。对于任何其他值   行动或方法,行为是   未指定的。
  •   
     

用户代理应呈现响应   来自HTTP“get”和“post”   交易。

当你使用preventDefault()时,你可以防止这种情况发生,使变量'submit-reg`不存在,因为它永远不会被设置。

More info from jQuery site

  

现在提交表单时,   消息被提醒。这发生在之前   实际提交,所以我们可以   通过调用取消提交操作   事件对象上的.preventDefault()   或者从我们的网站上返回false   处理程序。

答案 1 :(得分:2)

如果PHP的行为不同,那么它的输入就不同了。在两种情况下都要print_r($_POST),看看有什么不同。 PHP并不关心你在页面上运行了一些Javascript。它只会看到一些表格值。

如果有不同的值,那么它的行为会有所不同。因此,请检查这些输入并找出您的Javascript更改表单数据的原因。