DOM0级事件模型

element.on[type] = function(){}

兼容性:全部支持
 
lay1

lay2

lay3
  • e.target:直接触发事件的元素[IE8及以下不支持taget属性,使用e.srcElement代替]
  • e.srcElement:直接触发事件的元素[FF不支持srcElement属性,使用e.target代替]
  • e.currentTarget:绑定事件的元素[IE8及以下不支持currentTarget属性,使用this代替]
  • this:同e.currentTarget[所有浏览器通用]

DOM2级事件模型

attachEvent

兼容性:IE5-IE10支持,IE11不支持,ff不支持
 
lay1

lay2

lay3
  • 对于支持的浏览器
  • e.target:不支持该属性
  • e.srcElement:直接触发事件的元素
  • e.currentTarget:不支持该属性
  • this:始终指向window,可以使用call/apply改变this指向
    element.attachEvent("on"+type,function(){ handler.apply(element,arguments); })

DOM2级事件模型

addEventListener

兼容性:IE5-IE8不支持,IE9-IE11支持,ff支持
 
lay1

lay2

lay3
  • 对于支持的浏览器
  • e.target:直接触发事件的元素
  • e.srcElement:不支持该属性
  • e.currentTarget:绑定事件的元素
  • this:同e.currentTarget
 $(function(){           //dom0级事件绑定
var eleArr_d1 = $.makeArray($(".demo1").find(".layer1,.layer2,.layer3"));
$.each(eleArr_d1, function (i, o) {
o.onclick = fn0;
}); function fn0(e) {
e = e || window.event;
console.log("e.target=", getName(e.target));
console.log("e.srcElement=", getName(e.srcElement));
console.log("e.currentTarget=", getName(e.currentTarget));
console.log("this=", getName(this));
console.log("========================================================");
} //dom2级事件绑定[IE]
var eleArr_d2 = $.makeArray($(".demo2").find(".layer1,.layer2,.layer3"));
if (document.attachEvent) {
$.each(eleArr_d2, function(i, o) {
o.attachEvent("onclick", function() { fn2_ie.apply(o,arguments); });//改变this指向
});
} else {
$(".demo2").find(".error").text("当前浏览器不支持attachEvent").show().css({ display: "inline-block" });
} function fn2_ie(e) {
e = e || window.event;
console.log("e.target=", getName(e.target));
console.log("e.srcElement=", getName(e.srcElement));
console.log("e.currentTarget=", getName(e.currentTarget));
console.log("this=", getName(this));
console.log("========================================================");
} //dom2级事件绑定[FF]
var eleArr_d3 = $.makeArray($(".demo3").find(".layer1,.layer2,.layer3"));
if (document.addEventListener) {
$.each(eleArr_d3, function(i, o) {
if (o.addEventListener) o.addEventListener("click", fn3_ff, false);
});
} else {
$(".demo3").find(".error").text("当前浏览器不支持addEventListener").css({display:"inline-block"});
} function fn3_ff(e) {
e = e || window.event;
console.log("e.target=", getName(e.target));
console.log("e.srcElement=", getName(e.srcElement));
console.log("e.currentTarget=", getName(e.currentTarget));
console.log("this=", getName(this));
console.log("========================================================");
} function getName(ele) {
if (ele==null) {
return ele;
}else if (ele.className) {
return ele.className;
} else if (ele.tagName) {
return ele.tagName;
}else if (ele.nodeName) {
return ele.nodeName;
} else {
return ele;
}
} })

