js进阶——使用js操作表单数据并回显

news2024/10/2 14:35:50

使用JavaScript操作表单数据并回显:实践与总结

在Web开发中,表单是非常常见的元素之一。如何通过JavaScript操作表单数据,处理数据结构并将数据回显到页面中,是一项非常有用的技能。在本文中,我将通过具体代码示例,详细介绍如何将表单数据封装为对象、根据需要替换属性名,并将对象数据回显到另一个表单。

1. 获取表单数据并封装为对象

表单元素结构

首先,我们需要一个包含多个输入框的表单,如用户名、兴趣爱好、工作等。HTML代码如下:

<form action="/" id="userform">
    用户名:<input type="text" name="username">
    兴趣爱好:<input type="text" name="hobby">
    工作:<input type="text" name="job">
    <button>提交</button>
</form>

使用JavaScript封装表单数据

接下来,通过JavaScript获取表单中的数据并将其封装为对象。为了灵活性,代码允许我们根据需要替换对象中的属性名。以下是关键的JavaScript函数 formDataToObj

function formDataToObj(form, replace) {
    const children = form.children;
    const obj = {};
    
    for (const child of children) {
        if (child.nodeName != 'BUTTON') {
            const name = child.name;
            const value = child.value;
            obj[name] = value;
        }
    }

    for (let key in replace) {
        obj[replace[key]] = obj[key];
        delete obj[key];
    }
    return obj;
}
代码详解:
  1. 遍历表单子元素:通过 form.children 获取表单中的所有子元素,然后通过循环遍历。
  2. 排除按钮元素:使用 if (child.nodeName != 'BUTTON') 来过滤掉按钮,避免其值被处理。
  3. 封装为对象:通过表单元素的 name 属性作为键,将对应的 value 作为值,生成对象。
  4. 属性替换:如果传入 replace 参数,允许将对象的键名进行替换。通过遍历 replace 对象,将旧键名替换为新键名。

使用示例

假设用户在表单中输入如下数据:

  • 用户名:张三
  • 兴趣爱好:篮球
  • 工作:工程师

我们使用 formDataToObj 方法并传入一个替换键名的对象,将 username 替换为 name

let userObj = formDataToObj(userform, { username: 'name' });
console.log(userObj);

执行后,控制台会输出如下对象:

{
    "name": "张三",
    "hobby": "篮球",
    "job": "工程师"
}

2. 将对象数据回显到表单中

获取数据后,有时需要将其回显到页面的另一个表单上,例如从数据库读取数据后展示。我们可以通过以下 objToFormData 方法实现:

function objToFormData(obj, form, objToForm) {
    if (!objToForm) {
        for (let key in obj) {
            const formElement = form.querySelector('.' + key);
            formElement.value = obj[key];
        }
    } else {
        for (let key in objToForm) {
            const formElement = form.querySelector('.' + key);
            formElement.value = obj[objToForm[key]];
        }
    }
}

代码详解:

  1. 直接映射:如果不传入第三个参数 objToForm,则默认认为对象属性名和表单元素的类名是相同的,直接通过类名映射赋值。
  2. 属性映射:如果传入 objToForm,则根据传入的映射关系将对象属性值赋给对应的表单元素。

使用示例

假设我们已经获取到用户对象 userObj,现在将其数据回显到另一个表单中:

const userformShow = document.getElementById('userform-show');
objToFormData(userObj, userformShow, {
    name: 'name',
    hobby: 'hobby',
    job: 'job'
});

这个操作会将 userObj 中的数据映射到相应的表单输入框中。

3. 综合示例

在实际项目中,我们可以通过 addEventListener 来监听表单的提交事件,并结合上面的两个方法实现数据的提取与回显。完整代码如下:

<form action="/" id="userform">
    用户名:<input type="text" name="username">
    兴趣爱好:<input type="text" name="hobby">
    工作:<input type="text" name="job">
    <button>提交</button>
</form>

<form action="/" id="userform-show">
    用户名:<input type="text" name="username" class="name">
    兴趣爱好:<input type="text" name="hobby" class="hobby">
    工作:<input type="text" name="job" class="job">
</form>

