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. WPF: RenderTransform特效

    WPF中的变形(RenderTransform)类是为了达到直接去改变某个Silverlight对象的形状(比如缩放.旋转一个元素)的目的而设计的,RenderTransform包含的变形属性成员就是 ...

  2. git merge后,后悔了如何回退

    今天将feature分支的代码merge到develop分支后我后悔了,因为feature分支的功能还没有全部开发完成,我在feature分支上commit是可以的,但是这之后我又把它merge到了d ...

  3. 十七、ThreadPoolExecutor线程池

    一.简介 executor接口 executor接口在JDK的java.util.concurrent包下,它只有一个抽象方法: void execute(Runnable command); 这意味 ...

  4. LeetCode 第二天后续(两数相加 python3)

    # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # sel ...

  5. 撩课-Java每天10道面试题第4天

    撩课Java+系统架构 视频 点击开始学习 31.静态变量和实例变量的区别? 静态变量也叫类变量, 这种变量前加了static修饰符. 可以直接用类名调用, 也可以用对象调用, 而且所有对象的同一个类 ...

  6. DButils分析

    package com.ldf.utils; import java.sql.Connection; public class DBUtils { private static String driv ...

  7. Map 模板

    #include<stdio.h> #include<iostream> #include<map> using namespace std; typedef pa ...

  8. SQL索引优化及实战文章总结(总结)

    1. MySQL索引原理以及查询优化 2.

  9. ES6学习笔记(一)-变量的解构赋值

    变量的解构赋值种类 解构(Destructuring):ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值. 只有当一个数组成员严格等于(===)undefined,包括空“ ” ,默认值 ...

  10. python中单下划线和双下滑线

    使用单下划线(_one_underline)开头表示方法不是API的一部分,不要直接访问(虽然语法上访问也没有什么问题). 使用双下划线开头(__two_underlines)开头表示子类不能覆写该方 ...