一 扭转对事件的认知

事件,是js和html交互的桥梁。当用户操作页面上的元素,比如点击,鼠标移入移出,然后做一些事情。

你若触发,我便执行——事件发生,调用它的处理函数执行相应的JavaScript代码给出响应。

在页面放一个元素:

<input type="button" id="btn" />

以onclick为例:

var oBtn = document.getElementById("btn"); //获得按钮的引用
//用for in打印出对象上的属性名
for(var i in oBtn){
console.log(i);
}

在控制台,可以看到,onclick作为元素对象的属性存在:

再打印出onclick得值:

console.log(oBtn["onclick"]); //null

当在页面中写一个元素的时候,这个元素本身就有事件存在,并不是给元素添加事件,而是添加事件处理函数。不给元素的事件指定相应的事件处理函数,作为对象的特殊属性,事件对应的值为null,则在页面中再怎么点也毫无反应。

当添加了事件处理函数:

oBtn.onclick = function(){alert("onclick");};

或:

function clicnFn(){alert("clicnFn1");}
oBtn.onclick = clicnFn;

点击页面button会执行赋给点击事件的处理函数,弹出clicnFn1。

Note:不要认为是给元素添加了事件,只是给元素的事件添加了事件处理函数而已。

二 事件绑定

当在同一个元素同一事件添加不同的处理函数,如:

function clicnFn1(){alert("clicnFn1");}
function clicnFn2(){alert("clicnFn2");}
oBtn.onclick = clicnFn1;
oBtn.onclick = clicnFn2;

点击按钮,只会弹出clicnFn2,因为下面的赋值会覆盖上面的赋值。

那怎么解决呢?答案是使用事件绑定

在标准浏览器(FF,chrome,ie9+),使用addEventListener,使用方法:

addEventListener(事件名,事件处理函数,布尔值);

第三个参数为布尔值,false是冒泡时触发,true为捕获时触发,通常设为false。

除非想在到达事件目标之前,想做点事,那么设为true。(关于冒泡和捕获,会在事件流中详细讲解)

在ie低版本浏览器(ie6/7/8),使用attachEvent,使用方法:

atttachEvent(事件名,事件处理函数);

ie低版本浏览器不支持捕获,只支持冒泡。

封装兼容写法addEvent函数:

/*
@fileOverview 对事件绑定的兼容封装
@param {oBject} 元素对象
@param {String} 事件名
@param {Function} 事件处理函数
*/
function addEvent(obj,eventName,fn){
if(obj.attachEvent){
obj.attachEvent("on"+eventName,function(){ //在ie低版本中,需要在事件名前加上on
//在ie中事件绑定的处理函数this指向的window,需要用call将this指向obj,以便在事件处理函数中使用this
fn.call(obj);
});
}else{
obj.addEventListener(eventName,fn,false);
}
}

使用封装函数:

addEvent(obj,"click",clicnFn1);
addEvent(obj,"click",clicnFn1);

Note:在标准浏览器和ie低版本浏览器,绑定多个函数的执行顺序有所不同。

三 事件对象

事件对象是一座宝藏,里面藏着用来描述事件的信息。

例如可以在事件对象中获得,事件类型,鼠标在页面的点击的位置,点击的目标。。。等等

在标准浏览器(FF,chrome,ie9+)获取事件对象

事件对象作为事件处理函数的第一个参数(包括chrome浏览器)

function clicnFn1(ev){alert(ev);}
oBtn.onclick = clicnFn1;

Note: ev是定义的参数名,这个名字可以随便设置,比如为a,b,c..。都可以。

在ie低版本浏览器(ie6/7/8)获取事件对象(包括chrome浏览器)

事件对象会保存在全局对象window的一个属性中,属性名为event。

简单测试下:

<script>
alert(event);
</script>

在ie低版本浏览器弹出null,在chrome中弹出undefined,说明这个event已经定义

只是在ie低版本浏览器中相当于这样定义:var event = null;

在chrome中相当于这样定义:var event;

Note:要使用全局event事件对象,必须是在事件处理函数中才能获得。

例如:

function clicnFn1(){alert(event);}
clicnFn1()

直接调用,那么会弹出null或undefined。

因为这是直接调用函数,而不是作为事件处理函数调用。

在例如:

function clicnFn1(){alert(event);}
oBtn.onclick = clicnFn1;

