js事件的机制
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事件的机制的更多相关文章
- js事件循环机制辨析
对于新接触js语言的人来说,最令人困惑的大概就是事件循环机制了.最开始这也困惑了我好久,花了我几个月时间通过书本,打代码,查阅资料不停地渐进地理解他.接下来我想要和大家分享一下,虽然可能有些许错误的 ...
- 这可能是最简明扼要的 js事件冒泡机制+阻止默认事件 讲解了
哎 js事件冒泡机制和阻止冒泡 阻止默认行为好像永远也整不清楚,记了忘 忘了记...醉了 这篇文章写完以后下次再忘记 就呼自己一巴掌,忘一次一巴掌 首先要明白两个概念——事件和事件流 事件指的是用户或 ...
- JS 事件循环机制 - 任务队列、web API、JS主线程的相互协同
一.JS单线程.异步.同步概念 从上一篇说明vue nextTick的文章中,多次出现“事件循环”这个名词,简单说明了事件循环的步骤,以便理解nextTick的运行时机,这篇文章将更为详细的分析下事件 ...
- JS事件冒泡机制和兼容性添加事件
本篇文章主要来讲讲 事件的冒泡机制 和 添加事件的几种方法. 一. JS的时间传递顺序: 捕获阶段 -> 目标阶段 -> 冒泡阶段 捕获阶段是指从父层往子层找.比如 <body> ...
- js 事件循环机制 EventLoop
js 的非阻塞I/O 就是由事件循环机制实现的 众所周知 js是单线程的 也就是上一个任务完成后才能开始新的任务 那js碰到ajxa和定时器.promise这些异步任务怎么办那?这时候就出现了事件 ...
- 一次关于js事件出发机制反常的解决记录
起因:正常情况下我点击s2时是先弹出我是children,再弹出我是father,但是却出现了先弹出我是father,后弹出我是children的情况,这种情况是在和安卓app交互的h5页面中出现的, ...
- js事件流机制冒泡和捕获
JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流 从页面中接收事件的顺序称为事件流. IE --> 事件冒泡流 Netsc ...
- Node.js 事件循环机制
Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程.高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发 ...
- js事件循环机制 (Event Loop)
一.JavaScript是单线程单并发语言 什么是单线程 主程序只有一个线程,即同一时间片断内其只能执行单个任务. 为什么选择单线程? JavaScript的主要用途是与用户互动,以及操作DOM.这决 ...
- js事件循环机制(Event Loop)
javascript从诞生之日起就是一门 单线程的 非阻塞的 脚本语言,单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务,非阻塞靠的就是 event lo ...
随机推荐
- 十三、栅栏CyclicBarrier
一.简介 栅栏CyclicBarrier的作用就是等待一组线程都准备好了,然后执行某个任务.这与CountDownLatch很相似. 但是CyclicBarrier和CountDownLatch是有区 ...
- sublime text3 JS语法检测插件
首先ctrl+shift+P用包管理器安装sublimeLinter和sublimeLinter-jshint 前往node官网下载nodejs并安装 安装完node后打开命令行输入npm insta ...
- Apache Rewrite的主要功能
#Apache Rewrite的主要功能 #就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.#平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 在httpd.conf中去掉下 ...
- Spring Boot学习笔记(二)全局捕获异常处理
非常简单只需要创建自己的异常处理类,加上两个注解,就可以了
- Java面试宝典之----java基础(含答案)
一 JAVA基础 1. JAVA中的几种基本数据类型是什么,各自占用多少字节. int 32bit short 16bitlong 64bit byte 8b ...
- golang 记录函数执行耗时的一个简单方法。
先写一个公共函数, 比如在 common 包下有这么一个方法: // 写超时警告日志 通用方法 func TimeoutWarning(tag, detailed string, start time ...
- 领域模型(DomainModel)与视图模型(ViewModel)
Model-View-Controller(模型-视图-控制器,MVC)模式将你的软件组织并分解成三个截然不同的角色: Model 封装了你的应用数据.应用流程和业务逻辑. View 从 Model ...
- spring boot包扫描不到controller层
启动类代码 package com.maven.demo; import org.mybatis.spring.annotation.MapperScan; import org.springfram ...
- PowerDesigner16导出SQL时如何添加注释
添加注释方法 https://jingyan.baidu.com/article/47a29f24652e44c0142399c3.html 重点是修改value的值 alter table [%QU ...
- 原生canvas写的飞机游戏
一个原生canvas写的飞机游戏,实用性不大,主要用于熟悉canvas的一些熟悉用法. 项目地址:https://github.com/BothEyes1993/canvas_game