博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在事件代理中正确使用 focus 和 blur 事件
阅读量:5930 次
发布时间:2019-06-19

本文共 1613 字,大约阅读时间需要 5 分钟。

什么是事件代理(Event Delegation)?

如果不太了解的朋友,可详细阅读:,这里不再累述。

首先让我们一起来回顾一些常识:

  1. 通常支持事件冒泡(Event Bubbling)的事件类型为鼠标事件和键盘事件,例如:mouseover, mouseout, click, keydown, keypress
  2. 接口事件则通常不支持事件冒泡(Event Bubbling),例如:load, change, submit, focus, blur

很明显:focus 和 blur 都属于不支持冒泡的接口事件。既然都不支持冒泡,那又如何实现事件代理呢?

可以换个角度,逆向思维,尝试事件捕获(Event Capturing,除了IE,现在流行的标准浏览器均支持)。

测试后会发现,如果你捕获 focus 或 blur 事件,目标元素的祖先元素均执行事件函数。至于为什么?或许是实现的一个 BUG。

el.addEventListener('focus', focusHandler,true); el.addEventListener('blur', blurHandler,true);

那对于 IE ,我们如何实现呢?

非常幸运,IE 下支持 focusin 和 focusout 事件,非常类似于 focus 和 blur 事件,唯一不同的是,这两种事件支持事件冒泡(Event Bubbling)。

el.onfocusin = focusHandler; el.onfocusout = blurHandler;

很完美的解决方案:

if(document.addEventListener){
    el.addEventListener('focus', focusHandler,true);     el.addEventListener('blur', blurHandler,true); }else{
    el.onfocusin = focusHandler;     el.onfocusout = blurHandler; }

当你下次看到  的 event/event-debug.js 源码中下面几段代码时,一定会清晰很多:

576    // String constants used by the addFocusListener and removeFocusListener methods 577 578     FOCUSIN ="focusin", 579     FOCUSOUT ="focusout";         .... 750     _specialTypes:{
751         focusin:(isIE ?"focusin":"focus"), 752         focusout:(isIE ?"focusout":"blur") 753      },         .... 1053    addListener:function(el, sType, fn, obj, overrideContext){
1054 1055        var capture =((sType == FOCUSIN || sType == FOCUSOUT)&&!YAHOO.env.ua.ie)?true:false; 1056 1057        returnthis._addListener(el,this._getType(sType), fn, obj, overrideContext, capture); 1058 1059    },

转载于:https://www.cnblogs.com/chris-oil/archive/2013/03/16/2963996.html

你可能感兴趣的文章
学会拒绝不是什么坏事,要鼓起勇气说“不”
查看>>
假导出Excel功能实现,按CSV格式快速导出功能代码参考(追求代码追求简洁复用)浙江杭州...
查看>>
我的友情链接
查看>>
keepalived主备切换后虚拟IP漂移慢的解决方法
查看>>
SAP系统参数设置
查看>>
LAMP架构之:httpd.conf配置文件解析
查看>>
oracle 锁
查看>>
[HDU]1728逃离迷宫
查看>>
中庸之道--适度的架构设计
查看>>
源代码实现LAMP的平台搭建
查看>>
echarts-简单入门
查看>>
thinkphp-循环输出标签volist
查看>>
bootstrap-无样式列表
查看>>
稳定性问题案例-Error -27796: Failed to connect to server
查看>>
L-1-17 Linux命令之压缩与归档命令
查看>>
Eclipse_java_log4j学习记录
查看>>
lvs haproxy lvs三种软负载均衡的比较
查看>>
Elasticsearch 索引、更新、删除文档
查看>>
使用yum安装MariaDB
查看>>
python字典的提取
查看>>