春雨_Yang

努力不一定成功,但放弃一定会失败。

导航

偷来的笔记---事件

第十一讲 事件

 

一、事件个体

二、事件整体

 

若调用方法,方法里不传参数,在标准浏览器里,会自动指定参数(浏览器的事件对象),

此事件对象e包含:鼠标位置,键盘的按键,此事件发生在哪个HTML元素上,当前的事件是什么事件

没有整体捕获事件,只能单独捕获键盘或鼠标...

e.clientX //鼠标X轴位置

e.target //触发到哪个元素,对于块级元素,js可以识别,如果是行内元素,则判断不出类型(可以用e.target.tagName)

e.type //事件类型(单击,双击...)

e.keyCode //按键值 回车-13;shift-16;ctrl-17;alt-18;左上右下-37 38 39 40;

 

 

例:

document.onkeydown = fn; //document.onclick = fn;获得鼠标点击事件 window.onkeydown(ie不支持)

 

function fn(e){

alert(e.keyCode);

}

 

 

 

三、事件兼容性

 

FF:e

IE:window.event;

e = e || window.event; //如果两值都有,传e

 

FF:e.addEventListener('事件',方法,false)

IE:e.attachEvent('事件',方法)

 

FF:e.removeEventListener('事件',方法,false)

IE:e.detachEvent('事件',方法)

 

 

四、事件的处理方法

 

1、DOM 0级事件绑定方式:

 

(1)写在HTML事件属性里:

<div id="d" onclick="fn()">fdsa</div>

function fn(){

alert(this);

}

 

===

 

document.getElementById('d').onclick = function(){fn()}

 

//window

 

PS:用setTimeout调用的方法,this指向window

 

 

(2)用js绑定:

document.getElementById('d').onclick = fn; //div

 

document.getElementById('d').onclick = function(){fn();fn2();fn3()}

缺点:运行成本,会被覆盖,不易移除

 

 

 

2、DOM 2级事件绑定方式:

 

o.addEventListener('鼠标事件',绑定函数,false) //false 冒泡方式处理事件,true 在捕获阶段处理(IE不支持) ;this会指向当前元素;事件不加on

o.removeEventListener('鼠标事件',绑定事件,false)

 

 

 

例:

function fn(){alert(this)}

o.addEventListener('click',fn,false)

function fnRemove(){removeEventListener('click',fn,false))

o.removeEventListener('click',fnRemove,false)

 

//先绑定,再移除,则不执行绑定

 

 

 

 

五、事件的传播:

 

FF:冒泡(false),捕获(从外向内true)

IE:冒泡

 

段落里不能套块级元素,可包含行内元素,表单元素(不能为form)

 

 

阻止事件传播:

FF:e.stopPropagation();

IE:e.cancelBubble = true;

 

function fn(e){

e = e || window.event;

if(e.stopPropagation)

e.stopPropagation();

else

e.cancelBubble=true;

}

 

 

注:

写在<body onkeydown="onkey(event)">

必须写为event

==

FF:document.getElementsByTagName('body')[0].onkeydown = function(event){onkey(event)}

 

并且不用判断event = event || window.event;

 

 

 

 

六、DOM 2级绑定,this的指向问题

 

FF:DOM 2级绑定,this会指向当前元素

IE:DOM 2级绑定,this会指向window

IE9:attachEvent及addEventListener都支持

(会有事件传播)

 

 

 

七、apply和call

 

apply和call,功能一样,参数:

functionName.apply(元素,数组/集合) //fn.apply(ele,arguments)

functionName.call(元素,参数1,参数2,参数3...)

 

 

 

八、arguments

 

该对象代表正在执行的函数和调用它的函数的参数

方法固有的属性,是当前方法所有参数的集合(arrayLike类数组)

不定义形参也可以传参数

 

 

function fn(){...} //原型方法,预解释

var fnn = fn; //fnn变量表达式定义的方法,不预解释 可以用fn.caller看其原型方法

 

functionName.caller //方法的专有属性,指哪一个方法调用了“functionName”这个方法;顶层调用,则为null 

arguments.callee //是arguments的,指方法原型是哪个

 

 

如果在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。

functionName.caller.toString()

 

arguments.length是实参长度,arguments.callee.length是形参长度

 

 

例:

function fn(){

alert(fn.caller)

}

function fnD(){

fn()

}

fnD() //function fnD(){fn()}

 

 

 

 

 

九、事件的顶级绑定

 

顶级绑定:不用阻止事件传播,不用每个元素都绑定,节省性能开销。FF:target;IE:srcElement。绑定后判断事件源

 

function fn(e){

e = e || window.event;

var target = e.target || e.srcElement;

...

}

posted on 2011-09-27 15:50  春雨_Yang  阅读(229)  评论(0编辑  收藏  举报