前言

上周写需求遇到了一点小坑涉及到一些小细节,今天赶上没啥事总结一下分享出来。

click事件与blur事件冲突问题

click事件与blur事件

  • blur事件: 表单事件,元素失去焦点时候触发,不会冒泡;

  • click事件: 当点击元素的时候触发,所有元素均有此事件,会冒泡;

注意:
除了focus和blur事件,其他的表单事件均会冒泡。

问题的提出

当点击某个元素导致前一个元素失去焦点的时候,blur事件会先于click事件触发。

document.querySelector('#ipt').addEventListener('blur', () => {console.log('blur');
});
document.querySelector('#btn').addEventListener('click', () => {console.log('click');
});// blur
// click

解决方法

1. 延迟执行blur事件

document.querySelector('#ipt').addEventListener('blur', () => {setTimeout(() => {console.log('blur');}, 100);
});
document.querySelector('#btn').addEventListener('click'() => {console.log('click');
});// blur
// click

2. 用mousedown事件代替click事件

  • mousedown事件:当鼠标指针移动到元素上方并按下鼠标按键时,触发mousedown事件。

  • mouseup事件:当在元素上松开鼠标按钮时,会发生mouseup事件。

注意:

mousedown和mouseup与click 事件不同。mousedown事件仅需要按键被按下,而不需要松开即可发生;mouseup事件仅需要松开按钮,当鼠标指针位于元素上方时,放松鼠标按钮就会触发该事件。

document.querySelector('#ipt').addEventListener('blur', () => {console.log('blur');
});
document.querySelector('#btn').addEventListener('click', () => {console.log('click');
});
document.querySelector('#btn').addEventListener('mousedown', () => {console.log('mousedown');
});
document.querySelector('#btn').addEventListener('mouseup', () => {console.log('mouseup');
});// mousedown
// blur
// mouseup
// click

input文件上传同名文件问题

问题的提出

通常我们在用input做文件上传的时候,会为其绑定change事件,但是这时候会遇到一个问题,当我们在此上传同一个文件的时候,该文件已经缓存到浏览器中了,如果不刷新的话,change事件无法重复触发。

// HTML
<input type="file" id="file" />// js
document.querySelector('#file').addEventListener('change', () => {console.log('change');// ...
})// 第一次上传 file.xlsx
// change
// 第二次上传 file.xlsx 不会触发change事件

问题的解决

1. 手动触发form的reset方法

// HTML
<form id="form"><input type="file" id="file" />
</form>
// js
document.querySelector('#file').addEventListener('change', () => {console.log('change');// ...document.querySelector('#form').reset();
});// 第一次上传 file.xlsx
// change
// 第二次上传 file.xlsx
// change

缺点: 不难看出这种方法我们必须为input元素包裹一个form元素,当只包含一个input元素时候这种方法就不适用了。

2. remove掉input元素

