zepto ajax php实例,Ajax表单异步上传文件实例代码详解

本文主要介绍了Ajax表单异步上传文件实例代码(包括文件域),非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧,希望能帮助到大家。

1.起因

做前台页面时,需要调用WebAPI的Post请求,发送一些字段和文件(相当于把表单通过ajax异步发送出去,得到返回结果),然后得到返回值判断是否成功。

2.尝试

先是尝试了一下 "jQuery Form Plugin" ,这玩意就是的巨大的坑,实现他和jquery1.9.2兼容性就不是太好,好不容易把$.browser的问题解决了,发现用他上传文件得不到返回值。$("#view").submit(

$("#view").ajaxSubmit({

type: "post",

url: "../api/Article/Add",

dataType: "json",

success: function (msg) {

console.log(msg);

},

error: function (msg) {

$("#resultBox").html("连接服务器失败");

console.log(msg);

}

})

);

比如上面的代码,不过怎么配置,只要上传了文件,success里面返回的msg一定是null(chromium浏览器下),但实际是有返回值的,而且没有文件时也是正常的。更可怕的是IE/EDGE下提示下载那个Json返回值。

翻了一下jquery.form.js的源代码,发现他是用Iframe实现的伪Ajax,不清真,Pass!// are there files to upload?

var files = $('input:file', this).fieldValue();

var found = false;

for (var j=0; j < files.length; j++)

if (files[j])

found = true;

if (options.iframe || found) // options.iframe allows user to force iframe mode

fileUpload();

else

$.ajax(options);

这是有无文件时,分别调用2个不同的函数。

3.解决方案

经过多反调查,发现xhr(XMLHttpRequest)是个好东西。经过测试主流浏览器和手机浏览器都支持这个东西。下面介绍一下在jquery/zepto的ajax 获取原生XMLHttpRequest 对象上传表单(文件)的方法。参考文章:http://www.jb51.net/article/91267.htmfunction AjaxForm(formID, options) {

var form = $(formID);

//将form对象直接作为参数 new FormData对象

var formData = new FormData(form[0]);

$("input[type='file']").forEach(function (item, i) {

//获取file对象 即相当于可以直接post的$_FILES数据

var domFile = $(item)[0].files[0];

//追加file 对象

formData.append('file', domFile);

})

if (!options)options = {};

options.url = options.url ? options.url : form.attr("action");

options.type = options.type ? options.type : form.attr("method");

options.data = formData;

options.processData = false; // tell jQuery not to process the data

options.contentType = false; // tell jQuery not to set contentType

options.xhr = options.xhr ? options.xhr : function () {

//这是关键 获取原生的xhr对象 做以前做的所有事情

var xhr = $.ajaxSettings.xhr();

xhr.upload.onload = function () {

console.log("onload");

}

xhr.upload.onprogress = function (ev) {

if (ev.lengthComputable) {

var percent = 100 * ev.loaded / ev.total;

console.log(percent, ev)

}

}

return xhr;

};

options.success = options.success ? options.success : function (data) {

alert(data)

};

$.ajax(options);

}

//调用

$("#sub").click(function (e) {

AjaxForm("#myForm");

});

相关推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值