1、html事件处理程序

<button id="btn1" onclick="alert(1);">按钮1</button>

2、dom0级事件处理程序

<button id="btn2">按钮2</button>
document.getElementById("btn2").onclick=function(){alert(2);};
document.getElementById("btn2").onclick=null; //取消事件

3、dom2级事件处理程序 优点支持多个事件绑定

<button id="btn3">按钮3</button>
<script type="text/javascript">
function btn3(){
alert(3);
}
document.getElementById('btn3').addEventListener('click','btn3',false);
document.getElementById('btn3').removeEventListener('click','btn3',false);
//移除事件 document.getElementById('btn3').addEventListener('click',function(){alert(33);}); //可以添加多个事件绑定

兼容性问题:chrome支持addEventListener,ie支持attachEvent

<button id="btn3">按钮3</button>
<script type="text/javascript">
function btn3(){
alert(3);
}
document.getElementById("btn3").attachEvent('onclick',btn3);
document.getElementById("btn3").detachEvent('onclick',btn3);

支持chrome和低版本ie的:

<button id="btn3">按钮3</button>
<script type="text/javascript">
function btn3(){
alert(3);
}
var eventUtil = {
addHandler:function(element,type,handler){
if(element.addEventListener)
{
element.addEventListener(type,handler,false); //chrome dom2级
}else if(element.attachEvent)
{
element.attachEvent('on'+type,handler) //ie dom2级
}else
{
element['on'+type]=handler; //dom0级
}
},
removeHandler:function(element,type,handler){
if(element.removeEventListener)
{
element.removeEventListener(type,handler,false);
}else if(element.detachEvent)
{
element.detachEvent('on'+type,handler)
}else
{
element['on'+type]=null;
}
}
}
eventUtil.addHandler(document.getElementById("btn3"),'click',btn3);
eventUtil.removeHandler(document.getElementById("btn3"),'click',btn3); </script>

事件对象 eventUtil.addHandler(document.getElementById("btn3"),'click',btn3);

    function btn3(event){
alert(event.target); //获取事件目标 [object HTMLButtonElement]
alert(event.type); //获取事件类型 click
}

冒泡机制 :当你点击btn3的时候会调用btn3函数和box函数。事件从button冒泡到div上

<div id="box">
<button id="btn3">按钮3</button>
</div>
<script type="text/javascript">
function btn3(event){
alert(event.target.nodename); //获取事件目标 button
alert(event.type); //获取事件类型 click
}
function box(){
alert('this is box');
}
eventUtil.addHandler(document.getElementById("btn3"),'click',btn3);
eventUtil.addHandler(document.getElementById("box"),'click',box);

阻止事件冒泡:通过event.stopPropagation();实现

<div id="box">
<button id="btn3">按钮3</button>
</div>
<script type="text/javascript">
function btn3(event){
alert(event.target.nodeName); //获取事件目标 [object HTMLButtonElement]
event.stopPropagation();
// alert(event.type); //获取事件类型 click
}
function box(){
alert('this is box');
}
eventUtil.addHandler(document.getElementById("btn3"),'click',btn3);
eventUtil.addHandler(document.getElementById("box"),'click',box);

阻止事件的默认行为,event.preventDefault();这样点击go,就不会发生跳转了

<a href="http://www.baidu.com" id='go'>go</a>
<script>
function stopgo(event){
event.stopPropagation();
event.preventDefault();
}
eventUtil.addHandler(document.getElementById("go"),'click',stopgo);

兼容性问题封装到evenUtil中

getEvent:function(event)
{
return event?event:window.event; //window.event ie
},
getType:function(event)
{
return event.type;
},
getElement:function(event)
{
return event.target||event.srcElement; //event.srcElement ie
},
preventDefault:function(event)
{
if(event.preventDefault)
{
event.preventDefault();
}else{
event.returnValue=false; //ie
}
},
stopPropagation:function(event)
{
if(event.stopPropagation)
{
event.stopPropagation();
}else
{
event.cancleBubble=true //ie
}
}

  //调用

  eventUtil.addHandler(document.getElementById("go"),'click',function(e){
  e=eventUtil.getEvent(e); //也可以写成 e=e||window.e
  alert(eventUtil.getElement(e));
  eventUtil.preventDefault(e);
  eventUtil.stopPropagation(e);
  });

 

参考文章:

https://www.imooc.com/video/2162

