关于ajax提交后表单的reset

本文探讨了在使用jQuery插件处理多个表单时遇到的问题,即表单重置后始终记录页面初始化值的情况,并提供了解决方法。

背景:
    产品要求提供ajax交互的体验方式,然后一张页面有那么多的表单,每个表单还有那么多的字段,而且当前页面只能显示一个form(其他form隐藏)所有的form表单的修改,添加都是在当前的页面内完成。

   一个字段一个字段去找太麻烦了,就采用了这个jquery插件jquery form plugin(http://jquery.malsup.com/form/),很好用,不用一个字段一个字段的去找了(重复劳动,一团代码什么的最讨厌了。。),然而悲剧就此发生了。。。

   因为当前页面同时只能显示一个form,但如果用户修改了,但没有提交,这时候的业务需求就是,将当前的表单reset的前一次状态,似乎没什么问题,挺简单的,把隐藏的时候将当前的form RESET到“页面渲染”的时候的状态(所有的表单都是在请求当前页面后将所有的字段赋值,没有通过js来做)。问题就出在这里,表单reset后始终记录的是请求后初始化的值。

解决方法:

     既然reset()方法记录的是页面初始化的值,将这个值修改就行了,直接修改表单的value还是不可以的,不信的可以去试试,反正我是试过了,其实原理很简单,给value赋值其实就是在表单上填值。如果这个有用,reset还有什么用呢?

    终归有方法的,公司牛人告诉我可以通过javascript setAttibute来做,果断试一下,过然可以。通用代码如下:

 

  //改变Select控件的值  
  function changeSelectValAttr(helement) {
        var j = 0, options = helement.options, t, selVal;
        selVal = helement.value;
        for ( ; j< options.length; j++) {
            if (selVal == options[j].value) {
                options[j].setAttribute("selected", "selected");
            } else {
                options[j].removeAttribute("selected");
            }
        }
    }  
 

 

 

   //改变checkbox控件的值 
   function changeCheckValAttr(helement) {
        var checks = helement.checked;
        if (checks) {
            helement.setAttribute("checked", "checked");
        }
        else {
            helement.removeAttribute("checked");
        }
    }

 

  function changeCommonTextValAttr(helement) {
        helement.setAttribute("value", helement.value);
    }

 

    function changeRadioValAttr(helement) {
        if (helement.checked) {
            helement.setAttribute("checked", "checked");
        } else {
            helement.removeAttribute("checked");
        }
    }

 

 

    function resetElementValAttr(helement) {
        var tagName = helement.tagName, tagType = helement.type;
        if (tagName.toUpperCase() == "INPUT" && tagType == "text") {
            changeCommonTextValAttr(helement);
        } 
        else if (tagName.toUpperCase() == "SELECT") {
            changeSelectValAttr(helement);
        } 
        else if (tagName.toUpperCase() == "INPUT" && tagType == "checkbox") {
            changeCheckValAttr(helement);
        } 
        else if (tagName.toUpperCase() == "INPUT" && tagType == "radio") {
            changeRadioValAttr(helement);
        }          
    }

    function resetFormAttrs(aform) {
        $.map(aform[0].elements, resetElementValAttr);
    }

 

结束...

这是一篇忽悠人的文章。。。因为在IE中是无效的。。 我也很悲剧的,换了种解决方法,稍后。。

 

 

 

在前端开发中,使用 Ajax 请求获取表单数据是常见的操作。以下为不同方式获取表单数据并通过 Ajax 发送请求的介绍: ### 原生 JavaScript 结合 Ajax 获取表单数据 对于原生 JavaScript 结合 Ajax 获取表单数据,可通过获取表单元素,再遍历表单元素获取其值,最后使用 XMLHttpRequest 对象发送请求。示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原生 JS Ajax 获取表单数据</title> </head> <body> <form id="myForm"> <label for="name">姓名:</label> <input type="text" id="name" name="name" value="张三"> <label for="age">年龄:</label> <input type="number" id="age" name="age" value="25"> <input type="button" value="提交" onclick="submitForm()"> </form> <script> function submitForm() { const form = document.getElementById('myForm'); const formData = new FormData(form); const xhr = new XMLHttpRequest(); xhr.open('POST', 'your-url.php', true); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(formData); } </script> </body> </html> ``` 在上述代码里,先获取表单元素,然后利用 `FormData` 对象收集表单数据,最后借助 `XMLHttpRequest` 对象发送 POST 请求。 ### jQueryAjax 获取表单数据 使用 jQueryAjax 方法获取表单数据更为简便,可使用 `serialize()` 方法对表单数据进行序列化。示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>jQuery Ajax 获取表单数据</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> </head> <body> <form id="login_value"> <div> <label>用户名:</label> <input id="username" type="text" name="username" placeholder="请输入用户名" value="admin"> </div> <div> <label>密 码:</label> <input id="passwd" type="password" name="passwd" placeholder="请输入密码" value="123456"> </div> <div> <input type="button" value="登陆" onclick="login()"> <input type="reset" value="重置"> </div> </form> <script> function login() { const formData = $('#login_value').serialize(); $.ajax({ url: 'your-url.php', type: 'POST', data: formData, success: function (response) { console.log(response); }, error: function (error) { console.error(error); } }); } </script> </body> </html> ``` 在这段代码中,使用 `serialize()` 方法对表单数据进行序列化,然后通过 `$.ajax()` 方法发送 POST 请求 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值