关于ajaxFileUpload造成 input[type=file] change事件只能触发一次的问题

现在发现的问题

通过js绑定的input[type=file] change事件只能触发一次

原因

该问题并不是由change事件失效造成的,而是ajaxFileUpload插件造成的,它会把原来的file元素替换成新的file元素,所以之前绑定的change事件就失效了,需要重新绑定一下

除了重新绑定以外,如果是使用$fileInput.trigger('click') 方式,失效原因是$fileInput仍指向旧元素,替代方案分为以下两步

  1. 首先将ajaxFileUpload源码中$(oldElement).clone()(有些版本中为jQuery(oldElement).clone())改为$(oldElement).clone(true) 这样可以在复制元素的同时复制事件
  2. $fileInput.trigger('click') 改为 $('#id').trigger('click')对保证新元素进行trigger而不是旧元素

如果你想要知道具体原因,请往下看

/**
 * ajaxFileUpload源码
 */
 // 原input[type=file] 
 var oldElement = $('#' + fileElementId);
 // clone一份新元素 此处需要添加true为参数 即上文第一步所提到的 复制元素的同时复制事件
 var newElement = $(oldElement).clone(true);
 // 修改旧元素的id
 $(oldElement).attr('id', fileId);
 // 将新元素放在旧元素的位置
 $(oldElement).before(newElement);
 // 将旧元素移动到目标表单
 $(oldElement).appendTo(form);
 // 设置表单样式
 $(form).css('position', 'absolute');
 $(form).css('top', '-1200px');
 $(form).css('left', '-1200px');
 $(form).appendTo('body');

所以提交完后 原来上传的位置实际已经被newElement替代 但是如果在上传之前就指定了变量指向原input[type=file] ,那么上传之后将依旧指向oldElement(其实已经在表单里),此时trigger会生效,但是该元素实际已经被ajaxFileUpload所删除 ,只存在于内存中,change事件似乎不会生效了(此处原因不详,如果知晓请告诉我)

解决方案

1.(治标)将change事件写为内联onchange="func()"形式

2.(治标)将change事件重新绑定

3.(推荐 治本)将ajaxFileUpload内$(oldElement).clone()添加true为参数后 将$fileInput.trigger('click') 改为 $('#id').trigger('click')


如果我的文章有帮上什么忙并且您也愿意赏个脸 就扫码领个红包吧(~ ̄▽ ̄)~

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ajaxfileupload.js可以兼容IE8以下版本实现无刷新的Form提交,上传文件。 这个版本修改了提交后台失败的几个bug 使用是需注意以下几点: 1.调用createUploadForm,此方法中增加了change参数,此参数用户给新生成的input-file元素绑定change事件,如果不需要可以不加此参数。 2.要上传的input-file元素,建议放id和name属性,而且这两个属性值要保持一致 3.后台代码中,response里的contenttype要设置为"text/html",前台的success回调中对返回值作处理 例子如下: js: $.ajaxFileUpload({ url: url, type: 'post', data: data, secureuri: false, fileElementId: fileId, // input-file的id、name属性名 dataType: 'JSON', beforeSend: function (XMLHttpRequest) { //show loading... }, success: function (data, status) { data = jQuery.parseJSON(data); success(data); }, error: function (data, status, e) { error(e); }, complete: function (XMLHttpRequest, textStatus) { //hide loading... }, change: change //需要绑定到动态生成的input-file元素上的change事件处理方法;没有的话,这个参数可以不写 }); 如果加了changechange方法中需要处理一下,因为发现会被调2次 function Upload(event) { var fileid = $(event.target).attr('id'); if(isNullOrEmpty(fileid) || /^jUploadFile\d+$/.test(fileid))return; //注意:此处过滤无效调用 //... } 后台代码(ashx): public void ProcessRequest(HttpContext context) { try { context.Response.ContentType = "text/html"; var request = context.Request; var param1 = request.Params["param1"]; //取参数 //取上传文件 if (request.Files == null || request.Files.Count <= 0) throw new ApplicationException("no file to be uploaded!"); var file = request.Files[0]; var filename = System.IO.Path.GetFileName(file.FileName); var serverpath = Path.Combine(context.Server.MapPath(ROOT), filename); file.SaveAs(serverpath); //自定义返回Json字符串 var json = '{' + string.Format(json, id, finfo.Name, extension, path) + '}'; response.Write(json); return; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值