框架盛行,还记得原生JS如何获取表单数据吗?

news2024/9/17 20:51:48

你好同学,我是沐爸,欢迎点赞、收藏和关注!个人知乎

在这个前端框架遍地开花的时代,同学们常常被React、Vue、Angular等现代JavaScript框架的便捷性和高效性所吸引。那么多年过去,你还记得原生JS是如何获取表单数据的吗?今天我们一起回顾下。

如何获取整个表单?

// 方式一
var formEl = document.getElementById('loginForm'); 

// 方式二
var formEl = document.querySelector('#loginForm'); 

// 方式三
var formEl = document.forms.loginForm; 
var formEl = document.forms['loginForm']; 

document 提供了一个属性"forms",用来存储页面上的所有表单元素。如果 form 元素具有 id 或 name 属性,那么可以通过 . 或 [] 快速访问。

如何获取单个表单元素?

方式一:
可以通过document.getElementByIddocument.querySelector获取单个表单元素,并读取其value属性。

var username = document.getElementById('username').value;  
var password = document.getElementById('password').value;

方式二:
可以借助 form 元素读取单个表单元素及其值。

var formEl = document.getElementById('loginForm');var formEl = document.forms.loginForm; 

console.log(formEl.username.value, formEl.password.value)

遍历表单中的所有元素

对于包含多个输入字段的表单,我们可以使用document.forms集合来访问表单,并通过遍历表单中的elements集合来获取所有元素的值。

函数封装:

function collectFormData(form) {
    let formData = {};

    // 遍历表单中的所有元素  
    Array.from(form.elements).forEach(element => {
        // 忽略没有name属性的元素  
        if (!element.name) return;

        // 处理单值输入元素  
        if (['text', 'password', 'email', 'number', 'date', 'color', 'textarea'].includes(element.type) ||
            (element.type === 'radio' && element.checked)) {
            formData[element.name] = element.value;
        } else if (element.tagName === 'SELECT') {
            // 处理select元素
            if (element.multiple) {
                formData[element.name] = Array.from(element.selectedOptions).map(option => option.value);
            } else {
                formData[element.name] = element.value;
            }
        } else if (element.type === 'checkbox' && element.checked) { // 处理checkbox元素
            // 如果这个name已经存在于formData中,并且是数组,则添加值  
            // 如果不是数组(理论上不应该发生,除非外部修改了formData),则转换为数组  
            if (formData[element.name] && Array.isArray(formData[element.name])) {
                formData[element.name].push(element.value);
            } else {
                formData[element.name] = [element.value];
            }
        }

        // 对于其他未特别处理的类型,这里可以根据需要进行扩展  
    });

    return formData;
}       

注册表单示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册表单</title>
    <style>
        .form-control {
            margin-bottom: 15px;
        }

        .form-control label {
            display: block;
            margin-bottom: 5px;
        }

        .form-control input,
        .form-control textarea,
        .form-control select {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
        }

        .form-control.inline label,
        .form-control.inline input {
            display: inline-block;
            width: auto;
        }
    </style>
</head>

