【JavaScript】上传文件时监听change事件(只能被触发一次)
2017-05-11 12:52
381 查看
问题提出:做文件上传时,对input监听change时间,但是change事件只能被触发一次。
Bug产生原因:尚未查到。
解决方案:当一次上传完成后,替换原有的input并重新绑定change时间。
HTML:
<button id="uploadBtn">修改头像</button>
<input type="file" id="file" name="file" style='display: none;'>
原有JS代码:会引发只触发一次change事件。
var uploadBtn = $("#uploadBtn");
var fileBtn = $("#file");
$(uploadBtn).click(function() {
$(fileBtn).click();
});
$(fileBtn).change(function() {
var size = $(fileBtn)[0].files[0].size;
alert(size);
var type = $(fileBtn)[0].files[0].name;
console.log(type);
$.ajaxFileUpload({
url : '/Topic/imgUploadController/fileUpload',
type : 'post',
secureuri : false, //一般设置为false
fileElementId : 'file', // 上传文件的id、name属性名
dataType : 'text', //返回值类型,一般设置为json、application/json
success : function(data, status) {
var strs = data.match( /{(\S*)}/ig);
var jsonStr = JSON.parse(strs[0]);
var binatyImg = jsonStr.binaryImg;
$("#userHeaderImg").attr("src",binatyImg);
},
error : function(data, status, e) {
alert(e);
}
});
})
第一次修改:
<button id="uploadBtn">修改头像</button>
<input type="file" id="file0" name="file0" style='display: none;'>
var key = 0;
var uploadBtn = $("#uploadBtn");
$(uploadBtn).click(function() {
$("#file"+key).click();
});
$("#file"+key).change(function(){
uploadImg(key);
});
function uploadImg(key){
var size = $("#file"+key)[0].files[0].size;
alert(size);
var type = $("#file"+key)[0].files[0].name;
console.log(type);
$.ajaxFileUpload({
url : '/Topic/imgUploadController/fileUpload',
type : 'post',
secureuri : false, //一般设置为false
fileElementId : 'file'+key, // 上传文件的id、name属性名
dataType : 'text', //返回值类型,一般设置为json、application/json
success : function(data, status) {
var strs = data.match( /{(\S*)}/ig);
var jsonStr = JSON.parse(strs[0]);
var binatyImg = jsonStr.binaryImg;
$("#userHeaderImg").attr("src",binatyImg);
},
complete:function(){
var _obj = $("#file"+key);
_obj.replaceWith("<input type='file' id='file"+key+"' name='file"+key+"' style='display:none;'>");
key++;
$(uploadBtn).click(function() {
$("#file"+key).click();
});
$("#file"+key).change(function(){
uploadImg(key);
})
},
error : function(data, status, e) {
console.log(e);
}
});
}这次修改主要是想,动态修改id和name的值,通过key区分input。但是,存在bug。当id和name为“file”之外的值时,上传文件失效,莫名其妙的错误。报错如下:
TypeError: strs is null
堆栈跟踪:
success@http://localhost:8080/Topic/web/js/user.js:273:9
uploadCallback@http://localhost:8080/Topic/web/js/ajaxfileupload.js:111:29
再次修改,干脆,保持id和name值不变,源码如下:
<button id="uploadBtn">修改头像</button>
<input type="file" id="file" name="file" style='display: none;'>
var key = "";
var uploadBtn = $("#uploadBtn");
$(uploadBtn).click(function() {
$("#file"+key).click();
});
$("#file"+key).change(function(){
uploadImg(key);
});
function uploadImg(key){
var size = $("#file"+key)[0].files[0].size;
alert(size);
var type = $("#file"+key)[0].files[0].name;
console.log(type);
$.ajaxFileUpload({
url : '/Topic/imgUploadController/fileUpload',
type : 'post',
secureuri : false, //一般设置为false
fileElementId : 'file'+key, // 上传文件的id、name属性名
dataType : 'text', //返回值类型,一般设置为json、application/json
success : function(data, status) {
var strs = data.match( /{(\S*)}/ig);
var jsonStr = JSON.parse(strs[0]);
var binatyImg = jsonStr.binaryImg;
$("#userHeaderImg").attr("src",binatyImg);
},
complete:function(){
var _obj = $("#file"+key);
_obj.replaceWith("<input type='file' id='file"+key+"' name='file"+key+"' style='display:none;'>");
$(uploadBtn).click(function() {
$("#file"+key).click();
});
$("#file"+key).change(function(){
uploadImg(key);
})
},
error : function(data, status, e) {
console.log(e);
}
});
}
这次问题完美解决。
至于上面的bug有待查找原因。
Bug产生原因:尚未查到。
解决方案:当一次上传完成后,替换原有的input并重新绑定change时间。
HTML:
<button id="uploadBtn">修改头像</button>
<input type="file" id="file" name="file" style='display: none;'>
原有JS代码:会引发只触发一次change事件。
var uploadBtn = $("#uploadBtn");
var fileBtn = $("#file");
$(uploadBtn).click(function() {
$(fileBtn).click();
});
$(fileBtn).change(function() {
var size = $(fileBtn)[0].files[0].size;
alert(size);
var type = $(fileBtn)[0].files[0].name;
console.log(type);
$.ajaxFileUpload({
url : '/Topic/imgUploadController/fileUpload',
type : 'post',
secureuri : false, //一般设置为false
fileElementId : 'file', // 上传文件的id、name属性名
dataType : 'text', //返回值类型,一般设置为json、application/json
success : function(data, status) {
var strs = data.match( /{(\S*)}/ig);
var jsonStr = JSON.parse(strs[0]);
var binatyImg = jsonStr.binaryImg;
$("#userHeaderImg").attr("src",binatyImg);
},
error : function(data, status, e) {
alert(e);
}
});
})
第一次修改:
<button id="uploadBtn">修改头像</button>
<input type="file" id="file0" name="file0" style='display: none;'>
var key = 0;
var uploadBtn = $("#uploadBtn");
$(uploadBtn).click(function() {
$("#file"+key).click();
});
$("#file"+key).change(function(){
uploadImg(key);
});
function uploadImg(key){
var size = $("#file"+key)[0].files[0].size;
alert(size);
var type = $("#file"+key)[0].files[0].name;
console.log(type);
$.ajaxFileUpload({
url : '/Topic/imgUploadController/fileUpload',
type : 'post',
secureuri : false, //一般设置为false
fileElementId : 'file'+key, // 上传文件的id、name属性名
dataType : 'text', //返回值类型,一般设置为json、application/json
success : function(data, status) {
var strs = data.match( /{(\S*)}/ig);
var jsonStr = JSON.parse(strs[0]);
var binatyImg = jsonStr.binaryImg;
$("#userHeaderImg").attr("src",binatyImg);
},
complete:function(){
var _obj = $("#file"+key);
_obj.replaceWith("<input type='file' id='file"+key+"' name='file"+key+"' style='display:none;'>");
key++;
$(uploadBtn).click(function() {
$("#file"+key).click();
});
$("#file"+key).change(function(){
uploadImg(key);
})
},
error : function(data, status, e) {
console.log(e);
}
});
}这次修改主要是想,动态修改id和name的值,通过key区分input。但是,存在bug。当id和name为“file”之外的值时,上传文件失效,莫名其妙的错误。报错如下:
TypeError: strs is null
堆栈跟踪:
success@http://localhost:8080/Topic/web/js/user.js:273:9
uploadCallback@http://localhost:8080/Topic/web/js/ajaxfileupload.js:111:29
再次修改,干脆,保持id和name值不变,源码如下:
<button id="uploadBtn">修改头像</button>
<input type="file" id="file" name="file" style='display: none;'>
var key = "";
var uploadBtn = $("#uploadBtn");
$(uploadBtn).click(function() {
$("#file"+key).click();
});
$("#file"+key).change(function(){
uploadImg(key);
});
function uploadImg(key){
var size = $("#file"+key)[0].files[0].size;
alert(size);
var type = $("#file"+key)[0].files[0].name;
console.log(type);
$.ajaxFileUpload({
url : '/Topic/imgUploadController/fileUpload',
type : 'post',
secureuri : false, //一般设置为false
fileElementId : 'file'+key, // 上传文件的id、name属性名
dataType : 'text', //返回值类型,一般设置为json、application/json
success : function(data, status) {
var strs = data.match( /{(\S*)}/ig);
var jsonStr = JSON.parse(strs[0]);
var binatyImg = jsonStr.binaryImg;
$("#userHeaderImg").attr("src",binatyImg);
},
complete:function(){
var _obj = $("#file"+key);
_obj.replaceWith("<input type='file' id='file"+key+"' name='file"+key+"' style='display:none;'>");
$(uploadBtn).click(function() {
$("#file"+key).click();
});
$("#file"+key).change(function(){
uploadImg(key);
})
},
error : function(data, status, e) {
console.log(e);
}
});
}
这次问题完美解决。
至于上面的bug有待查找原因。
相关文章推荐
- ajaxFileUpload onchang上传文件插件第二次失效刷新一次才能再次调用触发change事件
- 上传文件的input框的change时间只能触发一次的原因
- 使用input file 通过ajax 上传文件中onChange事件只触发一次问题
- java socket 上传文件与对话自由选择(不过只能监听一个客户端,因为没有用while循环)
- JavaScript ~~~~~ 清空上一次上传的文件
- jQuery的ajaxFileUpload上传文件插件刷新一次才能再次调用触发change
- 上传文件或图片 type=file change事件只触发一次
- thinkphp上传文件(一次只能上传一个)
- file文件添加change事件,结合ajaxFileUpload使用文件上传只生效一次问题解决
- ajaxfileupload.js目前功能最全版本(多文件、异常处理等),顺便解决只能上传一次的BUG(非live绑定)
- jQuery的ajaxFileUpload上传文件插件刷新一次才能再次调用触发change
- jQuery的ajaxFileUpload上传文件插件刷新一次才能再次调用触发change
- 一次上传多个文件
- asp.net 中一次上传多个文件
- 上传文件大小的限制和判断(javascript)
- 一次小小的上传文件测试
- JavaScript得到上传文件的文件名
- Javascript与asp.net 实现Ajax多文件无刷新上传
- Javascript & DHTML 实例编程(教程)(三)初级实例篇1―上传文件控件实例
- Javascript & DHTML 实例编程(教程)(三)初级实例篇1―上传文件控件实例