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 ...
随机推荐
- MUI框架 picker日期选择器实例
MUI官方文档点我 (一)准备工作,下载相关的js.cs文件,地址 (二)新建普通html页面 1)引入相关js.cs文件 2) 一个input,记录下id: <form> <lab ...
- 字符串匹配问题(lfyzoj)
问题描述 字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配.如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如.输入: [()] 输 ...
- Spring扩展:Spring的IoC容器(注入对象的方式和编码方式)
二.Spring的IoC容器 IoC:Inversion of Control(控制反转) DI:Dependency Injection(依赖注入) 三.依赖注入的方式 (1)构造注入 (2)set ...
- groovy运行程序和类型推断
在 Java 中,如果要声明一个 String 变量,则必须输入: String value = "Hello World"; 等号右侧的字符已经表明 value 的类型是 Str ...
- Struts2(二)— Result结果配置、Servlet的API的访问、模型驱动、属性驱动
一.Result结果配置 1.全局和局部结果 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里 ...
- Angular中父子组件双向绑定传值
下面为大家展示一个较为简单的ng父子组件双向绑定传值,下面是父组件页面 这个页面的大概功能就是父组件(红色)通过输入框输入内容反映到子组件上进行展示,并且进行了投影, 子组件(橙黄色)通过Input输 ...
- JavaScript - 收藏集 - 掘金
Angular 中的响应式编程 -- 浅淡 Rx 的流式思维 - 掘金第一节:初识Angular-CLI第二节:登录组件的构建第三节:建立一个待办事项应用第四节:进化!模块化你的应用第五节:多用户版本 ...
- 关于modelmap.addAttribute("",)转到jsp页面获取不到值的问题
问题一,可能是你设置的web.xml的头有问题 掉坑里好一会,发现我默认生成的web.xml中头部的配置是 <!DOCTYPE web-app PUBLIC "-//Sun Micro ...
- Modern Operating System
No one can do all things, learn to be good at use what others already did. Most computers have two m ...
- Hello,world的几种写法!
这是我的第一篇文章!开个玩笑~~“你知道回字的四种写法吗”? printf("Hello,world!"); cout<<"Hello,world!" ...