js事件的机制的更多相关文章

  1. js事件循环机制辨析

     对于新接触js语言的人来说,最令人困惑的大概就是事件循环机制了.最开始这也困惑了我好久,花了我几个月时间通过书本,打代码,查阅资料不停地渐进地理解他.接下来我想要和大家分享一下,虽然可能有些许错误的 ...

  2. 这可能是最简明扼要的 js事件冒泡机制+阻止默认事件 讲解了

    哎 js事件冒泡机制和阻止冒泡 阻止默认行为好像永远也整不清楚,记了忘 忘了记...醉了 这篇文章写完以后下次再忘记 就呼自己一巴掌,忘一次一巴掌 首先要明白两个概念——事件和事件流 事件指的是用户或 ...

  3. JS 事件循环机制 - 任务队列、web API、JS主线程的相互协同

    一.JS单线程.异步.同步概念 从上一篇说明vue nextTick的文章中,多次出现“事件循环”这个名词,简单说明了事件循环的步骤,以便理解nextTick的运行时机,这篇文章将更为详细的分析下事件 ...

  4. JS事件冒泡机制和兼容性添加事件

    本篇文章主要来讲讲 事件的冒泡机制 和 添加事件的几种方法. 一. JS的时间传递顺序: 捕获阶段 -> 目标阶段 -> 冒泡阶段 捕获阶段是指从父层往子层找.比如 <body> ...

  5. js 事件循环机制 EventLoop

    js 的非阻塞I/O  就是由事件循环机制实现的 众所周知  js是单线程的 也就是上一个任务完成后才能开始新的任务 那js碰到ajxa和定时器.promise这些异步任务怎么办那?这时候就出现了事件 ...

  6. 一次关于js事件出发机制反常的解决记录

    起因:正常情况下我点击s2时是先弹出我是children,再弹出我是father,但是却出现了先弹出我是father,后弹出我是children的情况,这种情况是在和安卓app交互的h5页面中出现的, ...

  7. js事件流机制冒泡和捕获

    JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流 从页面中接收事件的顺序称为事件流. IE --> 事件冒泡流 Netsc ...

  8. Node.js 事件循环机制

    Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程.高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发 ...

  9. js事件循环机制 (Event Loop)

    一.JavaScript是单线程单并发语言 什么是单线程 主程序只有一个线程,即同一时间片断内其只能执行单个任务. 为什么选择单线程? JavaScript的主要用途是与用户互动,以及操作DOM.这决 ...

  10. js事件循环机制(Event Loop)

    javascript从诞生之日起就是一门  单线程的  非阻塞的  脚本语言,单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务,非阻塞靠的就是 event lo ...

随机推荐

  1. 十三、栅栏CyclicBarrier

    一.简介 栅栏CyclicBarrier的作用就是等待一组线程都准备好了,然后执行某个任务.这与CountDownLatch很相似. 但是CyclicBarrier和CountDownLatch是有区 ...

  2. sublime text3 JS语法检测插件

    首先ctrl+shift+P用包管理器安装sublimeLinter和sublimeLinter-jshint 前往node官网下载nodejs并安装 安装完node后打开命令行输入npm insta ...

  3. Apache Rewrite的主要功能

    #Apache Rewrite的主要功能 #就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.#平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 在httpd.conf中去掉下 ...

  4. Spring Boot学习笔记(二)全局捕获异常处理

    非常简单只需要创建自己的异常处理类,加上两个注解,就可以了

  5. Java面试宝典之----java基础(含答案)

    一 JAVA基础 1. JAVA中的几种基本数据类型是什么,各自占用多少字节. int        32bit   short   16bitlong     64bit   byte     8b ...

  6. golang 记录函数执行耗时的一个简单方法。

    先写一个公共函数, 比如在 common 包下有这么一个方法: // 写超时警告日志 通用方法 func TimeoutWarning(tag, detailed string, start time ...

  7. 领域模型(DomainModel)与视图模型(ViewModel)

    Model-View-Controller(模型-视图-控制器,MVC)模式将你的软件组织并分解成三个截然不同的角色: Model 封装了你的应用数据.应用流程和业务逻辑. View 从 Model ...

  8. spring boot包扫描不到controller层

    启动类代码 package com.maven.demo; import org.mybatis.spring.annotation.MapperScan; import org.springfram ...

  9. PowerDesigner16导出SQL时如何添加注释

    添加注释方法 https://jingyan.baidu.com/article/47a29f24652e44c0142399c3.html 重点是修改value的值 alter table [%QU ...

  10. 原生canvas写的飞机游戏

    一个原生canvas写的飞机游戏,实用性不大,主要用于熟悉canvas的一些熟悉用法. 项目地址:https://github.com/BothEyes1993/canvas_game