我正在使用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
答案 0 :(得分:3)
当您通过常规方法提交表单时,会设置submit-reg
。当您使用preventDefaul()并以异步方式发送表单时,永远不会设置该值,因为表单永远不会被提交,尽管它是异步处理的。您应该使用另一种方法来检查表单是否正在处理或构建。也许是隐藏的领域。或另一面旗帜在页面上设置dinamicaly。
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`不存在,因为它永远不会被设置。
现在提交表单时, 消息被提醒。这发生在之前 实际提交,所以我们可以 通过调用取消提交操作 事件对象上的.preventDefault() 或者从我们的网站上返回false 处理程序。
答案 1 :(得分:2)
如果PHP的行为不同,那么它的输入就不同了。在两种情况下都要print_r($_POST)
,看看有什么不同。 PHP并不关心你在页面上运行了一些Javascript。它只会看到一些表格值。
如果有不同的值,那么它的行为会有所不同。因此,请检查这些输入并找出您的Javascript更改表单数据的原因。