上周写需求遇到了一点小坑涉及到一些小细节,今天遇上没啥事总结一下分享出来。浏览器
blur事件: 表单事件,元素失去焦点时候触发,不会冒泡;缓存
click事件: 当点击元素的时候触发,全部元素均有此事件,会冒泡;dom
注意:
除了focus和blur事件,其余的表单事件均会冒泡。指针
当点击某个元素致使前一个元素失去焦点的时候,blur事件会先于click事件触发。code
document.querySelector('#ipt').addEventListener('blur', () => { console.log('blur'); }); document.querySelector('#btn').addEventListener('click', () => { console.log('click'); }); // blur // click
document.querySelector('#ipt').addEventListener('blur', () => { setTimeout(() => { console.log('blur'); }, 100); }); document.querySelector('#btn').addEventListener('click'() => { console.log('click'); }); // blur // click
mousedown事件:当鼠标指针移动到元素上方并按下鼠标按键时,触发mousedown事件。orm
mouseup事件:当在元素上松开鼠标按钮时,会发生mouseup事件。事件
注意:ip
mousedown和mouseup与click 事件不一样。mousedown事件仅须要按键被按下,而不须要松开便可发生;mouseup事件仅须要松开按钮,当鼠标指针位于元素上方时,放松鼠标按钮就会触发该事件。rem
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作文件上传的时候,会为其绑定change事件,可是这时候会遇到一个问题,当咱们在此上传同一个文件的时候,该文件已经缓存到浏览器中了,若是不刷新的话,change事件没法重复触发。input
// HTML <input type="file" id="file" /> // js document.querySelector('#file').addEventListener('change', () => { console.log('change'); // ... }) // 第一次上传 file.xlsx // change // 第二次上传 file.xlsx 不会触发change事件
// 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元素时候这种方法就不适用了。
// 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结构,可能致使节点树的回流。
// 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