深入浅析JavaScript中对事件的三种监听方式


Posted in Javascript onSeptember 29, 2015

事件(Event)是JavaScript应用跳动的心脏,也是把所有东西粘在一起的胶水,当我们与浏览器中Web页面进行某些类型的交互时,事件就发生了。

第一种监听方式,也是最普遍使用的方式,是直接在代码上加载事件,产生效果:

<table>
<tr onmouseover='this.style.backgroundColor="red"' onmouseout='this.style.backgroundColor=""'><td>text1</td><td>text2</td></tr>
<tr onmouseover='this.style.backgroundColor="red"' onmouseout='this.style.backgroundColor=""'><td>text3</td><td>text4</td></tr>
<tr onmouseover='this.style.backgroundColor="red"' onmouseout='this.style.backgroundColor=""'><td>text5</td><td>text5</td></tr>
</table>

第二种监听方式,是使用DOM的方式获取对象,并加载事件:

<table>
<tr><td>text1</td><td>text2</td></tr>
<tr><td>text3</td><td>text4</td></tr>
<tr><td>text5</td><td>text5</td></tr>
</table>
<script>
doms = document.getElementsByTagName('tr');
for(i=0;i<doms.length;i++)
{
  doms[i].onmouseover = function()
  {
    this.style.backgroundColor = "red";
  }
  doms[i].onmouseout = function()
  {
    this.style.backgroundColor = "";
  }
}
</script>

第三种监听方式,是使用标准的addEventListener方式和IE私有的attachEvent方式,因为IE的attachEvent方式在参数传递时的缺陷,这个问题被搞得稍许有些复杂了:

<table>
<tr><td>text1</td><td>text2</td></tr>
<tr><td>text3</td><td>text4</td></tr>
<tr><td>text5</td><td>text5</td></tr>
</table>
<script>
doms = document.getElementsByTagName('tr');
function show_color(where)
{
  this.tagName ? where = this : null
  where.style.backgroundColor = "red";
}
function hide_color(where)
{
  this.tagName ? where = this : null
  where.style.backgroundColor = "";
}
function for_ie(where,how)
{
  return function()
  {
    how(where);
  }  
}
for(i=0;i<doms.length;i++)
{
  try
  {
    doms[i].addEventListener('mouseover',show_color,false);
    doms[i].addEventListener('mouseout',hide_color,false);
  }
  catch(e)
  {
    doms[i].attachEvent('onmouseover',for_ie(doms[i],show_color));
    doms[i].attachEvent('onmouseout',for_ie(doms[i],hide_color));
  }
}
</script>

在绑定多个相同的事件的时候,前两种方法会产生覆盖,而第三中方法则会同时执行多个事件。

Javascript 相关文章推荐
javascript静态的url如何传递
May 03 Javascript
jQuery 表单验证扩展(三)
Oct 20 Javascript
JavaScript中URL编码函数代码
Jan 11 Javascript
jquery 多行文本框(textarea)高度变化
Jul 03 Javascript
常见表单重复提交问题整理及解决方法
Nov 13 Javascript
基于jquery实现的可编辑下拉框实现代码
Aug 02 Javascript
JavaScript驾驭网页-DOM
Mar 24 Javascript
jQuery layui常用方法介绍
Jul 25 Javascript
jquery轮播的实现方式 附完整实例
Jul 28 Javascript
关于Javascript回调函数的一个妙用
Aug 29 Javascript
JavaScript实现的九种排序算法
Mar 04 Javascript
36个正则表达式(开发效率提高80%)
Nov 17 Javascript
jQuery中的ajax async同步和异步详解
Sep 29 #Javascript
网页从弹窗页面单选框传值至父页面代码分享
Sep 29 #Javascript
pace.js页面加载进度条插件
Sep 29 #Javascript
js强制把网址设为默认首页
Sep 29 #Javascript
jQuery EasyUI Dialog拖不下来如何解决
Sep 28 #Javascript
JQuery实现左右滚动菜单特效
Sep 28 #Javascript
JS动态日期时间的获取方法
Sep 28 #Javascript
You might like
php创建sprite
2014/02/11 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
nginx 设置多个站跨域
2021/03/09 Servers
什么是DOM(Document Object Model)文档对象模型
2012/03/05 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
Vue-Router实现组件间跳转的三种方法
2017/11/07 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
Vue 封装防刷新考试倒计时组件的实现
2020/06/05 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
民间个人借款协议书
2014/09/30 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
设备技术员岗位职责
2015/04/11 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
《打电话》教学反思
2016/02/22 职场文书
为什么RedisCluster设计成16384个槽
2021/09/25 Redis