PHP 函数在 PreventDefault() 之后对提交的响应不同

发布于 2024-11-08 12:10:18 字数 1658 浏览 0 评论 0原文

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

I'm using a PHP file (as part of a wordpress plugin), which contains several functions.
One of them builds an html form and another one deals with the submitted form.
I've added to the function that builds the form a submit() function in which I call an asynchronous function.
In order for it to finish before the form is submitted I'm using preventDefault() and a call to submit() when the async function finishes.
The problem is that my call to submit() after preventDefault() causes different results in the PHP function that handles the submitted form than the original submit.

Here's the PHP code:

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

When I don't use preventDefault() and submit() the condition is positive and the form is submitted normally.
When I do use them the second part is executed and the form is being rebuilt instead of submitted.
So the question is: what in preventDefault() and then submit() causes isset($_POST['submit-reg'])) to be false and how can I fix it?
edit: Here's the 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡淡的优雅 2024-11-15 12:10:18

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

来自 W3C

17.13.3 处理表单数据

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

第一步:确定成功的控件

第二步:构建表单数据集

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

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

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

第四步:提交编码表单
*数据集*

最后将编码后的数据发送到
指定的加工代理人
使用协议的操作属性
由method属性指定。

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

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

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

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

来自 jQuery 站点的更多信息

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

When you submit the form via normal methods then submit-reg is set. When you use preventDefaul() and send the form asynchronously then the value is never set, because the form is never submited, altough it's processed asynchronously. You should use another method to check is the form is being processed or built. Perhaps a hidden field. or another flag set dinamicaly on the page.

From the W3C

17.13.3 Processing form data

When the user submits a form (e.g., by
activating a submit button), the user
agent processes it as follows.

Step one: Identify the successful controls

Step two: Build a form data set

A form data set is a sequence of
control-name/current-value pairs
constructed from successful controls

Step three: Encode the form data set

The form data set is then encoded
according to the content type
specified by the enctype attribute of
the FORM element.

Step four: Submit the encoded form
*data set*

Finally, the encoded data is sent to
the processing agent designated by the
action attribute using the protocol
specified by the method attribute.

This specification does not specify
all valid submission methods or
content types that may be used with
forms. However, HTML 4 user agents
must support the established
conventions in the following cases:

  • If the method is "get" and the action
    is an HTTP URI, the user agent takes
    the value of action, appends a `?' to
    it, then appends the form data set,
    encoded using the
    "application/x-www-form-urlencoded"
    content type. The user agent then
    traverses the link to this URI. In
    this scenario, form data are
    restricted to ASCII codes.
  • If the method is "post" and the action is an
    HTTP URI, the user agent conducts an
    HTTP "post" transaction using the
    value of the action attribute and a
    message created according to the
    content type specified by the enctype
    attribute. For any other value of
    action or method, behavior is
    unspecified.

User agents should render the response
from the HTTP "get" and "post"
transactions.

When you use preventDefault() you prevent this from happening making the variable ´submit-reg` unexistant because it is never set.

More info from jQuery site

Now when the form is submitted, the
message is alerted. This happens prior
to the actual submission, so we can
cancel the submit action by calling
.preventDefault() on the event object
or by returning false from our
handler.

蓝礼 2024-11-15 12:10:18

如果 PHP 的行为不同,那么它的输入也会不同。在这两种情况下都执行 print_r($_POST) 并看看有什么不同。 PHP 并不关心您在页面上运行了一些 Javascript。它所看到的只是一些传入的表单值。

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

If PHP's behaving differently, then its inputs are different. do print_r($_POST) in both situations and see what's different. PHP couldn't care less that you ran some Javascript on the page. All it'll see are some form values coming in.

If different values come in, then it'll behave differently. So check those inputs and figure out why your Javascript is changing the form data.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文