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 ...
随机推荐
- FileSystemWatcher 监视指定目录中的变更
.Net框架类库中的FileSystemWatcher如它的名称一样是一个用于监视文件系统变化的一个控件.使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录 ...
- 在 Azure Web 应用中创建 .NET 应用程序
本快速入门帮助你在数分钟内将你的第一个 ASP.NET Web 应用部署到 Azure 应用服务.完成本教程后,你将能够在云中启动并运行一个简单的 Web 应用.在本教程中完成的所有操作均符合1 元试 ...
- jquery appendTo用法
$("#top_cartWarp").appendTo($("#top_main_right")).css('position','relative').css ...
- Spark内部结构详解
参考: https://github.com/JerryLead/SparkInternals/blob/master/markdown/english/5-Architecture.md?winzo ...
- SQLite metadata
http://www.devart.com/dotconnect/sqlite/docs/MetaData.html https://github.com/sqlitebrowser/sqlitebr ...
- web杂记-禁止输入框自动填充文字
1:背景 公司基于业务需求开发了一套纯JS的时间控件,本来用得好好得.后来发现在部分浏览器下使用该时间控件会出现输入框自动填充的部分与控件的展示产生了冲突: 如图: 2:问题分析 因为部分浏览太人性化 ...
- JS 变量 命名规范 oDiv aDiv 等
l命名规范及必要性 l可读性--能看懂 l规范性--符合规则 l匈牙利命名法 l类型前缀 类型 前缀 类型 实例 数组 a Array aItems 布尔值 b Boolean bIsComplete ...
- 【html/css】若母div设置了透明度,如何才能使得里面的子div不继承母div的透明度
用rgba的方式给母div设置透明度的话就不会影响子div的透明度了. 例: background: rgba(51, 51, 51, 0.5);
- Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)
一.文件准备 1.1 文件名称 telegraf-1.2.1_windows_amd64.zip influxdb-1.2.2_windows_amd64.zip grafana-4.2.0.wind ...
- Visual Studio 2015 安装笔记