作为事件处理函数调用,那么函数内用到event就是我们想要的事件对象了。

事件对象兼容性封装:

function clicnFn1(ev){
var e = ev || event;
};

事件暂时记录到这里,随后补充。。。

事件详解<一>的更多相关文章

  1. JavaScript事件详解-jQuery的事件实现(三)

    正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...

  2. JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】

    正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...

  3. 第三天:JS事件详解-事件流

    学习来源: F:\新建文件夹 (2)\HTML5开发\HTML5开发\04.JavaScript基础\6.JavaScript事件详解 学习内容:  1)基础概念 2)举例说明: 代码如上,如果用事件 ...

  4. JavaScript事件详解-zepto的事件实现

    zepto的event 可以结合上一篇JavaScript事件详解-原生事件基础(一)综合考虑源码暂且不表,github里还有中文网站都能下到最新版的zepto.整个event模块不长,274行,我们 ...

  5. JAVASCRIPT事件详解-------原生事件基础....

    javaScirpt事件详解-原生事件基础(一)   事件 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,通过监听特定事件的发生,你能 ...

  6. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  7. js中鼠标滚轮事件详解

    js中鼠标滚轮事件详解   (以下内容部分内容参考了http://adomas.org/javascript-mouse-wheel/ ) 之前js 仿Photoshop鼠标滚轮控制输入框取值中已使用 ...

  8. JavaScript中的鼠标滚轮事件详解

    JavaScript中的鼠标滚轮事件详解/*Firefox注册事件*/ ~~~Firefox: addEventListener('DOMMouseScroll', handler, false)if ...

  9. 【转载】C# 中的委托和事件(详解:简单易懂的讲解)

    本文转载自http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html C# 中的委托和事件(详解) C# 中的委托和事件 委托和事件在 ...

  10. js keyup、keypress和keydown事件 详解

    js keyup.keypress和keydown事件  详解 js keyup.keypress和keydown事件都是有关于键盘的事件 当一个按键被pressed 或released在每一个现代浏 ...

随机推荐

  1. ARM交叉编译工具链分类说明

    转载整理自:http://www.veryarm.com/cross-tools 从授权上,ARM交叉编译工具链分为免费授权版和付费授权版. 免费版目前有三大主流工具商提供,第一是GNU(提供源码,自 ...

  2. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  3. 写一篇 Bootstrap弹窗确认的文章。本周完成

    思路; 点击按钮,显示模态 点击确定,异步提交 根据结果,删除指定的记录

  4. 两台机子的repcached Memcache 的安装与实验

    安装memcached前先要确定系统是否安装了gcc: 1.解压安装包: tar -zxf memcached-1.2.8-repcached-2.2.tar.gz 2.编译: 系统应安装了libev ...

  5. Test 17

    BZ OI 队测 T1: 题目大意: 喵星系有n个星球,标号为1到n,星球以及星球间的航线形成一棵树. 所有星球间的双向航线的长度都为1.小昕要在若干个星球建矿石仓库,设立每个仓库的费用为K.对于未设 ...

  6. UVa 11747 - Heavy Cycle Edges

    题目大意:计算最小生成树有两种算法:一种是kruskal算法,另一种是与之相反的:如果图中存在环,去掉权重最大的边,直到不存在环.输出去掉的那些边. 可以用kruskal算法解决,在判断一条边时如果加 ...

  7. java系列--批量处理

    批量删除 批量更新 二.分页 1.基于sql语句 1).基于ROWID分页 2).基于RONUM分页 3).基于数据分析分页 2.基于结果集

  8. ios framework 开发 之 实战二 ,成功

    1. 新建工程.引入cocoapod略过不提 2. 更改cocoapod类名 这是因为,引用framework的工程中,也有一个同样的文件,及文件里同样的类. 这个文件不能删除,但是可以重命名. 3. ...

  9. UVa 10034 - Freckles

    题目大意:给出n个点的坐标(x,y),要求用线段将n个点连接起来,求最小的线段和. 最小生成树问题,用Kruskal算法进行求解,其中用到了并查集.将所有的点连接,构成一张图,对每一条边进行编号,两点 ...

  10. 真机调试iwatch

    http://blog.csdn.net/chenyufeng1991/article/details/48976639 错误:no symbols for paired Apple Watch 错误 ...