-
事件
普通类 -
- 支持
- 批判
- 提问
- 解释
- 补充
- 删除
-
-
浏览器的事件模型
DOM第0级事件模型
1.event实例
大多数浏览器当触发事件处理程序时,名为event的类实例作为第一个参数传递到处理程序(IE除外,为window.event)
处理矛盾的方式:if(!event) event = window.event;
另外获取目标元素的引用: var target = (event.target) ? event.target :event.srcElement; //IE中为event.srcElement
2.事件冒泡
当时间触发后,时间受限传递到目标元素,然后依次传递到各祖先元素,知道<html>元素为止。如果父级元素也为同类型事件建立了处理程序,也调用父元素的处理程序
3.影响时间传播和语义
可以在Event实例上以提供的机制来防止事件向上传播。 标准兼容的浏览器使用event实例的stopPropagation()方法,IE中将event实例中名为cancelBubble的属性设置为true.
DOM第2级事件类型
DOM第0级的问题在于对于每个元素而言,每次只能注册一个事件处理程序,比如元素被点击后想做两件事,使用两句赋值的方式不能实现。
需要建立标准事件模型,另外,在DOM元素上建立一个甚至多个事件处理程序时可行的
1.建立事件 (标准兼容浏览器,非IE的方法)
不是把函数引用指派到元素属性,而是通过一个元素方法而建立 addEventListener( eventType,listener,useCapture);
使用的时候:var element=$('#vscar')[0];
element.addEventListener( 'click',function(){ say('Whee once!') },false);
element.addEventListener( 'click',function(){ say('Whee twice!') },false); //由此,可以在一个元素上建立多个事件处理程序
要注意:在元素上建立多个处理程序可能以随机方式触发
2.事件传播
在标准兼容浏览器中,第2级模型不仅提供冒泡阶段,而且提供附加的捕获阶段(这个与冒泡阶段相反,是从最顶层父元素至下直到目标元素)。而这个的控制就在于addEventListener( eventType,listener,useCapture)中的useCapture参数,如果为false则建立冒泡型处理程序,如果为true则建立捕获型处理程序。
3.诡异的IE事件模型
IE不支持DOM第2级事件模型,但提供了与标准模型的冒泡阶段很类似的专用接口。
IE为每个DOM元素定义的方法是attachEvent( eventName,handler )方法。第一个参数是将要附加的事件模型,比如onclick;第二个参数是将被建立为处理程序的函数。
-
jQuery事件模型
jQuery事件模型最好的地方就在于除了不支持捕获事件外,其他的跟DOM第2级模型类似,而且用同一个API同时支持标准浏览器和IE
1. 利用jQuery绑定事件处理程序
bind(eventType,data,listener) //参数一为时间类型,参数二是调用者提供的数据(将作为event.data),可省略,参数三是方法
eg. $('img').bind('click', function(event){ alert( 'Hi! There!' )});
另外,还有事件指派命名空间。
例如页面的编辑模式和显示模式 $('#thing1').bind('click.editMode',someListener); $('#thing1').bind('click.editMode',someListener22);当页面离开编辑模式时应解除所有的绑定,可以利用 $('*').unbind('click.editMode');
特定的绑定事件: eventType(listener) 支持的命令如下:
- blur focus mousedown resize
- change keydown mousemove scroll
- click keypress mouseout select
- dbclick keyup mouseover submit
- error load mouseup unload
还提供bind()的特殊版本——one(eventType,data,listener) 是一次性的事件处理程序,一旦执行就自动消除
2. 删除事件处理程序
unbind(eventType,listener) 以及 unbind(event) //根据参数的不同来确定是删除特定的事件监听器还是全部的
3. Event实例
安全的Event实例属性
- altKey
- ctrlKey
- keyCode
- metaKey
- pageX
- pageY
- relatedTarget
- screenX
- screenY
- shiftKey
- target
- type
- which
4.影响事件传播
stopPropagation() 防止时间沿DOM树向上传播
preventDefault() 取消可能引起任何语义操作的时间,(包括<a>的加载href链接、表单提交以及click事件引起的状态切换)
如果想在停止事件传播的同时取消事件默认行为,可以返回false值
5.触发事件处理程序
trigger(eventType) 调用所有已匹配元素的、为传递事件类型而建立的任何事件处理程序。 此命令不会导致事件触发和通过DOM层的传播,因此不能通过event时间获取比如鼠标位置的值
简便的命令: eventName() 其中支持的是blur click focus select submit
6.其他事件相关命令
toggle(listenrOdd,listenerEven) 起切换作用的监听器,每当触发click时间就相互切换。 可用于根据元素被点击的次数切换元素的启用状态,譬如按钮
hover(overListener,ourListener) 在元素上方悬停鼠标指针 这个函数只关心鼠标离开元素的外部区域,而不关心是否进入内部区域的某个元素,减少了mouseover和mouseout的混乱情况
-
让事件(以及更多)工作起来
一个在线点菜的例子,可以从源代码的例子(例子可以在我的另一个学习元——“jQuery引荐” 中下载)中看到,这里不再写
另外,可以看到jQuery强大的选择器功能,页面上的每一个元素都可以通过选择器获得,但是个人感觉前提是页面的布局和div等的层次安排都需要经过精心的设计!
-
-
- 标签:
- 事件
- 时间
- 参数
- 39
- 元素
- 模型
- 处理
- 建立
- 程序
- event
-
学习元评论 (0条)
聪明如你,不妨在这 发表你的看法与心得 ~