表单序列化javascript(无框架)

IT技术 javascript forms serialization
2021-01-30 14:22:56

想知道 javascript 中是否有没有 jquery 或任何框架的函数可以让我序列化表单并访问序列化版本?

6个回答

这是纯 JavaScript 方法:

var form = document.querySelector('form');
var data = new FormData(form);
var req = new XMLHttpRequest();
req.send(data);

虽然它似乎只适用于 POST 请求。

https://developer.mozilla.org/en-US/docs/Web/API/FormData

我认为你是对的,它只适用于 POST 请求。从文档中并没有立即清楚这一点。
2021-03-18 14:22:56
仍然可以通过 GET 方法提交 frm。
2021-03-19 14:22:56
请注意,您可能必须在使用req.open("POST", "<your-url>");之前使用req.send(data);否则我InvalidStateError: XMLHttpRequest state must be OPENED.在 Firefox 66 上出现错误。它也应该适用于其他请求,例如 PUT 是您将 POST 替换为 PUT。
2021-03-28 14:22:56
请注意,这会发送 multipart,它在一些简单的 REST 服务(即feathers-mongoDB)上效果不佳
2021-03-29 14:22:56
想一想:如何使用“GET”方法发送 FormData 对象?是的,FormData 仅适用于“POST”。
2021-04-04 14:22:56

仅适用于现代浏览器

如果您的目标浏览器支持URLSearchParamsAPI(最新浏览器)和FormData(formElement)构造函数(最新浏览器),请使用:

new URLSearchParams(new FormData(formElement)).toString()

除了 IE 之外的所有地方

对于支持URLSearchParams但不支持FormData(formElement)构造函数的浏览器,请使用此 FormData polyfill和此代码(适用于除 IE 之外的所有地方):

new URLSearchParams(Array.from(new FormData(formElement))).toString()

例子

与 IE 10 兼容

对于更旧的浏览器(例如 IE 10),请使用FormData polyfillArray.from必要时使用polyfill 和以下代码:

Array.from(
  new FormData(formElement),
  e => e.map(encodeURIComponent).join('=')
).join('&')
是否.toString()真的有必要吗?
2021-03-13 14:22:56
您遇到什么错误,它是什么版本的 Safari?也许new FormData(formElement)那里还不支持?
2021-03-18 14:22:56
@glebm 是的,Safari 不支持它,您有没有找到其他解决方案?
2021-03-23 14:22:56
如果你想要一个字符串而不是URLSearchParams,那么是的。如果将字符串插入或添加到字符串中,字符串转换也会隐式发生,在这种情况下,toString不需要显式调用。
2021-04-07 14:22:56
一衬垫并没有为我在iOS上的Safari工作作为2018年4月的
2021-04-08 14:22:56

微型from-serialize 库不依赖于框架。除此之外,您还需要自己实现序列化功能。(尽管重量为 1.2 KB,为什么不使用它呢?)

哦,现在我明白了,没有 javascript,googlecode 就无法工作。它只是吐That's an error
2021-03-18 14:22:56
这是完美的。但是不得不case 'email':在代码的输入部分添加一个
2021-03-19 14:22:56
请包含一些代码,而不仅仅是指向库的链接。如果库是开源的,您应该能够复制相关代码。
2021-03-21 14:22:56
function serialize (form) {
    if (!form || form.nodeName !== "FORM") {
            return;
    }
    var i, j, q = [];
    for (i = form.elements.length - 1; i >= 0; i = i - 1) {
        if (form.elements[i].name === "") {
            continue;
        }
        switch (form.elements[i].nodeName) {
            case 'INPUT':
                switch (form.elements[i].type) {
                    case 'text':
                    case 'tel':
                    case 'email':
                    case 'hidden':
                    case 'password':
                    case 'button':
                    case 'reset':
                    case 'submit':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                    case 'checkbox':
                    case 'radio':
                        if (form.elements[i].checked) {
                                q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        }                                               
                        break;
                }
                break;
                case 'file':
                break; 
            case 'TEXTAREA':
                    q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                    break;
            case 'SELECT':
                switch (form.elements[i].type) {
                    case 'select-one':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                    case 'select-multiple':
                        for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {
                            if (form.elements[i].options[j].selected) {
                                    q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value));
                            }
                        }
                        break;
                }
                break;
            case 'BUTTON':
                switch (form.elements[i].type) {
                    case 'reset':
                    case 'submit':
                    case 'button':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                }
                break;
            }
        }
    return q.join("&");
}

来源:http : //code.google.com/p/form-serialize/source/browse/trunk/serialize-0.1.js

不要序列化输入类型的电子邮件。
2021-03-12 14:22:56
该序列化似乎与标准形式序列化不兼容,其中空格由“+”表示。上面只使用了encodeURIComponent,它将空间编码为“%20”。如果需要一致性,可以在传输前使用正则表达式将“%20”转换为“+”。
2021-03-16 14:22:56
我在gist.github.com/brettz9/7147458 中添加了这样的修改版本(还有一些其他改进)
2021-03-24 14:22:56
不一定要提交提交按钮,永远不应该提交重置按钮,并且只有在它们用于提交并在这种情况下被视为提交按钮的按钮。请参阅HTML5 4.10.22 表单提交
2021-03-26 14:22:56

这是 TibTibs 的一个稍微修改过的版本:

function serialize(form) {
    var field, s = [];
    if (typeof form == 'object' && form.nodeName == "FORM") {
        var len = form.elements.length;
        for (i=0; i<len; i++) {
            field = form.elements[i];
            if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') {
                if (field.type == 'select-multiple') {
                    for (j=form.elements[i].options.length-1; j>=0; j--) {
                        if(field.options[j].selected)
                            s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.options[j].value);
                    }
                } else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) {
                    s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value);
                }
            }
        }
    }
    return s.join('&').replace(/%20/g, '+');
}

禁用的字段被丢弃,名称也被 URL 编码。在返回字符串之前,%20 个字符的正则表达式替换只发生一次。

查询字符串的形式与 jQuery 的 $.serialize() 方法的结果相同。

你可以添加form.nodeName.toLowerCase() == "form"而不是form.nodeName == "FORM"
2021-03-17 14:22:56
+1 表示花时间改进代码。当人们发现我的缺点时,我很享受,因为这是一个很好的学习机会。+1 也让它看起来不错。-1 因为我不能给 +2 =(
2021-04-05 14:22:56