jquery 文件上传 触发两次_ajaxFileUpload异步上传资源,onchange多次调用问题的解决方案...

一、上传文件的做法

1 前端代码

upload js方法

function upload() {

alert("haha");

$.ajaxFileUpload({

url : "xxxx",

secureuri : false,

fileElementId : 'myfiles',

dataType : 'JSON',

data: { …

},

success : function(data, status) {

},

error : function(data, status, e) {

….

}

});

return false;

};

2 界面

6e7053e07e31529ab40e67901c786ef1.png

3 执行结果

我们发现确实弹框了,但是弹了不只一次,这是什么原因呢?

63a521882af8bb257d5b60d264b58280.png

4 通过查看ajaxFileUpload源码,其做法个人总结如下。

i 创建一个from表单,表单的action是我们一开始调用ajaxFileUpload方法是传入的参数url

ii 通过jquery的clone方法,将原来的各种input复制到步骤1 创建的form表单下。

iii 将form表单append到一个iframe下

iv 通过form表单提交数据,发送同步请求去上传资源,但创建的iframe和我们的页面不在同一个层级,所以刷新了之后对我们的页面是不影响的。

我使用的Chrome的版本如下

2a3aef8bcd57433fd22561460b66badc.png

经过调试发现,出现这种弹框多次的原因是由于ajaxFileUpload插件的fileElementId造成的。

来看下源码

AjaxFileUpload.js

1d369d921588e058b7c22122cbd14ddf.png

101cccf1fe90a7c99a6bff7a5e1b1777.png

此时会调用到JQuery的clone方法,

45ebcb33738fef5b3497212f30361d9c.png

因此初步确定了是因为clone方法在复制节点的时候调用到了复制的input中的onchange方法或者是复制过来后副本的onchange方法。

在用低版本的Chrome测试了下,发现在clone方法,不会调用到onchange方法,版本如下

5c9dcf444159e5c24e9641c108866825.png

最后,总结以下出现上传文件多次弹框的原因是:Chrome的版本升级后,对jquery的clone方法的解析执行跟以前不一样。

5 解决方案

记录之前的路径,然后每次获取当前路径先跟之前的做对比,不相等才发请求

var prePath = $('#myfiles').val();

function upload() {

var curPath = $('#myfiles').val();

if (prePath == curPath) {

return false;

}

prePath = curPath;

$.ajaxFileUpload({

url : "xxxx", //submit to UploadFileServlet

secureuri : false,

fileElementId : 'myfiles',

dataType : 'JSON',

data: {

},

success : function(data, status) {

},

error : function(data, status, e) {

}

});

return false;

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值