博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《编写可维护的 JavaScript》读书笔记第7章:事件处理
阅读量:6828 次
发布时间:2019-06-26

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

hot3.png

1. 典型用法

在很多场景中,只用到了 event 所提供信息的一小部分。

// 不好的写法function handleClick(event) {    var popup = document.getElementById("popup");    popup.style.left = event.clientX + "px";    popup.style.top = event.clientY + "px";    popup.className = "reveal";}addListener(element, "click", handleClick);

2. 规则 1:隔离应用逻辑

上面的代码的第一个问题是事件处理程序包含了应用逻辑(application logic)。应用逻辑是和应用相关的功能性代码,而不是和用户行为相关的。

将应用逻辑从所有事件处理程序中抽离出来的做法是一种最佳实践,其他地方可能会触发同一逻辑。

抽离出来的另一个好处是方便测试。

对上面代码进行重构,第一步是将处理弹出框逻辑的代码放入一个单独的函数中,这个函数很可能挂载于为该应用定义的一个全局对象上。因此就有了两个方法:

// 好的写法 - 拆分应用逻辑var MyApplication = {    handleClick: function(event) {        this.showPopup(event);    },        showPopup: function(event) {        var popup = document.getElementById("popup");        popup.style.left = event.clientX + "px";        popup.style.top = event.clientY + "px";        popup.className = "reveal";    }};addListener(element, "click", function(event) {    MyApplication.handleClick(event);});

3. 规则 2:不要分发事件对象

上段代码还存在一个问题,即 event 对象被无节制地分发。应用逻辑不应当依赖于 event 对象来正确完成功能。原因如下:

  • 方法接口并没有表明哪些数据是必要的

  • 如果想测试这个方法,必须重新创建一个 event 对象并作为参数传入

重写方法:

// 好的写法var MyApplication = {    handleClick: function(event) {        this.popup(event.clientX, event.clientY);    },        showPopup: function(x, y) {        var popup = document.getElementById("popup");        popup.style.left = x + "px";        popup.style.top = y + "px";        popup.className = "reveal";    }};addListener(element, "click", function(event) {    MyApplication.handleClick(event); // 可以这样用};

处理事件时,最好让事件程序成为接触到的 event 对象的唯一的函数。

// 好的写法var MyApplication = {    handleClick: function(event) {                // 假设事件支持 DOM Level 2        event.preventDefault();        event.stopPropagation();                // 传入应用逻辑        this.popup(event.clientX, event.clientY);    },        showPopup: function(x, y) {        var popup = document.getElementById("popup");        popup.style.left = x + "px";        popup.style.top = y + "px";        popup.className = "reveal";    }};addListener(element, "click", function(event) {    MyApplication.handleClick(event); // 可以这样做};

转载于:https://my.oschina.net/qczhang/blog/186757

你可能感兴趣的文章
Android XML shape 标签使用详解
查看>>
android 成长日记 4.BaseActivity的实现和ActivityCollectio实现
查看>>
linux64位编译php遇到configure: error: GD build test failed. Please check the config.log for details...
查看>>
oracle 启动 命令
查看>>
使用python写糗事百科的爬虫
查看>>
$MFTMirr does not match $MFT (record 0)问题解决
查看>>
oracle 修改列
查看>>
python-03:用最简单快速的方法入门
查看>>
CentOS7网卡绑定
查看>>
LAMP-HTTPD服务器配置
查看>>
linux安装ICMP shell(icmp后门)
查看>>
JSP 上传图片之前先在页面生成预览
查看>>
ICMP协议-路由交换原理4-【HCNA笔记】
查看>>
Performing RMAN Tablespace Point-in-time Recovery(TSPITR)
查看>>
弱引用研究
查看>>
JQuery 判断checkbox是否选中,checkbox全选,获取checkbox选中值
查看>>
高考焦虑现象源于就业焦虑
查看>>
Lync Server 2013企业版部署系列之二:准备DNS
查看>>
启动3个线程轮番打印递增的数字
查看>>
PHP FLUSH 函数 在IE11中 清除缓存的方法
查看>>