// HTML
<form id="form"><input type="file" id="file" />
</form>
// js
let file = document.querySelector('#file');
file.addEventListener('change', () => {console.log('change');// ...file.remove();document.querySelector('#form').innerHTML = '<input type="file" id="file" />';});// 第一次上传 file.xlsx
// change
// 第二次上传 file.xlsx
// change

缺点:这种方法需要修改dom结构了dom结构,可能导致节点树的回流。

3. 更新change事件

// HTML
<form id="form"><input type="file" id="file" />
</form>
// js
let file = document.querySelector('#file');
file.addEventListener('change', () => {console.log('change');// ...file.remove();file.onchange = function () {// ...}});// 第一次上传 file.xlsx
// change
// 第二次上传 file.xlsx
// change

踩坑 - click事件与blur事件冲突问题 input文件上传同名文件问题相关推荐

  1. 微信小程序踩坑之pc端小程序的上传图片失败没有上传成功

    注:pc端是指从微信里左下角的小程序面板进入的小程序 首先微信小程序上传图片方法都是 这里后台是用了oss wx.chooseImage({count: that.data.count - that. ...

  2. Springmvc文件上传(servlet3.0)/下载(ssm)以及坑点

    前言 (补充:再linux服务器上可能没用创建文件的权限,那就需要找到文件夹给权限,比如我的chmod -R 777 /home/tomcat/apache-tomcat-default/webapp ...

  3. Egg整合antd文件上传以及防踩坑指南

    Egg整合antd文件上传以及防踩坑指南 前言 一. 项目编写 二. 注意事项 2.1 清理缓存 2.2 antd的Upload组件得到的事件对象问题 2.3 关于onChange事件的注意 前言 最 ...

  4. 监听input type=file 文件上传取消事件

    在做项目的时候,需要根据是否上传图片,(前提是已经上传文件,再次上传取消时,监听取消事件)进而判断页面变化.通过查阅相关资料,发现chane事件并不能监听取消,于是从另外一种角度:判断上传的文件是否有 ...

  5. channelsftp 上传文件为空_文件上传踩坑记及文件清理原理探究

    目录 1. 糟糕的异步存储文件实现 2. 异常原因推理 3. 问题解决方式 4. spring清理文件原理 5. tomcat清理文件原理 最近搞一个文件上传功能,由于文件太大,或者说其中包含了比较多 ...

  6. swfupload 多文件上传的属性与事件方法总结

    SWFUpload的原理: 利用Flash选择文件后上传,通过Flash和JS交互,对整个过程进行控制--包括页面的DOM操作之类的,都可以通过JS来进行控制. 说白了,就是用Flash上传,JS操作 ...

  7. 文件上传事件兼容性解决方案:兼容ie和谷歌

    在使用vue的做文件上传的时候,发现IE11兼容性有问题,无法打开文件选择器.现解决方案如下 var event; console.log("typeof (Event)========== ...

  8. webupload大文件上传的坑

    因为新项目需要上传大文件,然后各种查资料,为了保存兼容性,选择了webupload,参照示例做好了,然后发现如果在一个页面要分开上传多个大文件时,出"鬼"了: 根据这个控件的初始化 ...

  9. golang原生库mime/multipart上传formdata文件的一个小坑unexpected EOF

    golang原生库mime/multipart上传formdata文件的一个小坑unexpected EOF 遇到的问题 问题代码 问题分析 正确代码 总结 遇到的问题 用mime/multipart ...

最新文章

  1. Vitis-AI集成
  2. Facade Pattern
  3. Robust PCA 学习笔记
  4. C# ObservableCollection和List的区别
  5. VUE3.x的基本使用
  6. android全局livedata,Android 使用ViewModel,LiveData高效、简
  7. pdf是文件还是文档
  8. Python DearPyGui 多线程与异步
  9. 联网生活方式下,消费者的7大关键需求
  10. Namp 基础使用教程
  11. 三菱FX3SA PLC连接威纶通MT6071iE触摸屏+计数器使用+循环执行N次+暂停+触摸屏软件安装包
  12. Jwt入门教程:实战( 三) | 使用Springboot基于拦截器和redis的Jwt判断用户登录以及安全校验
  13. 2020腾讯广告算法大赛
  14. 光猫可以直接接交换机吗 交换机能直接连光猫吗
  15. linux 查看内存地址 rw,如何查看Linux内存中的程序所有堆的地址
  16. SAP 打开或关闭财务账期和物料账期等事物代码清单-OB52/MMPV/MMRV/OKP1/1KEF
  17. 智能风控平台核心之风控决策引擎(三)
  18. 第三回 利器,我的DHCP (转)
  19. 为什么牛逼程序员都秃顶了....?
  20. 和硕GT640显卡编程器BIOS

热门文章

  1. 一个对象,数组去重的方法
  2. sqlDataAdapter的FillSchema用法
  3. 中秋应景诗词歌赋赏析
  4. 栈区,堆区,全局区,文字常量区,程序代码区详解(程序中不同类型数据所在区)
  5. C++函数声明和定义
  6. python时间序列分析航空旅人_python时间序列分析
  7. docker下载慢,卡顿解决办法——免费安装人人都有的docker加速器
  8. android调用网页方法,Android调用手机浏览器的正确方式
  9. hashmap中的key是有序的么_HashMap?面试?我是谁?我在哪
  10. 浙江师范大学python试卷_2014考研计算机真题试卷及答案(浙江师范大学考点)