<body>

    <h2>注册表单</h2>

    <form id="registrationForm">
        <div class="form-control">
            <label for="username">用户名:</label>
            <input type="text" id="username" name="username" minlength="5" maxlength="20"
                pattern="[A-Za-z0-9]+" placeholder="请输入5到20位字母数字组合">
        </div>

        <div class="form-control">
            <label for="email">电子邮件:</label>
            <input type="email" id="email" name="email" placeholder="请输入有效的电子邮件地址">
        </div>

        <div class="form-control">
            <label for="password">密码:</label>
            <input type="password" id="password" name="password" minlength="8" placeholder="请输入至少8个字符的密码">
        </div>

        <div class="form-control">
            <label for="confirmPassword">确认密码:</label>
            <input type="password" id="confirmPassword" name="confirmPassword" placeholder="请再次输入密码以确认">
        </div>

        <div class="form-control inline">
            <label>性别:</label>  
            <input type="radio" id="male" name="gender" value="male">  
            <label for="male"></label>  
            <input type="radio" id="female" name="gender" value="female">  
            <label for="female"></label>
        </div>

        <div class="form-control">
            <label for="birthday">生日:</label>
            <input type="date" id="birthday" name="birthday" placeholder="请选择出生日期">
        </div>

        <div class="form-control">
            <label for="country">国家:</label>
            <select id="country" name="country">
                <option value="">请选择国家</option>
                <option value="china">中国</option>
                <option value="usa">美国</option>
                <!-- 添加更多国家选项 -->
            </select>
        </div>

        <div class="form-control inline">
            <label for="color">最喜欢的颜色:</label>
            <input type="color" id="color" name="color" placeholder="请选择喜欢的颜色" style="width: 200px; height: 50px">
        </div>

        <div class="form-control inline">
            <label>喜欢的水果:</label><br>  
            <input type="checkbox" id="apple" name="fruits" value="apple">  
            <label for="apple">苹果</label>  
            <input type="checkbox" id="banana" name="fruits" value="banana">  
            <label for="banana">香蕉</label>  
            <input type="checkbox" id="orange" name="fruits" value="orange">  
            <label for="orange">橙子</label>
        </div>

        <div class="form-control">
            <label for="desc">自我介绍:</label>
            <textarea name="desc" id="desc" cols="30" rows="5" maxlength="100" placeholder="请输入自我介绍(最多100个字符)"></textarea>
        </div>

        <button type="submit">注册</button>
    </form>

    <script>
        function collectFormData(form) {
            // 代码同上
        }
        let regFormEl = document.getElementById('registrationForm')
        regFormEl.addEventListener('submit', function (event) {
            // 阻止表单的默认提交行为  
            event.preventDefault();
            const form = document.forms.registrationForm
            const formData = collectFormData(form)
            console.log(formData)

            // 在这里添加自定义验证逻辑  
            // ...  

            // 如果验证通过,可以使用AJAX提交表单,或者移除阻止并提交表单 
        });  
    </script>
</body>
</html>

image.png

希望能够勾起你往日的回忆,下期再见!

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

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

相关文章

论文分享|MLLMs中多种模态(图像/视频/音频/语音)的tokenizer梳理

本文旨在对任意模态输入-任意模态输出 (X2X) 的LLM的编解码方式进行简单梳理&#xff0c;同时总结一些代表性工作。 注&#xff1a;图像代表Image&#xff0c;视频代表Video&#xff08;不含声音&#xff09;&#xff0c;音频代表 Audio/Music&#xff0c;语音代表Speech 各种…

docker数据卷和资源控制

目录 数据卷 实现数据卷 宿主机和容器之间进行数据共享 容器与容器之间进行数据共享 容器互联 docker容器的资源控制 cpu 1.设置cpu资源控制&#xff08;比重&#xff09; 2. 设置cpu的资源占用比&#xff08;权重&#xff09; 3.设置容器绑定cpu 内存 1.内存限制 …

Docker搭建Minio容器

Docker搭建Minio容器 前言 在上一集我们介绍了分布式文件存储行业解决方案以及技术选型。最终我们决定选用Minio作为分布式文件存储。 那么这集我们就在Docker上搭建Minio容器即可。 Docker搭建Minio容器步骤 创建Minio文件目录 我们选择创建/minio/data目录 修改目录权…

系统编程 day11 进程(线程)3

fork函数的总结&#xff1a; 总结对进程学习之中的回收函数wait wait函数&#xff1a; 1.获取子进程的退出状态 2.回收资源------会让僵尸态的子进程销毁 注&#xff1a;1.wait函数本身是一个阻塞操作&#xff0c;会使调用者阻塞 2.父进程要获得子进程的退出状态 子进程&…

解决STM32G474单片机_HAL_UART_Transmit_IT()连续发送之问题

在使用STM32G474单片机的HAL库时&#xff0c;使用“在中断服务程序中发送数据”和“在中断程序中接收数据”&#xff0c;是一种很常用的方法&#xff0c;特别是RS485通讯中。首次使用&#xff0c;肯定会踩坑。要么出现第一个数据收不到&#xff0c;要么出现连续发送&#xff0c…

米联客-FPGA程序设计Verilog语法入门篇连载-02 Verilog语法_基本设计方法

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本节主要讲解Verilog的基本设…

【屏驱MCU】增加自定义分区指南

说明&#xff1a;本文主要给出基于该款 点屏 MCU。增加自定义分区指南 屏驱MCU系列文章 【屏显MCU】多媒体接口总结&#xff08;一&#xff09; 【DVP接口】0v5640的DVP接口设计分析&#xff08;硬件&#xff09; 【DVP接口】0v5640的DVP接口设计分析&#xff08;软件&#xff…

CCF-GESP8级考试—图论算法及综合应用(最小生成树)

&#x1f349;1 最小生成树的概念 1.1 连通图 &#x1f388; 连通图用于描述图中顶点之间是否存在路径相连。一个无向图中&#xff0c;如果从图中的任意一个顶点出发&#xff0c;都可以通过边的连接到达图中的任意其他顶点&#xff0c;则该图被称为连通图。 连通图的性质&…