<script>
    let userObj;
    const userform = document.getElementById('userform');
    userform.addEventListener('submit', (event) => {
        event.preventDefault();
        userObj = formDataToObj(userform, { username: 'name' });
        console.log('表单数据封装为对象:', userObj);
    });

    userform.addEventListener('submit', (event) => {
        const userformShow = document.getElementById('userform-show');
        objToFormData(userObj, userformShow, {
            name: 'name',
            hobby: 'hobby',
            job: 'job'
        });
    });
</script>

4. 总结

通过本文,可以学会如何使用JavaScript将表单数据封装为对象,如何替换对象中的属性名,以及如何将对象数据回显到表单中。这些技巧在实际的Web开发中非常实用,能够帮助你更好地处理表单数据。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2184568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nature reviews genetics | 基因调控网络方法总结

–https://doi.org/10.1038/s41576-023-00618-5 Gene regulatory network inference in the era of single-cell multi-omics 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 研究团队和单位 Julio Saez-Rodriguez—Heidelberg University Ricard Arge…

Let‘s Encrypt 的几个常用命令

Lets Encrypt 是免费的 ssl 证书提供商&#xff0c;在当前纷纷收费的形式下&#xff0c;这是一个良心厂家&#xff0c;虽然使用起来略微繁琐。坚决抵制某 cxxn 站&#xff0c;竟然开始有辣么多收费的东西。这里记录几个常用的命令&#xff08;使用环境Ubuntu 24&#xff09;&am…

Proxmox使用tc给虚拟机限速,实现不对等网速——浪浪云

文章目录 前言第一步查看虚拟机的虚拟网卡名字第二部 设置上传速度限制第三部 设置下载速度限制第四部 验证是否成功查看队列调度器查看过滤器 第五步 如何解除网卡限速 前言 由于proxmox虚拟机限速只能限速对等&#xff0c;但是我想让下载和上传速度不对等&#xff0c;例如上传…

录屏软件大比拼:四款必备工具助你轻松录制精彩瞬间!

哎呀&#xff0c;说到电脑录屏这事儿&#xff0c;我这个办公室小文员可是深有体会啊&#xff01;平时工作里&#xff0c;经常需要录个会议啊、做个教程啊&#xff0c;或者分享个操作技巧给同事们看。市面上的录屏软件多得数不清&#xff0c;但我最常用的几款工具。今天就来跟大…

Vue3 proxy跨域代理

一、跨域问题 假设vue项目的运行地址为&#xff1a;http://localhost:5173&#xff0c;此时我们想要调用后端服务的rest api&#xff0c;而后端接口暴露的地址为&#xff1a;https://192.168.1.1:8080/user。 可以发现前端服务与后端服务的域名是不同的&#xff0c;默认情况下…

C语言 | Leetcode C语言题解之第445题两数相加II

题目&#xff1a; 题解&#xff1a; struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){int stack1[100];int stack2[100];int top1 0;int top2 0;int carry 0;int sum 0;struct ListNode* temp NULL;struct ListNode* head NULL;while (l1) {…

基于ssm大学生自主学习网站的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1、毕业论文&#xff08;设计&#xff09;的背景及意义&#xff1a; &#xff08;1&#xff09;研究背景 目前&#xff0c;因特网是世界上最大的计算机互联网络&#xff0c;它通过网络设备将世界各地互相独立的不同规模的局域…

五、Drf权限组件

五、权限组件 权限组件=[权限类,权限类,权限类…] 执行所有权限类的has_permission方法,通过返回True,不通过返回False 默认情况下,所有的权限类都通过,才返回True 5.1简单应用权限组件 #ext.per class MyPermission1(BasePermission):def has_permission(self, requ…

Redis篇(Redis原理 - 网络模型)

目录 一、用户空间和内核态空间 二、阻塞IO 三、非阻塞IO 四、IO多路复用 五、IO多路复用-select方式 六、IO多路复用模型-poll模式 七、IO多路复用模型-epoll函数 八、网络模型-epoll中的ET和LT 九、网络模型-基于epoll的服务器端流程 十、网络模型-信号驱动 异步IO…

Linux安装RabbitMQ安装

