AJAX表单提交跳转空白页问题排查:需无刷新入库等功能
问题:表单提交跳转至
sucms.php,无法实现无刷新插入数据库 我想要实现无刷新插入数据库的功能,同时需要表单重置和JavaScript实时筛选功能,但使用以下代码时无法达成预期效果。提交表单时会打开新的空白页面sucms.php,尽管数据已成功插入数据库,但页面跳转问题未解决。请问问题出在哪里?为何表单提交会跳转到sucms.php?
我的代码
JavaScript代码
function fsocietyApp() { var img = document.getElementById('uploadphoto'); var fup = img.value; var error = document.getElementById('fsoc'); var ex = fup.substring(fup.lastIndexOf('.') + 1).toLowerCase(); var website = document.getElementById('website'); var webUrl = document.getElementById('webUrl'); var re = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/; //firstname if (fnvaluf.value.length == 0) { fnufb.innerHTML = 'First name is required'; fnvaluf.classList.add('errorb'); return false; } else if (/[^a-zA-Z0-9\-\/]/.test(fnvaluf.value) && fnvaluf.value.length != 0) { fnuf.innerHTML = 'Only letters [a-z],numbers [0-9] are allowed'; fnvaluf.classList.add("error"); platform = 'off'; fnufb.innerHTML = ''; fnvaluf.classList.remove('errorb'); return false; } //lastname else if (lnvaluf.value.length == 0) { lnufb.innerHTML = 'Last name is required'; lnvaluf.classList.add('errorb'); return false; } else if (/[^a-zA-Z0-9\-\/]/.test(lnvaluf.value) && lnvaluf.value.length > 0) { lnuf.innerHTML = 'Only letters [a-z],numbers [0-9] are allowed'; lnvaluf.classList.add("error"); platform = 'off'; lnufb.innerHTML = ''; lnvaluf.classList.remove('errorb'); return false; } //username else if (x.value.length == 0) { y.innerHTML = "Username is required"; x.classList.add("error"); platform = 'off'; nfsoc.style.color = "white"; return false; } else if (x.value.length < 4) { x.classList.add("error"); platform = 'off'; nfsoc.style.color = "white"; y.innerHTML = "Use 4 characters or more"; return false; } else if (x.value.length > 12) { platform = 'off'; x.classList.add("error"); nfsoc.style.color = "white"; y.innerHTML = "Use 12 characters or less"; return false; } else if (/[^a-zA-Z0-9\-\/]/.test(x.value) && x.value.length > 0) { y.innerHTML = 'Only letters [a-z],numbers [0-9] are allowed'; x.classList.add("error"); platform = 'off'; return false; } //email else if (!hashOne.test(email.value) || !hashTwo.test(email.value) || !hashThree.test(email.value)) { emailuf.innerHTML = "Invalid E-mail address"; email.classList.add('error'); platform = 'on'; return false; } else if (email.value.length == 0) { emailuf.innerHTML = "E-mail is required"; email.classList.add('error'); return false; } //password else if (password.value.length < 6 && password.value.length != 0) { pswuf.innerHTML = "Use 6 characters or more"; password.classList.add('error'); return false; } else if (password.value.length == 0) { pswuf.innerHTML = "Password is required"; password.classList.add('error'); return false; } //repeat password else if (password.value != rpassword.value && password.value.length != 0) { rpswuf.innerHTML = "Your passwords do not match"; rpassword.classList.add('error'); platform = 'off'; return false; } else if (password.value.length == 0 && rpassword.value.length != 0) { rpswuf.innerHTML = ""; rpassword.classList.remove('error'); return false; } else if (document.getElementById("uploadphoto").files.length != 0 && ex != "gif" && ex != "png" && ex != "bmp" && ex != "jpeg" && ex != "jpg") { error.innerHTML = "<img style='position:relative;bottom:12px' src='img/red.png' alt='error'>"; return false; } else if (website.value !== '') { if (!re.test(website.value)) { if (!re.test(website.value)) { website.classList.add('error'); webUrl.innerHTML = "Invalid URL Address"; return false; } } } $(document).ready(function() { $("#formid").submit(function(e) { var formObj = $(this); var formURL = formObj.attr("action"); if (window.FormData !== undefined) { var formData = new FormData(this); $.ajax({ url: formURL, type: 'POST', data: formData, mimeType: "multipart/form-data", contentType: false, cache: false, processData: false, success: function(data, textStatus, jqXHR) { $("#multi-msg").html('<pre><code>' + data + '</code></pre>'); $("#formid")[0].reset(); }, error: function(jqXHR, textStatus, errorThrown) { $("#multi-msg").html('<pre><code class="prettyprint">AJAX Request Failed<br/> textStatus=' + textStatus + ', errorThrown=' + errorThrown + '</code></pre>'); } }); e.preventDefault(); e.unbind(); } }); }); }
HTML代码
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form id="formid" method="post" onsubmit="return fsocietyApp()" action="sucms.php">
问题分析
你的核心问题出在AJAX事件绑定的时机和表单默认行为的阻止逻辑上,具体来说:
AJAX代码被包裹在
$(document).ready()中,无法在表单提交时触发
当表单提交调用fsocietyApp()时,$(document).ready()的回调函数是等待DOM加载完成后才执行的——但此时表单已经开始默认提交流程了,这个回调里的$("#formid").submit()事件绑定根本没来得及生效,所以AJAX完全没执行,表单还是按照默认逻辑跳转到sucms.php。fsocietyApp()函数最后没有返回false,无法阻止表单默认提交
即使AJAX代码能执行,你的函数最后没有返回false,也没有主动阻止表单的默认提交行为,所以表单还是会跳转。
解决方案
我们需要调整代码结构,把AJAX逻辑直接整合到验证流程中,并且明确阻止表单默认行为。这里提供两种修改方案:
方案一:修改fsocietyApp()函数,直接在验证通过后执行AJAX
function fsocietyApp(e) { // 先阻止表单默认提交行为 e.preventDefault(); var img = document.getElementById('uploadphoto'); var fup = img.value; var error = document.getElementById('fsoc'); var ex = fup.substring(fup.lastIndexOf('.') + 1).toLowerCase(); var website = document.getElementById('website'); var webUrl = document.getElementById('webUrl'); var re = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/; // --- 所有验证逻辑保持不变 --- // firstname验证... // lastname验证... // username验证... // email验证... // password验证... // repeat password验证... // 图片格式验证... // URL验证... // 如果所有验证都通过,执行AJAX var formObj = $("#formid"); var formURL = formObj.attr("action"); if (window.FormData !== undefined) { var formData = new FormData(formObj[0]); $.ajax({ url: formURL, type: 'POST', data: formData, mimeType: "multipart/form-data", contentType: false, cache: false, processData: false, success: function(data, textStatus, jqXHR) { $("#multi-msg").html('<pre><code>' + data + '</code></pre>'); $("#formid")[0].reset(); // 表单重置 }, error: function(jqXHR, textStatus, errorThrown) { $("#multi-msg").html('<pre><code>AJAX Request Failed<br/> textStatus=' + textStatus + ', errorThrown=' + errorThrown + '</code></pre>'); } }); } }
然后修改HTML的表单标签,把事件对象传递给函数:
<form id="formid" method="post" onsubmit="fsocietyApp(event)" action="sucms.php">
方案二:移除onsubmit属性,用jQuery绑定提交事件(更推荐)
这种方式更符合jQuery的事件绑定规范,代码结构更清晰:
JavaScript代码
$(document).ready(function() { $("#formid").submit(function(e) { // 阻止默认提交行为 e.preventDefault(); var isValid = true; var img = document.getElementById('uploadphoto'); var fup = img.value; var error = document.getElementById('fsoc'); var ex = fup.substring(fup.lastIndexOf('.') + 1).toLowerCase(); var website = document.getElementById('website'); var webUrl = document.getElementById('webUrl'); var re = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/; // --- 所有验证逻辑保持不变,但把return false改成isValid = false --- // firstname验证 if (fnvaluf.value.length == 0) { fnufb.innerHTML = 'First name is required'; fnvaluf.classList.add('errorb'); isValid = false; } else if (/[^a-zA-Z0-9\-\/]/.test(fnvaluf.value) && fnvaluf.value.length != 0) { fnuf.innerHTML = 'Only letters [a-z],numbers [0-9] are allowed'; fnvaluf.classList.add("error"); platform = 'off'; fnufb.innerHTML = ''; fnvaluf.classList.remove('errorb'); isValid = false; } // lastname验证...同理修改return false为isValid = false // username验证... // email验证... // password验证... // repeat password验证... // 图片格式验证... // URL验证... // 如果验证通过,执行AJAX if (isValid) { var formObj = $(this); var formURL = formObj.attr("action"); if (window.FormData !== undefined) { var formData = new FormData(this); $.ajax({ url: formURL, type: 'POST', data: formData, mimeType: "multipart/form-data", contentType: false, cache: false, processData: false, success: function(data, textStatus, jqXHR) { $("#multi-msg").html('<pre><code>' + data + '</code></pre>'); $("#formid")[0].reset(); // 表单重置 }, error: function(jqXHR, textStatus, errorThrown) { $("#multi-msg").html('<pre><code>AJAX Request Failed<br/> textStatus=' + textStatus + ', errorThrown=' + errorThrown + '</code></pre>'); } }); } } }); // 实时筛选/验证功能示例:给输入框绑定input事件 $("#fnvaluf, #lnvaluf, #x, #email").on("input", function() { // 这里写实时验证逻辑,比如输入时清除错误提示、实时检查格式等 $(this).removeClass('error'); // 针对不同字段的实时验证逻辑... }); });
HTML代码(移除onsubmit属性)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form id="formid" method="post" action="sucms.php">
补充说明
- 关于表单重置:AJAX成功回调里的
$("#formid")[0].reset()已经可以实现,只要AJAX执行成功就会触发。 - 关于实时筛选/验证:可以给表单输入框绑定
input事件(如方案二所示),在用户输入时实时检查内容,给出反馈,比如清除错误提示、实时验证格式等。
内容的提问来源于stack exchange,提问作者Fsociety
相关产品推荐
相关产品推荐

