2019独角兽企业重金招聘Python工程师标准>>>

在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定、事件监听、事件委托(事件代理)等。这些名词是什么意思呢,有什么作用呢?

事件绑定

要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数。所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称。

在JavaScript中,有三种常用的绑定事件的方法:

  • 在DOM元素中直接绑定;
  • 在JavaScript代码中绑定;
  • 绑定事件监听函数。

在DOM中直接绑定事件

我们可以在DOM元素上绑定onclick、onmouseover、onmouseout、onmousedown、onmouseup、ondblclick、onkeydown、onkeypress、onkeyup等。好多不一一列出了。如果想知道更多事件类型请查看,DOM事件。

<input type="button" value="click me" onclick="hello()">
<script>
function hello(){alert("hello world!");
}
</script>

在JavaScript代码中绑定事件

在JavaScript代码中(即script标签内)绑定事件可以使JavaScript代码与HTML标签分离,文档结构清晰,便于管理和开发。

<input type="button" value="click me" id="btn">
<script>
document.getElementById("btn").onclick = function(){alert("hello world!");
}
</script>

使用事件监听绑定事件

绑定事件的另一种方法是用 addEventListener() 或 attachEvent() 来绑定事件监听函数。下面详细介绍,事件监听。

事件监听

关于事件监听,W3C规范中定义了3个事件阶段,依次是捕获阶段、目标阶段、冒泡阶段。

起初Netscape制定了JavaScript的事件驱动机制(即事件捕获)。随即IE也推出了自己的事件驱动机制(即事件冒泡)。最后W3C规范了两种事件机制,分为捕获阶段、目标阶段、冒泡阶段。IE8以前IE一直坚持自己的事件机制(前端人员一直头痛的兼容性问题),IE9以后IE也支持了W3C规范。

W3C规范

语法:

element.addEventListener(event, function, useCapture)

event : (必需)事件名,支持所有DOM事件。
function:(必需)指定要事件触发时执行的函数。
useCapture:(可选)指定事件是否在捕获或冒泡阶段执行。true,捕获。false,冒泡。默认false。

注:IE8以下不支持。

<input type="button" value="click me" id="btn1">
<script>
document.getElementById("btn1").addEventListener("click",hello);
function hello(){alert("hello world!");
}
</script>

IE标准

语法:

element.attachEvent(event, function)

event:(必需)事件类型。需加“on“,例如:onclick。
function:(必需)指定要事件触发时执行的函数。

<input type="button" value="click me" id="btn2">
<script>
document.getElementById("btn2").attachEvent("onclick",hello);
function hello(){alert("hello world!");
}
</script>

事件监听的优点

1、可以绑定多个事件。

<input type="button" value="click me" id="btn3">
<script>
var btn3 = document.getElementById("btn3");
btn3.onclick = function(){alert("hello 1"); //不执行
}
btn3.onclick = function(){alert("hello 2"); //执行
}
</script>

常规的事件绑定只执行最后绑定的事件 。

<input type="button" value="click me" id="btn4">
<script>
var btn4 = document.getElementById("btn4");
btn4.addEventListener("click",hello1);
btn4.addEventListener("click",hello2);
function hello1(){alert("hello 1");
}
function hello2(){alert("hello 2");
}
</script>

两个事件都执行了。

2、可以解除相应的绑定

<input type="button" value="click me" id="btn5">
<script>
var btn5 = document.getElementById("btn5");
btn5.addEventListener("click",hello1);//执行了
btn5.addEventListener("click",hello2);//不执行
btn5.removeEventListener("click",hello2);
function hello1(){alert("hello 1");
}
function hello2(){alert("hello 2");
}
</script>

封装事件监听

