You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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事件绑定的时机和表单默认行为的阻止逻辑上,具体来说:

  1. AJAX代码被包裹在$(document).ready()中,无法在表单提交时触发
    当表单提交调用fsocietyApp()时,$(document).ready()的回调函数是等待DOM加载完成后才执行的——但此时表单已经开始默认提交流程了,这个回调里的$("#formid").submit()事件绑定根本没来得及生效,所以AJAX完全没执行,表单还是按照默认逻辑跳转到sucms.php。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:47