【发布时间】:2015-03-30 05:27:53
【问题描述】:
在我的客户使用的 WordPress 主题中,联系表单是通过 Ajax 提交的。
表单标记
<form action="#" method="post" id="contactform">
<input type="text" class="required" name="name" id="name" />
<button name="send" type="submit" id="submit">Send</button>
<div id="success"></div>
<div id="failure"></div>
</form>
contact_form.js
(function ($) {
function themeContactForm() {
function start() {
//binds the form elements here
}
function submit(e) {
//check for form validation
return false;
}
function send(data) {
jQuery.post(
ajaxurl,
{
action : 'themeContactForm',
data : data
},
result
);
}
function result(response) {
if(response.success) {
//show success message
} else {
//show failure message
}
}
start();
}
$.fn.themeContactForm = function() {
};
}(jQuery));
app.js
$("#contactform").themeContactForm();
问题:点击提交后,成功或失败的响应大约需要 3-4 秒才会出现。在那段时间里,用户可能认为什么都没有发生,他们再次点击提交。结果,接收到相同表单数据的多个副本。
问题:在不触及上述任何文件的情况下,是否可以在单击提交时显示“微调器”,并在成功或失败消息来自脚本时隐藏它,所以用户知道该表单正在处理中。
我可以修改 contact_form.js 并完成我的工作,但在主题更新时所做的修改将会丢失。
我已尝试绑定到 ajaxComplete 事件,但不知何故无法使其工作。
$( document ).ajaxComplete(function( event, xhr, settings ) {
alert("Global event called");
console.log( xhr.responseText );
});
但是警报根本没有触发。
【问题讨论】:
-
为什么要求不要触摸任何文件?通常,您会将 AJAX 微调器作为“beforeSend”和“完成”功能的一部分包含在您可以附加到 jQuery AJAX 请求中。
-
@Mark : 正如我在帖子中提到的,我对这些文件所做的更改将在下次主题更新时丢失。
-
您能展示一下您是如何尝试绑定到 ajaxComplete 事件的吗?这应该是正确的方法,也许有人可以指出错误。
-
难道不能只覆盖新文件中的现有方法吗?见:stackoverflow.com/questions/5007279/…
-
@movabo 你不需要覆盖 whole
themeContactForm函数吗?它所包含的所有功能本质上都是“私有的”。