2

我正在使用一个 PHP 文件(作为 wordpress 插件的一部分),它包含几个函数。
其中一个构建一个 html 表单,另一个处理提交的表单。
我已经向构建表单的函数添加了一个submit()函数,在该函数中我调用了一个异步函数。
为了让它在提交表单之前完成,我正在使用preventDefault()submit()在异步函数完成时调用。
问题是我对submit()after的调用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
4

2 回答 2

3

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

来自 W3C

17.13.3 处理表单数据

当用户提交表单时(例如,通过激活提交按钮),用户代理按如下方式处理它。

第一步:确定成功的控制

第二步:构建表单数据集

表单数据集是从成功的控件构造的一系列控件名称/当前值对

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

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

第四步:提交编码形式 *数据集*

最后,使用方法属性指定的协议将编码数据发送到操作属性指定的处理代理。

本规范未指定可与表单一起使用的所有有效提交方法或内容类型。但是,HTML 4 用户代理在以下情况下必须支持已建立的约定:

  • 如果方法是"get"并且操作是 HTTP URI,则用户代理获取操作的值,附加一个“?” 到它,然后附加表单数据集,使用“application/x-www-form-urlencoded”内容类型编码。用户代理然后遍历此 URI 的链接。在这种情况下,表单数据仅限于 ASCII 代码。
  • 如果方法是"post"并且操作是 HTTP URI,则用户代理使用操作属性的值和根据 enctype 属性指定的内容类型创建的消息执行 HTTP“发布”事务。对于动作或方法的任何其他值,行为是未指定的。

用户代理应该呈现来自 HTTP“get”和“post”事务的响应。

当您使用时,您preventDefault()可以防止这种情况发生,因为它从未设置过,因此变量 'submit-reg' 不存在。

来自 jQuery 网站的更多信息

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

于 2011-05-19T19:15:36.510 回答
2

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

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

于 2011-05-19T19:14:14.777 回答