AJAX表单多次提交后表单标识异常的解决方法问询
背景
我在网站上设置了一个邮件订阅表单。
该表单在每个网页的两个区域显示:头部和底部
这是完全相同的表单,仅为提升UX和可访问性而同时放在页面顶部和底部。
表单使用jQuery/AJAX脚本向用户返回成功和错误响应(例如:“Success! Your subscription is complete.”和“Error. Please review and re-submit”)。
用户提交表单时,输入信息会被添加到数据库,同时会向网站管理员发送通知邮件。
若使用头部表单,邮件主题为“Email Subscriber Added (Header Form)”。
若使用底部表单,邮件主题为“Email Subscriber Added (Footer Form)”。
(这是一种简单的统计各表单使用率的方法。)
PHP代码如下:
if ( $form_selected == 'header' ) { $mail->Subject = 'Email Subscriber Added (Header Form)'; $mail->Body = $message; } elseif ( $form_selected == 'footer' ) { $mail->Subject = 'Email Subscriber Added (Footer Form)'; $mail->Body = $message; } else { $mail->Subject = 'Email Subscriber Added (form version unknown)'; $mail->Body = $message; }
截至目前,所有功能运行正常。
问题
问题在于,当网站用户在同一会话中多次提交邮件订阅时,网站管理员会收到上述PHP脚本中else分支的邮件(主题为“Email Subscriber Added (form version unknown)”)。正常会话中该分支不应被触发,但必须刷新页面后,才能再次正常触发if和elseif分支的判断。
问题咨询
是否可通过修改以下jQuery/AJAX脚本解决该问题?若有必要,也可修改PHP代码。
jQuery/AJAX代码
$(function() { // set up event listener $('#header-form, #footer-form').submit(function(e) { // disable html submit button e.preventDefault(); // get the submit button var submitButton = $('[type=submit]', this); // get the messages element var formResponses = $('#header-form-responses, #footer-form-responses', this); formResponses.text(" "); // serialize form data var formData = $(this).serialize(); // disable submit button to prevent unnecessary submission submitButton.attr('disabled', 'disabled'); // tell users that form is sending submitButton.text('Processing...'); // submit form via AJAX $.ajax({ type: 'POST', url: $(this).attr('action'), data: formData }) .done(function(response) { // make sure formResponses element has 'success' class $(formResponses).removeClass('error'); $(formResponses).addClass('success'); // set message text $(formResponses).text('Your subscription is complete. Thank you!'); // clear form $('input').val(''); }) .fail(function(data) { // make sure formResponses element has 'error' class $(formResponses).removeClass('success'); $(formResponses).addClass('error'); // set the message text $(formResponses).text('Input error. Please review and re-submit.'); }) .always(function(data) { // this will always fire even if the request fails submitButton.removeAttr('disabled'); submitButton.text('Send'); }); }); });
HTML代码
<!-- simplified HTML --> <form action="process_form.php" method="post" id="header-form"> <input type="email" name="email_subscription"> <input type="hidden" name="formtarget" value="header"> <button type="submit" name="submit_subscription">Submit (Header)</button> <p id="header-form-responses"></p> </form> <form action="process_form.php" method="post" id="footer-form"> <input type="email" name="email_subscription"> <input type="hidden" name="formtarget" value="footer"> <button type="submit" name="submit_subscription">Submit (Footer)</button> <p id="footer-form-responses"></p> </form>
内容的提问来源于stack exchange,提问作者Michael Benjamin
相关产品推荐
相关产品推荐

