在网页上要操作文件通常会使用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>

最新文章

  1. 理解jQuery对象$.html
  2. Zabbix学习笔记一:基本安装与配置
  3. android布局中的divider(目前只知道TableLayout)
  4. cocos2d-x中false,setSwallowTouches,stopPropagation的区别
  5. 云服务器 ECS Linux 服务器修改时区的两种方式
  6. bnuoj 20832 Calculating Yuan Fen(暴力模拟)
  7. Android Toast简介
  8. Java File类读取文件属性
  9. Kqueue与epoll机制
  10. 腾讯地图api接收坐标提交坐标
  11. Thread.Sleep(0) vs Sleep(1) vs Thread.Yeild()
  12. flex属性值----弹性盒子布局
  13. STM32CubeMX GPIO的使用
  14. Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer
  15. windows下django1.7 +python3.4.2搭建记录1
  16. 【IDEA&amp;&amp;Eclipse】4、IntelliJ IDEA上操作GitHub
  17. 《DSP using MATLAB》Problem 6.16
  18. Spark实战1
  19. C++类静态数据成员与类静态成员函数
  20. boost::tie()和boost::variant()解说

热门文章

  1. js混淆 反混淆 在线
  2. linux命令之pwd(print working drectory)
  3. (续)顺序表之单循环链表(C语言实现)
  4. PHP单例模式编写
  5. ios中strong, weak, assign, copy
  6. linux学习方法之六
  7. MinGW安装教程
  8. Duanxx的STM32学习:STM32下载方式选择
  9. Wheel ProgressBar 实现之三——模拟进度过程
  10. -bash: ulimit: max user processes: cannot modify limit: Operation not permitted