[JS学习笔记]浅谈Javascript事件模型的更多相关文章

  1. 浅谈Javascript事件模拟

    事件是用来描述网页中某一特定有趣时刻的,众所周知事件通常是在由用户和浏览器进行交互时触发,其实不然,通过Javascript可以在任何时间触发特定的事件,并且这些事件与浏览器创建的事件是相同的.这就意 ...

  2. Java学习笔记——浅谈数据结构与Java集合框架(第一篇、List)

    横看成岭侧成峰,远近高低各不同.不识庐山真面目,只缘身在此山中. --苏轼 这一块儿学的是云里雾里,咱们先从简单的入手.逐渐的拨开迷雾见太阳.本次先做List集合的三个实现类的学习笔记 List特点: ...

  3. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

  4. node.js学习笔记(三)——事件循环

    要理解事件循环,首先要理解事件驱动编程(Event Driven Programming).它出现在1960年.如今,事件驱动编程在UI编程中大量使用.JavaScript的一个主要用途是与DOM交互 ...

  5. 【JS学习笔记】提取行间事件

    行间提取事件第一种方法: function 名字() { ... } oBtn.onclick=名字: 第二种方法: oBtn.onclick=function () { ... } 其实在JS当中, ...

  6. Node.js学习笔记(三): 事件机制

    大部分的nodejs核心api都建立在异步的事件驱动架构之上,所以events是Node.js 最重要的模块,它提供了唯一的接口.events 模块不仅用于用户代码与 Node.js 下层事件循环的交 ...

  7. JS学习笔记9之event事件及其他事件

    -->鼠标事件-->event事件对象-->默认事件-->键盘事件(keyCode)-->拖拽效果 一.鼠标事件 onclick ---------------鼠标点击事 ...

  8. struts 2学习笔记—浅谈struts的线程安全

    Sruts 2工作流程: Struts 1中所有的Action都只有一个实例,该Action实例会被反复使用.通过上面Struts 2 的工作流程的红色字体部分我们可以清楚看到Struts 2中每个A ...

  9. Java学习笔记——浅谈数据结构与Java集合框架(第二篇、Queue、Set)

    江南好,何处异京华. 香散翠帘多在水,绿残红叶胜于花.无事避风沙. --<纳兰词> 诗词再好,大图不能忘 上大图: 先说说栈和队列: 栈就好比手枪的弹匣,你往里面压入子弹,最先压入的子弹就 ...

随机推荐

  1. 为Eclipse指定JVM

    运行eclipse时,报如下错误时,可以通过修改配置文件eclipse.ini来解决. Version 1.4.1_01 of the JVM is not suitable for this pro ...

  2. 第七课 GDB调试 (下)

    1序言: 通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动.运行,打断点.查看变量.甚至改变变量等的知识,今天来大概讲解下调试bug的类型. 2知识点: 2.1 就像之前 ...

  3. netty4----netty5的客户端和服务端

    服务端: package com.server; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; ...

  4. 【Java】仿真qq尝试:用户注册(三)

    需求: 实现用户名和密码存入数据库. 思路: 1.连接数据表用静态加载块 2.crud写成4个静态方法 具体流程: from:https://www.tutorialspoint.com/jdbc/j ...

  5. 20145201 《Java程序设计》第三周学习总结

    20145201 <Java程序设计>第三周学习总结 教材学习内容总结 本周学习了课本第四.五章内容,即认识对象和对象封装. 第四章 认识对象 4.1类与对象 定义类 要产生对象必须先定义 ...

  6. 20145219 《Java程序设计》实验一 Java开发环境的熟悉(Linux + Eclipse)实验报告

    20145219 <Java程序设计>实验一 Java开发环境的熟悉(Windws + IDEA)实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA 编辑. ...

  7. 0927—MySQL常用语句集合

    一.连接MySQL 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysql bin,再键入命令mysql ...

  8. spark SQL学习(数据源之parquet)

    Parquet是面向分析型业务得列式存储格式 编程方式加载数据 代码示例 package wujiadong_sparkSQL import org.apache.spark.sql.SQLConte ...

  9. eclipse中的错误解决——The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    看看我们遇到的问题 解决问题

  10. 使用Xcode IDE写node.js

    最近在玩node.js 但是发现很多IDE就是用不顺手 后来发现Xcode可以剖析java script 于是试着使用Xcode来当做node.js的编辑器 首先,在Mac上必须先安装node.js的 ...