表单序列化

原生表单序列化:
  随着Ajax的出现,表单序列化已经成为一种需求,
  在学习原生Ajax时,若用POST方法向后台提交数据时,就需要将表单序列化
  在JavaScript中可以利用表单字段的type属性,连同name和value属性,
  一起实现表单的序列化。
  在进行表单序列化之前,需要弄清楚在表单提交期间,浏览器是怎样将数据发送给服务器的。
    --对表单字段的名称和值进行URL编码,使用和号(&)分隔
    --不发送禁用的表单字段
    --只发送勾选的复选框和单选按钮
    --不发送type为"reset"和"button"的按钮
    --多选选择框中的每个选中的值单独一个条目
    --在单击提交按钮提交表单的情况下,也会发送提交按钮,否则不发送提交按钮
    --<select>元素的值,就是选中的<option>元素的value特性的值。如果<option>
      元素没有value属性,则就是<option>元素的文本值

  实现表单序列化的函数为:
  function serialize(form){
    var parts=[],
        field=null,
        i,
        len,
        j,
        optLen,
        option,
        optValue;
        for (i = 0; i < form.elements.length; i++) {
          field=form.elements[i];
          switch (field.type) {
            case 'select-one':
            case 'select-multiple':
            if(field.name.length){
              for (var j = 0; j < field.options.length; j++) {
                option=field.options[j];
                if (option.selected) {
                  optValue="";
                  if (option.hasAttribute) {
                    optValue=(option.hasAttribute('value') ? option.value : option.text);
                  }else{
                    optValue=(option.attribute['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;
              }
              //执行默认操作
            default:
              //不包含没有名字的表单字段
              if(field.name.length){
                parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value));
              }
          }
        }
        return parts.join("&");
  }

 

posted @ 2017-01-01 19:12  夏至未至~  阅读(1816)  评论(0编辑  收藏  举报