1. RabbitMQ介绍 1.1 RabbitMQ关键特性 异步消息传递&#xff1a;允许应用程序在不直接进行网络调用的情况下交换消息。 可靠性&#xff1a;支持消息持久化&#xff0c;确保消息不会在系统故障时丢失。 灵活的路由&#xff1a;支持多种路由选项&#xff0c;包括直接、主题、…

7--苍穹外卖-SpringBoot项目中套餐管理 详解(一)

前言 目录 新增套餐 需求分析和设计 代码开发 根据分类id查询菜品 Controller层 Service层 ServiceImpl层 Mapper层 DishMapper.xml 新增套餐 实体类 mapper层 Service层 ServiceImpl层 Mapper层 SetmealMapper.xml setmealDishMapper.xml 套餐分页查询 需求分…

网络协议详解--IPv6

IPv6产生背景 &#xff08;1&#xff09;地址空间的耗尽&#xff1a;因特网呈指数级发展&#xff0c;导致IPv4地址空间几乎耗尽。虽然采用了子网划分、CIDR和NAT地址转换技术&#xff0c;但这没有从根源解决地址耗尽的问题 &#xff08;2&#xff09;IP层安全需求的增长&#x…

【拥抱AIGC】通义灵码策略配置

通义灵码企业级策配置支持智能问答、行间代码生成安全过滤器相关策略配置。 适用版本 企业标准版、企业专属版 通义灵码管理员、组织内全局管理员&#xff08;专属版&#xff09;在通义灵码控制台的策略配置中进行安全过滤器的配置&#xff0c;开启后&#xff0c;企业内开发…

第十一届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(大学组第二套)

一.题目分析 &#xff08;1&#xff09;.题目 &#xff08;2&#xff09;.题目分析 1..按键功能分析 a. B1界面切换 b. B2每次按下&#xff0c;PA6手动模式占空比参数增加10% c. B3每次按下&#xff0c;PA7手动模式占空比参数增加10% d. B4模式切换 f. 在数据显示界面下…

JAVA姓氏头像情侣头像家庭头像签名头像谐音顽埂头像设计小程序头像大全系统小程序源码

姓氏头像到谐音梗&#xff0c;打造你的专属头像大全系统 &#x1f3a8;✨ &#x1f468;‍&#x1f469;‍&#x1f467;‍&#x1f466; 家庭头像&#xff1a;记录温馨瞬间 在这个充满爱的时代&#xff0c;用一张家庭头像来记录你和家人的美好瞬间吧&#xff01;我们的“姓氏…

Linux 进程状态、僵尸进程与孤儿进程

目录 0.前言 1. 进程状态 1.1 定义 1.2 常见进程 2.僵尸进程 2.1 定义 2.2 示例 2.3 僵尸进程的危害与防止方法 3. 孤儿进程 3.1 介绍 3.2 示例 4.小结 &#xff08;图像由AI生成&#xff09; 0.前言 在上一篇文章中&#xff0c;我们介绍了进程的基本概念、进程控制块&#…

Python Flask 和 Django 的区别与适用场景

Flask 和 Django 的异同&#xff08;结合代码解释&#xff09; Flask 和 Django 是两个流行的 Python Web 框架。尽管它们都是用于构建 Web 应用程序的强大工具&#xff0c;但它们的设计哲学、功能和用法有很大的区别。通过代码示例&#xff0c;可以更直观地理解 Flask 和 Dja…

基础岛第1关:书生大模型全链路开源体系

了解书生浦语大模型体系&#xff1a;书生浦语 InternLM2.5 系列模型&#xff1a; 卓越的推理性能&#xff1a;在数学推理方面取得了同量级模型最优精度&#xff0c;超越了 Llama3 和 Gemma2-9B。有效支持百万字超长上下文&#xff1a;模型在 1 百万字长输入中几乎完美地实现长…

一文讲透大语言模型构建流程

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

用友U8-CRM fillbacksettingedit.php SQL注入复现

0x01 产品描述&#xff1a; 用友U8-CRM是企业利用信息技术&#xff0c;是一项商业策略&#xff0c;它通过依据市场细分组织企业资源、培养以客户为中心的经营行为、执行以客户为中心的业务流程等手段来优化企业的客户满意度和获利能力。 0x02 漏洞描述&#xff1a; 用友 U8 C…