JavaScript 表单剧本——“表单序列化”的注重要点

浏览器如何将数据发送给服务器:

  1. 对表单字段的称号和值举行URL编码,运用和号(&)分开

  2. 不发送禁用的表单字段

  3. 只发送勾选的复选框和单选按钮

  4. 不发送type为“reset”和“button”的按钮

  5. 多选框中每一个选中的值零丁一个条目

  6. 在单击提交按钮提交表单的情况下,也会发送提交按钮。不然不发送提交按钮。也包含type为“image”的input元素

  7. select元素的值,就是选中的option元素的value特征值

完成表单序列化的代码:

function serialize(form) {
    var parts = [],
        field = null,
        i,
        len,
        j,
        optLen,
        option,
        optValue;

    for (var i = 0, len = form.elements.length; i < len; i++) {
        field = form.elements[i];

        switch (field.type) {
            case "select-one":
            case "select-multiple":

            if (field.name.length) {
                for (var j = 0, optLen = field.options.length; j < optLen; j++) {
                    option = field.options[j];
                    if (option.selected) {
                        optValue = "";
                        if (option.hasAttributes) {
                            optValue = ((option.hasAttributes("value")) ? option.value : option.text);
                        } else {
                            optValue = (option.attributes("value").specified ? option.value : option.text);
                        }
                        parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(optValue));
                    }
                }
            }
            break;

            case undefined:
            case "file":
            case "submit":
            case "reset":
            case "button":
                break;

            case "radio":
            case "checkbox":
                if (!field.checked) {
                    break;
                }
            //这里没有break
            default:
                if (field.name.length) {
                    parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value));
                }
        }
    };
    return parts.join("&");
}

这个函数起首定义了一个名为parts的数组,用于保留要建立的字符串的各个部份;

然后经由过程for轮回迭代每一个表单字段,并将其保留在field变量中;

用switch语句检测type属性;

最贫苦的就是select元素,由于他有单选和多选之分,还要搜检是不是存在value值,假如不存在就获取其text值,在DOM兼容的浏览器中须要运用hasAttribute()要领,在IE中则须要运用specified属性;

关于fieldset元素,没有type属性就不须要序列化;

其他诸如按钮文件输入字段等等都要疏忽;

末了关于单选按钮和复选框,要搜检其checked属性是不是为false,假如是则退出switch语句;假如为true,则继承实行default语句(所以checkbox的break行代码背面没有break,而是default);

default语句则是将当前字段的称号和值举行编码并添加到parts数组中;

末了就是应用join()函数格式化全部字符。

    原文作者:JS菌
    原文地址: https://segmentfault.com/a/1190000004367706
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