事件处理详解

前言

  本文大概整理下绑定事件的几种方式,兼容IE8- 的方式(如果需要的话),事件委托,阻止传播,取消默认行为,event对象等。

  之前做的多是手机端页面,监听事件也一直是 addEventListener ,现代浏览器基本都支持addEventListener ,除了万恶的IE8及更低版本IE。虽说不用太管IE8了(个人愚见),但是还是有必要整理下之前兼容性的处理方式

HTML事件处理

  在HTML标签中直接给属性设置处理程序。HTML中加入了JS代码,因为需要行为、样式、结构分离,这种方式现在已经淘汰,就不深入探究了。

1 <button onclick="alert('HTML事件处理!')">点我</button>

 

DOM0级事件处理

  通过元素对象的事件属性来绑定处理程序。先看栗子

<a href="http://www.baidu.com" class="a1">快点击我!</a>
    document.querySelector('.a1').onclick = function(){ //绑定事件alert('DOM0绑定--a');}

  先获取到元素a,在给元素的点击事件属性onclick绑定处理程序。

  这种方式的特点:

    1、简单易用,兼容性良好,基本所有浏览器都支持

    2、只能绑定一个处理程序,重复绑定会覆盖。如果给a的onclick属性再绑定一个处理程序,那么现在的这个就会被覆盖掉

    3、只会在冒泡阶段触发

  取消绑定也非常简单,直接设为null就可以了。

    document.querySelector('.a1').onclick = null; //取消绑定

 

DOM2级事件处理

  通过事件方法来绑定和解绑处理程序。同样看个栗子

<a href="http://www.baidu.com" class="a2">点击我!</a>
    document.querySelector('.a2').addEventListener('click', function(e){ //绑定事件1alert('DOM2绑定--a2 -- 1')}, false)document.querySelector('.a2').addEventListener('click', function(e){ //绑定事件2alert('DOM2绑定--a2 -- 2')}, false)

  addEventListener(eventName,listener,useCapture) 方式可以为事件绑定处理程序,第一个参数为事件类型(不带on);第二个参数是处理程序;第三个参数可指定哪个阶段触发,false对应冒泡阶段、true对象捕获阶段(默认false),部分低版本浏览器要求这个参数不能为空,所以最好还是带上。

  这种方式的特点:

    1、可为同一个事件绑定多个处理程序,会依次触发。多次绑定同一个处理程序,只会生效一次

    2、可指定触发的阶段,捕获阶段或者冒泡阶段

    3、兼容IE8 - 之外的其他浏览器

  解绑的方式为:Element.removeEventListener(eventName,listener,useCapture);和绑定的用法一致

  

  IE8- 有一套自己的事件处理方法

    绑定:Element.attachEvent(eventNameWithOn,listener)

    解绑:Element.detachEvent(eventNameWithOn,listener)

    document.querySelector('.a2').attachEvent('onclick', function(e){alert('DOM2绑定--a2 -- 2')})

  特点:

   1、事件类型带on (eg:onclick)

   2、只能在冒泡阶段触发

   3、IE10 - IE5都支持该方法

兼容性处理方式

  两种方式的差别在事件类型和第三个参数,所以可以做一些处理,封装兼容性处理的方式

    //通用方式//绑定function addEvent(targetElement,eventName,listener,useCapture){if(targetElement.addEventListener){ targetElement.addEventListener(eventName,listener,useCapture);}else if(targetElement.attachEvent){targetElement.attachEvent('on'   eventName,listener);}else {targetElement['on'   eventName] = listener;}}//解绑function removeEvent(targetElement,eventName,listener,useCapture){if(targetElement.addEventListener){targetElement.removeEventListener(eventName,listener,useCapture);}else if(targetElement.attachEvent){targetElement.detachEvent('on'   eventName,listener);}else {targetElement['on'   eventName] = null;}}

  测试一下使用,在IE8及其他浏览器都可以正常使用。

    addEvent(document.querySelector('.a2'),'click',test,false)function test(e){alert('addEvent then removeEvent!');removeEvent(document.querySelector('.a2'),'click',test,false);  //取消绑定}

 

Event对象

  不同的方式获取event对象的方式也不同

    attachEvent绑定: 通过 window.event获取event对象

    其他方式(DOM0和addEventListener):处理函数传参直接获取

    function test(e){ //兼容性的方式e = e || window.event;  //event对象}

  attachEvent绑定的方式,处理程序内部this指向window。想要获取元素对象 可以通过 window.event.srcElement

  其他方式的this指向触发元素 。 同样的也可以通过 event.target获取

      e = e || window.event;  //event对象var target = e.target || e.srcElement;  //触发对象

 

阻止传播和取消默认行为

  通过event对象的方式取消默认行为:

    event.preventDefault()    //其他浏览器

    event.returnValue = false //IE8-

  DOM0级绑定的 还可以直接 return false 来取消默认行为,所有浏览器都支持

 

  event对象阻止传播:

    event.stopPropagation() //其他浏览器

    event.cancelBubble = true //IE8 -

  一般可以这样写

      e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;  //阻止传播e.preventDefault ? e.preventDefault() : e.returnValue = false;    //取消默认行为

 

事件委托

  如果多个元素的处理程序类同,如果每个都绑定一次会很繁琐和低效,这时可以利用冒泡的原理(他们都会冒泡到父元素)直接在父元素上绑定事件。即为事件委托

    <section class="item item-3"><button class="btn1">点击我1!</button><button class="btn1">点击我2!</button><button class="btn1">点击我3!</button></section>

  

    addEvent(document.querySelector('.item-3'),'click',function(e){e = e || window.event;  //event对象var target = e.target || e.srcElement;  //触发对象if(target.nodeName === 'BUTTON'){alert(target.innerText);}})

  本例中,想要实现点击按钮输出按钮文字。如果给三个按钮分别绑定事件会不会太傻。所以直接绑定了父元素,事件触发时,判断触发对象是否是button标签,如果是,则输出文字。

 


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用户会话,数据控件和AM池

最近&#xff0c;有人问我有关应用程序模块池的有趣问题。 众所周知&#xff0c;AM池包含用户会话引用的应用程序模块实例&#xff0c;这允许会话在后续请求时从池中获取完全相同的AM实例。 如果应用程序中有多个根应用程序模块&#xff0c;那么每个模块都将拥有自己的AM池&am…

对Group_concaT函数利用剖析 (转)

作者&#xff1a;晓华 开篇介绍 在FLYH4T大哥的“Mysql5注射技巧总结”一文中介绍了通过使用“information_schema”库实现遍历猜解库名表名以及字段名的技术&#xff0c;解决了一些以前使用工具无法猜解到的库名表名以及字段名的问题&#xff0c;提高了注射的效率。关于此文的…

用 CSS 实现元素垂直居中,有哪些好的方案?

DIV居中的经典方法 1. 实现DIV水平居中 设置DIV的宽高&#xff0c;使用margin设置边距0 auto&#xff0c;CSS自动算出左右边距&#xff0c;使得DIV居中。 1 div{ 2 width: 100px; 3 height: 100px; 4 margin: 0 auto; 5 } 缺点&#xff1a;需要设置div的宽度 2.…

使用wss和HTTPS / TLS保护WebSocket的安全

是这个博客的第50条提示&#xff0c;是的&#xff01; 技术提示&#xff03;49说明了如何使用用户名/密码和Servlet安全机制保护WebSocket的安全。 本技术提示将说明如何在WildFly上使用HTTPS / TLS保护WebSocket。 让我们开始吧&#xff01; 创建一个新的密钥库&#xff1a…

时钟同步及其应用(接上一篇)

在linux下做的时钟同步的工作终于暂时告一段落了。 前面简单的做了客户端和服务器端的同步&#xff0c;在基于时间同步的机制上&#xff0c;将系统的1s的时间划分多个时槽。由于此时间同步应用在分布式系统中&#xff0c;涉及到多个客户端和服务器通信的问题&#xff0c;因此划…

Java性能调优调查结果(第二部分)

这是系列文章的第二篇&#xff0c;我们将分析2014年10月进行的性能调整调查的结果。如果您尚未阅读第一部分&#xff0c;我们建议从此处开始 。 第二部分将重点监视Java应用程序的性能问题。 特别是&#xff0c;我们尝试回答以下问题&#xff1a; 人们如何发现性能问题&#x…

HDU 2094 产生冠军

判断顶点入度是否唯一即可。如果入度为0的节点只有一个&#xff0c;输出Yes&#xff0c;否则输出No。 代码&#xff1a; 1 #include<iostream>2 #include<cstring>3 4 using namespace std;5 6 int len;7 int map[1001][1001];8 char name[1001][100];9 10 int fu…

简单的css缩放动画,仿腾讯新闻的分享按钮和美团app底部的图标样式

最近看到一些好看的hover的图形缩放效果。然后自己就写了下&#xff0c;发现这2种效果都不错。如果伙伴们更好的实现方式可以在下面留言哦~ 还有美团的效果&#xff0c;我就不展示了&#xff0c;喜欢的可以去app应用上看看。 这两种效果&#xff0c;其实实现的原理是一样的&…

Java性能调优调查结果(第一部分)

我们在2014年10月进行了Java性能调优调查。该调查的主要目的是收集对Java性能世界的见解&#xff0c;以改进Plumbr产品。 但是&#xff0c;我们也很高兴与您分享有趣的结果。 我们收集的数据为进行冗长的分析提供了素材&#xff0c;因此我们决定将结果划分为一系列博客文章。 这…

asp.net ViewState详解

ViewState是一个被误解很深的动物了。我希望通过此文章来澄清人们对ViewState的一些错误认识。为了达到这个目的&#xff0c;我决定从头到尾详细的描述一下整个ViewState的工作机制&#xff0c;其中我会同时用一些例子说明我文章中的观点&#xff0c;结论。比如我会用静态控件(…

OSGi Testsuite:引入类名过滤器

OSGi Testsuite是一个JUnit测试运行程序 &#xff0c;它动态地收集要执行的测试类。 它已经由我的同伴Rdiger大约一年前出版&#xff0c;并且已经在某些项目中证明是有用的。 但是对于gonsole&#xff0c;我们必须使用一个难看的补丁&#xff0c;因为1.0版仅支持.*Test后缀匹配…

javascript数字验证(转)

转自http://www.cnblogs.com/lovelace821/archive/2009/04/27/1444654.html js验证数字 javascript限制输入的只能是数字&#xff0c;判断event.keyCode的值&#xff0c;并将它限定只能为数字&#xff0c;如果不是数字&#xff0c;则返回错误&#xff0c;如果是数字&#xff0c…

需要微缓存吗? 营救记忆

缓存解决了各种各样的性能问题。 有很多方法可以将缓存集成到我们的应用程序中。 例如&#xff0c;当我们使用Spring时&#xff0c;可以轻松使用Cacheable支持。 非常简单&#xff0c;但我们仍然必须配置缓存管理器&#xff0c;缓存区域等。有时&#xff0c;就像用大锤砸破坚果…

es6 对象的扩展

1.属性的简洁表示法function f(x,y) {return {x,y};}// 等同于function f(x,y){return {x:x,y:y};}f(1,2)   // Object {x:1,y:2}例如&#xff1a;let birth 2000/01/01;const Person {name: 张三&#xff0c;// 等同于 birth: birthbirth,// 等同于hello: function()...he…

windows下命令行修改系统时间;修改系统时间的软件

找了很久,都没有找到,还找了关键词 dos下修改系统时间 因为看到linux下修改系统时间是用hwclock 命令写入主板芯片. 而我由于某些原因想自动化修改系统时间,所以找windows下修改系统时间的软件 没有找到. 有一个 意天禁止修改系统时间开发包(系统时间保护组件) 1.0.0.1 ,可以禁…

如何摆脱JavaFX中的重点突出显示

今天&#xff0c;有人问我是否知道摆脱JavaFX控件&#xff08;分别是按钮&#xff09;的焦点突出的方法&#xff1a; 有关此问题的大多数文章和提示建议添加&#xff1a; .button:focused {-fx-focus-color: transparent; }但是使用这种样式&#xff0c;仍然会留下这样的光芒…

extjs 基础部分

创建对象的方法&#xff1a; 使用new 关键字创建对象。 new classname ([config]) 使用Ext.create方法创建。 Ext.create(classname,[config]) new Ext.Viewport({}) 修改为Ext.create(Ext.Viewport,{}) Ext.widget 或Ext.createWidget 创建对象 使用Ext.ns 或者Ext.namespace…

Java时区处理初学者指南

基本时间观念 大多数Web应用程序必须支持不同的时区&#xff0c;而正确处理时区绝非易事。 更糟糕的是&#xff0c;您必须确保各种编程语言&#xff08;例如&#xff0c;前端JavaScript&#xff0c;中间件中的Java和作为数据存储库的MongoDB&#xff09;之间的时间戳是一致的。…

Android工具HierarchyViewer 代码导读(3) -- 后台代码

在上文中&#xff0c;我们讲解了如何把HierarchyViewer的项目导入到Eclipse中&#xff0c;以便更高效阅读代码。本文将讲解HierarchyViewer的后台代码&#xff0c;建议大家可以先阅读<Android工具HierarchyViewer代码导读(1) -- 功能实现演示>一文, 其中的代码演示了Hier…

Extjs 数据代理

Ext.data.proxy.Proxy 代理类的根类 客户端代理&#xff1a; 1.LocalStorageProxy&#xff1a;将数据存储在localStorage中&#xff0c;此种方式可以持久的将数据存储在客户端 要使用代理&#xff0c;我们首先要有一个数据模型类&#xff0c;我们定义一个简单的Person类&…