为何众多卖家都选择入驻亚马逊VC?有什么优势?——WAYLI威利跨境助力商家

众多卖家选择入驻亚马逊VC&#xff08;Vendor Central&#xff09;&#xff0c;主要是因为VC平台为卖家提供了一系列显著的优势。VC使卖家与亚马逊建立直接供应关系&#xff0c;提升曝光率和销售机会。作为全球领先电商平台&#xff0c;亚马逊拥有庞大用户群和完善物流体系&…

C#窗体自定义快捷操作键的实现 - 开源研究系列文章

这次想到应用程序的窗体的快捷操作键的使用的问题。 上次发布过一个快捷键的例子(https://www.cnblogs.com/lzhdim/p/18342051)&#xff0c;区别在于它是操作系统全局注册的热键&#xff0c;如果其它应用程序注册了对应的热键&#xff0c;那就会失效。此例子是对某个窗体里的按…

AI驱动人才社区革新:智能化探索与实践

一、引言&#xff1a;AI赋能人才新生态 在21世纪的数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术以其强大的数据处理能力、学习优化算法及创新应用模式&#xff0c;正深刻地改变着各行各业的面貌&#xff0c;人才管理领域亦不例外。传统的人才社区&#xf…

yolo中的iou是什么意思

在YOLO&#xff08;You Only Look Once&#xff09;算法中&#xff0c;IoU 是“Intersection over Union”的缩写&#xff0c;中文可以理解为“交并比”。IoU 是一个用于衡量两个边界框&#xff08;bounding box&#xff09;重叠程度的指标。具体来说&#xff0c;IoU 是通过计算…

CUDA-MODE 第二课: PMPP 书的第1-3章

我的课程笔记&#xff0c;欢迎关注&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode 第二课: PMPP 书的第1-3章 这节课非常基础&#xff0c;讲的都是基本概念和初级的注意事项&#xff0c;有CUDA基础的朋友可以不用花时间看。 PMPP …

C#语言基础速成Day06

“心之官则思&#xff0c;思则得之&#xff0c;不思则不得也。” 目录 前言文章有误敬请斧正 不胜感恩&#xff01;||Day06 一、C#属性访问器、方法参数属性访问器&#xff08;Property Accessors&#xff09;方法参数&#xff08;Method Parameters&#xff09;综合示例 二、C…

小红书种草推广丨爆品层出不穷,品牌还能怎么「造新」?

当品牌已经被大众熟知&#xff0c;要如何在茫茫消费市场中脱颖而出&#xff0c;再度吸引用户的目光&#xff1f; 当品牌陷入增长困境&#xff0c;要如何再造爆品&#xff0c;打造增长的第二曲线&#xff0c;延长品牌的生命周期&#xff1f; …… 就这个大家关心的这些问题&…

三菱定位控制(一)

下面小编开始开始总结学习定位控制&#xff0c;以Q系列三菱PLC来展开学习&#xff0c;希望对读者或者小白有所帮助&#xff01;&#xff01;&#xff01; 一 三菱PLC定位模块 为什么需要学习定位模块&#xff08;三菱FXCPU能实现一个伺服电机的控制&#xff0c;多个要买定位模…

结构化输出及其使用方法

在 LLM 应用程序中构建稳健性和确定性 图片来自作者 欢迎来到雲闪世界。OpenAI最近宣布其最新的gpt-4o-2024–08–06模型支持结构化输出。与大型语言模型 (LLM) 相关的结构化输出并不是什么新鲜事——开发人员要么使用各种快速工程技术&#xff0c;要么使用第三方工具。 在本文…

异质性空间自回归模型 (HSAR)及 Stata 具体操作步骤

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 七、代码运行结果 一、引言 在空间计量经济学中&#xff0c;异质性空间自回归模型&#xff08;Heterogeneous Spatial Autoregressive Model&#xff0c;HSAR&#xff09;是一种…

深度优化Nginx负载均衡策略,携手Keepalived打造高可用服务架构新纪元

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

什么是数据仓库ODS层?为什么需要ODS层?

在大数据时代&#xff0c;数据仓库的重要性不言而喻。它不仅是企业数据存储与管理的核心&#xff0c;更是数据分析与决策支持的重要基础。而在数据仓库的各个层次中&#xff0c;ODS层&#xff08;Operational Data Store&#xff0c;操作型数据存储&#xff09;作为关键一环&am…