使用原生javascript实现ajax提交form表单

使用原生javascript实现ajax提交form表单

============================

1 准备表单
       首先我们需要编写一个html代码,这里我是采用nodejs里面的jade模板引擎来进行生成html代码的。

form(action="/ajaxTest2",method="post",enctype="text/plain",onsubmit="ajaxSubmit(this);return false;")
		label username:
		input(id="username",type="text",name="username")
		br
		br
		label password:
        input(id="password",type="password",name="password")
        br
        br
        select(id="city",name="city")
            option(value=1) 北京
            option(value=2) 上海
        br
        br
        input(type="submit",value="测试ajax")

2 编写js代码
       利用ajax自定义form提交的数据,做的事情,不如form提交简单。但是自定义form提交又比较灵活,可以做添加一些自己想要的功能。既然要自定义ajax的表单提交功能,我们就需要了解form提交的四种类型。

  • 1 method=“get”
    此格式要求的数据类型如下图所示

    每条数据以一个换行符做分隔"\r\n",nodejs获取方法
    req.query.*
  • 2 method=“post”,enctype=“text/plain”
    此格式要求的数据类型如下图所示
    这里写图片描述
    与get方式相似.nodejs获取方法
    req.on(“data”,function(data){})
  • 3 method=“post”,enctype=“application/x-www-form-urlencoded”
    此格式要求的数据类型如下图所示
    这里写图片描述
    每条数据以&作为分隔符,jQuery.ajax();传递的数据就是这种类型
    nodejs获取方法
    req.body.username
  • 4 method=“post”,enctype=“multipart/form-data”
    此格式要求的数据类型如下图所示使用原生javascript实现ajax提交form表单_第1张图片
    input的name单独一行,然后空两行,写值,然后在是下一个值对.
    nodejs获取方法
    req.on(“data”,function(data){
    });
    了解了过程,以下便是实现代码
'use strict';

if (!XMLHttpRequest.prototype.sendAsBinary) {
    XMLHttpRequest.prototype.sendAsBinary = function(sData) {
        var nBytes = sData.length, ui8Data = new Uint8Array(nBytes);
        for (var nIdx = 0; nIdx < nBytes; nIdx++) {
            ui8Data[nIdx] = sData.charCodeAt(nIdx) & 0xff;
        }
        /* send as ArrayBufferView...: */
        this.send(ui8Data);
        /* ...or as ArrayBuffer (legacy)...: this.send(ui8Data.buffer); */
    };
}
void function(global){
    function ajaxComplete(){
        ///成功
        if(this.statusCode==200){

        }
    }
    //提交
    function ajax(myForm){
        var xhr = new XMLHttpRequest();
        xhr.addEventListener("load", ajaxComplete);
        if(myForm.technique===0){
            //如果是get方式
            xhr.open("get",myForm.action.replace(/(?:\?.*)?$/,myForm.segments.length>0?"?"+myForm.segments.join("&"):"?"),true);
            xhr.send(null);
        } else{
            xhr.open("post",myForm.action,true);
            if(myForm.technique===3){
                //如果是multipart/form-data
                var sBoundary = "---------------------------" + Date.now().toString(16);
                xhr.setRequestHeader("Content-type",sBoundary);
                xhr.sendAsBinary("--" + sBoundary + "\r\n" + myForm.segments.join("--" + sBoundary + "\r\n") + "--" + sBoundary + "--\r\n");
            }else{
                //如果是application/x-www-form-urlencoded或者text/plain
                xhr.setRequestHeader("Content-type",myForm.contentType);
                xhr.send(myForm.segments.join(myForm.technique===1?"\r\n":"&"));
            }
        }
    }
    //处理文件上传完毕时做的操作
    function processUpload(event){
        //this.owner.segments[this.segmentIdx] += oFREvt.target.result + "\r\n";
        this.owener.segments[this.segIndex] = oFREvt.target.result + "\r\n";
        this.owner.status--;
        processSubmit(this.owner);
    }
    //status为0即所有图片都已经上传完毕,执行ajax
    function processSubmit(myForm){
        if(myForm.status>0){return;}
        ajax(myForm);
    }
    //处理text/plain的编码
    function plainScape(text){
        //$&表示被替换的文本
        return text.replace(/[\s\=\\]/g,"\\$&");
    }
    //上传数据到浏览器
    // 0 get
    // 1 text/plain
    // 2 application/x-www-form-urlencoded
    // 3 multipart/form-data
    function submitData(form){
        var elements = form.elements;
        var i,j,oElement,oType,oFile,reader;
        var isPost = form.method.toLowerCase()==="post"; //若没有指定method,默认按get操作;
        this.action = form.action;
        this.contentType = isPost && form.enctype ? form.enctype : "application\/x-www-form-urlencoded";
        this.technique = isPost?this.contentType==="text/plain"?1:this.contentType==="application/x-www-form-urlencoded"?2:3:0;
        this.segments = [];
        this.status = 0;//还未上传的文件量
        var fFilter = this.technique === 1?plainScape:global.encodeURIComponent;
        for(i=0;i

你可能感兴趣的:(javascript)