<input type="button" value="click me" id="btn5">
//绑定监听事件
function addEventHandler(target,type,fn){if(target.addEventListener){target.addEventListener(type,fn);}else{target.attachEvent("on"+type,fn);}
}
//移除监听事件
function removeEventHandler(target,type,fn){if(target.removeEventListener){target.removeEventListener(type,fn);}else{target.detachEvent("on"+type,fn);}
}
//测试
var btn5 = document.getElementById("btn5");
addEventHandler(btn5,"click",hello1);//添加事件hello1
addEventHandler(btn5,"click",hello2);//添加事件hello2
removeEventHandler(btn5,"click",hello1);//移除事件hello1

事件委托

事件委托就是利用冒泡的原理,把事件加到父元素或祖先元素上,触发执行效果。

<input type="button" value="click me" id="btn6">
var btn6 = document.getElementById("btn6");
document.onclick = function(event){event = event || window.event;var target = event.target || event.srcElement;if(target == btn6){alert(btn5.value);}
}

上面只是个例子,代码尽可能的简化了。在实际的代码中 我们可能用到jQuery的live()、delegate()、bind()、on()等。

事件委托优点

1、提高JavaScript性能。事件委托可以显著的提高事件的处理速度,减少内存的占用。实例分析JavaScript中的事件委托和事件绑定,这篇文章写得还不错。

传统写法

<ul id="list"><li id="item1" >item1</li><li id="item2" >item2</li><li id="item3" >item3</li>
</ul>
<script>
var item1 = document.getElementById("item1");
var item2 = document.getElementById("item2");
var item3 = document.getElementById("item3");
item1.onclick = function(){alert("hello item1");
}
item2.onclick = function(){alert("hello item2");
}
item3.onclick = function(){alert("hello item3");
}
</script>

事件委托

<ul id="list"><li id="item1" >item1</li><li id="item2" >item2</li><li id="item3" >item3</li>
</ul>
<script>
var item1 = document.getElementById("item1");
var item2 = document.getElementById("item2");
var item3 = document.getElementById("item3");
document.addEventListener("click",function(event){var target = event.target;if(target == item1){alert("hello item1");}else if(target == item2){alert("hello item2");}else if(target == item3){alert("hello item3");}
})
</script>

2、动态的添加DOM元素,不需要因为元素的改动而修改事件绑定。

传统写法

<ul id="list"><li id="item1" >item1</li><li id="item2" >item2</li><li id="item3" >item3</li>
</ul>
<script>
var list = document.getElementById("list");
var item = list.getElementsByTagName("li");
for(var i=0;i<item.length;i++){(function(i){item[i].onclick = function(){alert(item[i].innerHTML);}})(i)
}
var node=document.createElement("li");
var textnode=document.createTextNode("item4");
node.appendChild(textnode);
list.appendChild(node);
</script>

点击item1到item3都有事件响应,但是点击item4时,没有事件响应。说明传统的事件绑定无法对动态添加的元素而动态的添加事件。

事件委托

<ul id="list"><li id="item1" >item1</li><li id="item2" >item2</li><li id="item3" >item3</li>
</ul>
<script>
var list = document.getElementById("list");
document.addEventListener("click",function(event){var target = event.target;if(target.nodeName == "LI"){alert(target.innerHTML);}
})
var node=document.createElement("li");
var textnode=document.createTextNode("item4");
node.appendChild(textnode);
list.appendChild(node);
</script>

当点击item4时,item4有事件响应。说明事件委托可以为新添加的DOM元素动态的添加事件。

转载于:https://my.oschina.net/u/3460260/blog/1647194

