INPUT[type=file]的change事件不触发问题

在网页上要操作文件通常会使用INPUT[type=file]控件,但这个控件的设计很蛋疼。它不像其它编程语言中文件选择后会触发一个事件,只是让上面的文字改变,而这个改变可能会触发change事件而已。对于文字没改变的选择,change事件则不会触发。
  当INPUT[type=file]控件上已经选择过一次文件之后,再次点击它选择同一个文件时change事件就不会触发。因为第二次选择后里面的文字和第一次是一样的,没有改变。还有个更蛋疼情况是有些浏览器会自动记住控件上的文字,即使页面关闭后重新打开还是会恢复到原来的文字。这时候选择同路径的文件也不会触发change事件。
  这些问题都是INPUT[type=file]控件蛋疼的设计所引起的,从一般渠道无法解决这个问题。有人建议在点击INPUT[type=file]控件时先清空其文字,这样在选中文件之后自然可以触发change事件。但一些浏览器上对INPUT[type=file]控件的值是只读的,要清空恐怕不容易。但从这里我们可以推广出另一种偷天换日的解决方案。既然值无法写入,为何我们不创建一个新的INPUT[type=file]把旧的替换掉呢?这么一来,需要解决的问题就剩下事件绑定了。这可以通过在容器上绑定事件,之后通过冒泡的方式来获取,而不把事件绑定到目标元素上的方法来解决。下面就是一个不太漂亮的解决办法(由于一些兼容代码写着麻烦,这里直接用了jQuery):
运行<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script>
$(function(){
  form.reset(); //清除浏览器记录的上次记录
  var file;
  $(form).on("change","#file",function(e){
    //输出选中结果
    console.log(this.value);
    //每次选中都保存旧元素,并使用新的控件替换
    $(this).clone().replaceAll(file=this);
  }).submit(function(){
    //提交时把之前保存的旧元素替换回去
    $("#file").replaceWith(file);
  });
});
</script>
<form id="form">
  <input type="file" name="file" id="file"><br/>
  <input type="submit" />
</form>

INPUT[type=file]的change事件不触发问题

时间: 2024-10-31 20:12:17

INPUT[type=file]的change事件不触发问题的相关文章

手机QQ浏览器和微信内置webview对input type="file" 的change事件不灵

做一个H5页面,选中图片后上传,遇到手机QQ浏览器时   不能及时识别change事件,真是日了狗了,下面是针对这一现象的解决办法,不用change事件: <!DOCTYPE> <html>     <head>         <title></title>         <meta charset="utf-8"/>         <meta Content-Type="applicatio

html的input[type=&quot;file&quot;]的change方法只起一次作用的解决办法

上传文件的js通常写法: document.getElementById('#upload').onchange = function () { // do something }; 这样会产生一个问题:选择一个文件之后,再次选择一个文件将不会触发onchange事件(即使是不同的文件也不会). 解决方法:使用jQuery的live方法 $('#upload').live('change', function () { // do something });

自定义input[type=&quot;file&quot;]的样式

input[type="file"]的样式在各个浏览器中的表现不尽相同: 1. chrome: 2. firefox: 3. opera: 4. ie: 5. edge: 另外,当我们规定 input[type="file"] 的高度,并把它的行高设置成与其高度相等后,chrome中难看的样式出现了: “未选择任何文件”这一行并没有竖直居中. 似乎在 firefox 中好看一些,嗯,我比较喜欢用 firefox.但是这些浏览器中的表现不一致,我们必须做兼容处理. 思

以input=file方式,获取文件时,在IE下8无法通过某个按钮click事件间接触发input=file的change事件

最近在项目中遇到了许多上传问题,公司内部的组件,通过form上传,需要使用input=file触发选择文件, 因为input=file在各个浏览器中显示的样式是不同的,谷歌,火狐,IE都有所不同,而且不太美观,所以为了解决 这一个问题,一开始采用了隐藏input=file 然后通过一个显示的button间接触发input=file的click事件如下 <input type="file" id="upload" style="display:none

&lt;input type=&quot;file&quot;&gt; change事件异常处理办法

问题:最近发现一个奇怪的bug, 那就是在上传图片需要采用input type=file来进行文件选择.由于为了适应美工的UI图,所以是把选择文件的input框隐藏了.然后通过另外一个按钮的点击事件来触发input的选择事件.代码如下: <div style="width:120px;height:120px"> <img src="/image/uploadfile.png" style="width:100%;height:100%&

谷歌游览器对&lt;input type=&#39;file&#39;&gt; change只能响应1次解决和样式的改变

在项目过程中遇到的需要上传本地文件,file的原始控件不太美观,但是这个控件和button有点不太一样, 改变这个样式的思路就是在控件外面套一层链接,然后把file控件的透明度设置为0(透明).样式只需要对外面那层进行操作就行. html代码: <td style="text-align: left;"> <a href="javascript:;" class="file">选择文件 <input type=&qu

html5与js关于input[type=&#39;text&#39;]文本框value改变触发事件一些属性的区别oninput,onpropertychange,onchange和文本框的value点击全选状态onclick=&quot;select();&quot;。做购物车页面时会要用到。

关于input[type='text']文本框value改变触发事件一些属性的区别oninput,onpropertychange,onchange和文本框的点击全选状态onclick="select();".做购物车页面时会要用到. input[type='text']文本框value改变触发事件一些属性的区别oninput,onpropertychange,onchange: 1.onchange事件与onpropertychange事件的区别:onchange事件在内容改变(两次

修改input type=file 标签默认样式的简单方法

<html><head><title></title></head><body><form id="uploadForm"  action="" method="post" enctype="multipart/form-data"><input type="file" name="uploadFile&qu

将html中的&lt;input type=&quot;file&quot; /&gt;(选择文件) 元素隐藏,并通过其它方式触发点击。

file input的默认外观实在不好看,所以我们要搞定它.. 1. 首先,我们把file input放入一个label,并且将这个label显示为一定的宽高,比如显示为(bootstrap)btn的样式; 2. 为此input增加样式,内联或css文件内写都可以:style="left:-9999px;position:absolute;" 3. 在label内增加文本(作为label btn的显示文本),比如下方示例中的span; <label id="realBt