IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> js实现FormData -> 正文阅读

[游戏开发]js实现FormData

Demo

class myFormData {
    static inputsData = null
    static transform(inputs) {
        inputs.forEach(v => {
            if (Array.isArray(v)) {
                myFormData.transform(v)
            } else {
                if (v.nodeName === 'INPUT') {
                    switch (v.attributes.type.nodeValue) {
                        case 'email':
                        case 'date':
                        case 'datetime':
                        case 'datetime-local':
                        case 'text':
                        case 'password':
                        case 'color':
                        case 'hidden':
                        case 'month':
                        case 'number':
                        case 'range':
                        case 'search':
                        case 'tel':
                        case 'time':
                        case 'url':
                        case 'week':
                            myFormData.inputsData.push([v.attributes.name.nodeValue, v.value]);
                            break
                        case 'checkbox':
                        case 'radio':
                            if (v.checked === true || v.attributes.checked) {
                                myFormData.inputsData.push([v.attributes.name.nodeValue, v.value])
                            }
                            break
                        case 'file':
                            myFormData.inputsData.push([v.attributes.name.nodeValue, v.files[0]])
                    }
                } else if (v.nodeName === 'SELECT') {
                   let option = [...v.children].find(v => v.selected === true)
                   myFormData.inputsData.push([v.attributes.name.nodeValue, option.value])
                }
            }
        })
    }
    static searchDOM(el) {
        const inputs = []
        const elChild = el.children;

        [...elChild].forEach(v => {
            if ((v.nodeName === 'INPUT' && v.attributes.type.nodeValue !== 'submit') || (v.nodeName === 'SELECT')) {
                inputs.push(v)
            }
            else if (v.children.length !== 0) {
                inputs.push(myFormData.searchDOM(v))
            }
        });

        return inputs
    }
    constructor(el) {
        this.el = el;
        myFormData.inputsData = []

        myFormData.transform(myFormData.searchDOM(el))
    }
    has(key) {
        let firstIndex = myFormData.inputsData.findIndex((v) => {
            return v[0] === key
        })
        return firstIndex === -1 ? false : true
    }
    delete(key) {
        if (!this.has(key)) {
            return null
        }
        for (let i = 0; i < myFormData.inputsData.length; i++) {
            if (myFormData.inputsData[i][0] === key) {
                myFormData.inputsData[i] = null
            }
        }
        myFormData.inputsData = myFormData.inputsData.filter(v => v !== null)
    }
    get(key) {
        if (!this.has(key)) {
            return null
        }
        let first = myFormData.inputsData.find((v) => {
            return v[0] === key
        })
        return first[1]
    }
    getAll(key) {
        let tmpArr = []
        let filterData = myFormData.inputsData.filter((v) => {
            return v[0] === key
        })
        filterData.forEach(v => {
            tmpArr.push(v[1])
        })
        return tmpArr.length > 0 ? tmpArr : null
    }
    set(key, value) {
        myFormData.inputsData = new Map(myFormData.inputsData)
        myFormData.inputsData.set(key, value)
        myFormData.inputsData = Array.from(myFormData.inputsData)
    }
    append(key, value) {
        if (!key) {
            throw new Error('key undefined')
        }
        if (!value) {
            throw new Error('value not null')
        }
        myFormData.inputsData.push([key, value])
    }
    forEach(callback) {
        let inputsData = myFormData.inputsData
        let length = inputsData.length
        for (let i = 0; i < length; i++) {
            callback(inputsData[i][1], inputsData[i][0], this)
        }
    }
    *keys() {
        let inputsData = myFormData.inputsData
        let length = inputsData.length
        for (let i = 0; i < length; i++) {
            yield inputsData[i][0]
        }
    }
    *values() {
        let inputsData = myFormData.inputsData
        let length = inputsData.length
        for (let i = 0; i < length; i++) {
            yield inputsData[i][1]
        }
    }
    *entries() {
        let inputsData = myFormData.inputsData
        let length = inputsData.length
        for (let i = 0; i < length; i++) {
            yield inputsData[i]
        }
    }
    [Symbol.iterator]() {
        let index = 0
        let data = myFormData.inputsData
        let length = data.length

        return {
            next() {
                if (index < length) {
                    return { value: data[index++], done: false }
                } else {
                    return { done: true }
                }
            }
        }
    }
}

export default myFormData

Test

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test MyFormData</title>
</head>
<body>
    <form id="myForm">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="color" name="colors">
        <input type="date" name="data">
        <input type="file" name="file">
        <button type="button" id="submit">Submit</button>
        <input type="month" name="month">
        <input type="number" name="number">
        <input type="range" name="range">
        <input type="time" name="time">
        <input type="tel" name="tel">
        <input type="url" name="url">
        <input type="week" name="week">
        <input type="datetime" name="datetime">
        <input type="datetime-local" name="datetime-local">
        <select name="city">
            <option value="0">0</option>
            <option value="1">1</option>
            <option value="2">2</option>
        </select>
        <input type="search" name="search">
        <input type="hidden" name="hiddens">
    </form>
    <script type="module">
        import myFormData from './myFormData.js'

        function query(el) {
            return document.querySelector(el)
        }
        query('#submit').addEventListener('click', function(e) {
            e.preventDefault()
            // 原生 formData
            // let myForm = new FormData(query('#myForm'))

            // for (let n of myForm) {
            //     console.log(n);
            // }
            // 自制 formData
            let myForm = new myFormData(query('#myForm'))
            myForm.append('abc', 123)
            myForm.delete('username')
            for (let n of myForm) {
                console.log(n);
            } 
        })
    </script>
</body>
</html>
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:46:08  更:2022-04-24 09:46:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:38:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码