事件绑定、事件监听、事件委托相关推荐

  1. chrome 技巧篇-如何查看web元素绑定的监听事件

    第一步:首先通过 F12 进入开发者工具页面. 第二步:选中 Elements 页签内对应的元素,可以用一个按钮来试一试. 第三步:右边选择 Event Listeners 页签,并取消勾选 Ance ...

  2. TP6 事件绑定、监听、订阅

    事件绑定与监听 命令行生成事件类 php think make:event EventDemo 命令行生成事件监听类php think make:listener ListenerDemo 事件类可作 ...

  3. VUE(template标签 事件绑定与监听)

    一.template标签 Vue.js提供了template标签,可以将指令作用到这个标签上,对其子元素进行渲染,但最后渲染的结果里不会有它. 二.事件绑定与监听 1.方法与内联语句处理器 1)Vue ...

  4. php subscribe event,TP6 事件绑定、监听、订阅

    事件绑定与监听 命令行生成事件类 php think make:event EventDemo 命令行生成事件监听类php think make:listener ListenerDemo 事件类可作 ...

  5. JavaGUI编程 -- 窗口监听事件和键盘监听事件(AWT)

    1. JavaGUI编程之窗口监听事件和键盘监听事件(AWT) 1.1 窗口监听事件: 示例代码: package GUI.TestWindow;import java.awt.*; import j ...

  6. Cesium 三维球转动监听事件(相机监听事件)并且获取当前中心点位置

    三维球转动监听,可以使用相机监听,也可以使用鼠标移动监听. 相机监听有延迟,必须转动到一定程度后,才会启动监听. 鼠标移动监听可以实时监听 /* 三维球转动添加监听事件 */ viewer.camer ...

  7. Bootstrap学习(七)modal模态框、data属性、过渡事件、滚动监听事件

    模态框 模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. <div class=" ...

  8. Unity3D绑定button监听事件

    一.可视化创建及事件绑定 第一步:通过Hierarchy面板创建button,如图 第二步:创建一个脚本名为TestClick,并定义一个名为Click的public方法 ? 1 2 3 4 5 6 ...

  9. JavaScript 技术篇-通过代码获取dom元素绑定的监听事件,chrome浏览器查看js元素绑定的监听事件

    > var a = document.querySelector("#su"); < undefined > getEventListeners(a); < ...

  10. 监听js变量的变化_JS监听事件型爬虫

    点击上方"Python数据科学",选择"星标公众号" 关键时刻,第一时间送达! 作者:zuobangbang 来源:zuobangbang 最近开始研究网页参数 ...

最新文章

  1. lnmp架构——nginx的负载均衡
  2. python的赋值与参数传递(python和linux切换)
  3. docker1.13.1的安装与卸载及mysql5.5安装实例
  4. 年轻人,被领导骂是怎样一种感觉?
  5. java volatile 和Transient 关键字
  6. c语言逻辑推理题大全,C语言逻辑推理例题(附答案)
  7. editormd html 转义,Markdown(editormd)语法解析成HTML
  8. ETL数据处理平台,快速实现数据集成
  9. 《时代周刊》:投资者为何争相购买虚拟土地?
  10. java 颜色渐变算法_颜色渐变的RGB计算
  11. 富文本编辑器抓取秀米图片转存到七牛云
  12. MySQL查年龄18到22的信息_Mysql查询SQL相关总结(根据生日以及身份证查询年龄以及性别区域等)...
  13. OKR工作法阅读笔记(第一天)-序言和前言
  14. nginx 漏洞修复
  15. 360无线wifi路由器连接到服务器,360无线路由器怎么有线桥接设置
  16. 第四范式蒋仁皓:什么才是构建企业AI的关键要素
  17. H264中4x4、8x8和16x16尺寸对应场景
  18. 基于大数据分析技术实现对信用卡盗刷的预防
  19. 计算机打印机安装步骤,打印机安装步骤
  20. 作业周转时间以及平均等待时间

热门文章

  1. windows和linux下的文件路径表示
  2. 让C++对象只能分配到堆/栈和静态区上并判断分配位置
  3. 人工神经网络_验证码破译(数据挖掘入门与实践-实验9)
  4. SQL数据库权限授予grant
  5. 在Ubuntu中实验环境配置《操作系统原理与实践-李治军》
  6. [BUUCTF-pwn]——bjdctf_2020_babyrop2
  7. 7.5 obtaining database metadata
  8. 新的C库Bionic的介绍
  9. build-helper-maven-plugin 配置多 source resource 文件
  10. ajax 中文乱码问题 主要是IE浏览器