XMLHttpRequest2级FormData类型

摘自《JavaScript高级程序设计》

并非所有浏览器都完整地实现了XMLHttpRequest2级规范,但所有浏览器都实现了它规定的部分内容 。

现代Web应用中频繁使用的一项功能就是表单数据的序列化,XMLHttpRequest2级为此定义了FormData类型。FormData为序列化表单以及创建与表单格式相同的数据(用于通过XHR传输)提供了便利。下面的代码创建了一个FormData对象,并向其中添加了一些数据。

var data = new FormData();

data.append("name", "Nicholas");

这个append()方法接收两个参数:键和值,分别对应表单字段的名字和字段中包含的值。可以像这样添加任意多个键值对儿。而通过向FormData构造函数中传入表单元素,也可以用表单元素的数据预先向其中填入键值对儿:

var data = new FormData(document.forms[0]);

创建了FormData的实例后,可以将它直接传给XHR的send()方法,如下所示:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function(){

     if(xhr.readyState == 4) {

            if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){

                    alert(xhr.responseText);

            } else {

                   alert("Request was unsuccessful:" + xhr.status);

           }

    }

};

xhr.open("post", "postexample.php", true);

var form = document.getElementById("user-info");

xhr.send(new FormData(form));

使用FormData的方便之处体现在不必明确地在XHR对象上设置请求头部。XHR对象能够识别传入的数据类型是FormData的实例,并配置适当的头部信息。

支持FormData的浏览器有Firefox4+、Safari5+、Chrome和Android3+版WebKit。

接下来是利用XMLHttpRequest上传文件实现进度条的例子:

(摘自http://www.cnblogs.com/tianyuchen/p/5594641.html和自己项目代码的结合)

<script   type="text/javascript">

//上传文件方法

function uploadFile() {

      var   fileObj = document.getElementById("file").files[0]; //js获取文件对象

      var url = "uploadFile"; //接收上传文件的后台地址

      var form = new FormData();   //创建一个FormData对象

      form.append("mf", fileObj); //向FormData对象里添加数据

      var xhr = new XMLHttpRequest();  //创建XMLHttpRequest对象

      xhr.onload =  uploadComplete; //请求完成

      xhr.onerror = uploadFailed; //请求失败

      xhr.onabort = uploadCanceled; //取消上传

      xhr.upload.onprogress =  uploadProgress; //上传进度调用方法实现

      xhr.open("post", url, true);  //post方式提交,url为服务器请求地址,true该参数规定请求是否异步处理

      xhr.send(form); //开始上传,发送form数据

}

//上传进度实现方法,上传过程中会频繁调用该方法

function uploadProgress(evt){

    var progressBar = document.getElementById("progressBar");

    var percentage = document.getElementById("percentage");

    var done = evt.position || evt.loaded;

    var total = evt.totalSize || evt.total;

    if(evt.lengthComputable){

       progressBar.max = total;

      progressBar.value = done;

      percentage.innerHTML = Math.round(done / total * 100) + "%" ; 

    } else {

       percentage.innerHTML = "unable to compute";

      }

}

//上传成功响应

function uploadComplete(evt) {

   var responseText = evt.target.responseText; //服务器接收完文件返回的响应文本

   alert("上传成功!");

}

//上传失败

function uploadFailed(evt) {

   alert("上传失败!");

}

//取消上传

function uploadCanceled(evt) {

   alert("The upload has been canceled by the user or the browser dropped the connection.");

}

</script>

<body>

     注:Internet Explorer 9 以及更早的版本不支持 progress标签

     <progress id="progressBar" value="0" max="100"  style="width:300px;"></progress>

     <span id="percentage"></span>

     <input type="file" id="file" name="myfile">

     <input type="button" onclick="uploadFile()" value="上传">

    <input type="button" onclick="uploadCanceled()" value="取消">

</body>

progress事件

onprogress事件处理程序会接收到一个event事件,其target属性是XHR对象,但包含着三个额外的属性:lengthComputable、position和totalSize。其中,lengthComputable是一个表示进度信息是否可用的布尔值,position标识已经接收的字节数,totalSize表示根据Content-Length响应头部确定的预期字节数。

注:为确保正常执行,必须在调用open()方法之前添加onprogress事件处理程序。

下篇文章将讲述跨域问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容