博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript之事件(一)
阅读量:5967 次
发布时间:2019-06-19

本文共 4623 字,大约阅读时间需要 15 分钟。

事件流

事件流描述的是页面接收事件的顺序.IE的事件流是冒泡流,而 Netscape Communicator的事件流是事件捕获流.

事件冒泡是指事件开始时由最具体的元素,然后向上传播到较为不具体的节点.所有现代浏览器都支持事件冒泡,IE9,Firefox,chrome,safari则将事件一直冒泡到window对象.

事件捕获是不太具体的节点应该更早接收到事件,而具体的节点应该最后接收到事件.

DOM事件流

DOM2级事件流规定的事件流包括三个阶段: 事件捕获阶段 处于目标阶段 事件冒泡阶段

事件处理程序

HTML事件处理程序

on+事件名(例如onclick)作为事件目标的属性,属性值为事件处理程序,在html中定义的事件处理程序可以包含要执行的具体动作,也可以调用页面其他地方定义的脚本.

function showMessage(){    alert("Hello world!");}

DOM0级事件处理程序

DOM0级事件处理程序是在js中处理的,它的优势是简单,目前所有浏览器支持良好,并且不会与html代码产生耦合.

var btn =  document.getElementById('btn'); btn.onclick  = function(){     alert('clicked me!'); };

这里是把事件处理程序赋值给了DOM对象的属性,这个属性的构成是on+事件名,比如onclick`onblur`onload.

DOM2级事件处理程序

DOM2级事件定义了两个方法addEventListener removeEventListener,这两个方法都接收三个参数.第一个参数代表事件类型;第二个参数代表事件处理程序;第三个参数是指在冒泡阶段还是捕获阶段处理事件处理程序,如果为true代表捕获阶段处理,如果是false代表冒泡阶段处理.

IE9,google,Firefox兼容DOM2级事件处理程序.

var btn = document.getElementById('btn');        //事件处理程序    function handler(){        alert('click!');    }        //注册事件处理程序    addEventListener('click',handler,false);        //注销事件处理程序    removeEventListener('click',handler,false);

注:添加匿名事件处理程序无法被注销

IE事件处理程序

IE8及以下浏览器不支持DOM2级事件处理程序,但也自己定义了attachEvent`detachEvent`两个方法,这两个方法只接受两个参数,因为IE8及以下版本不支持事件捕获,所以没有第三个参数.

var btn = document.getElementByID("btn");    //事件处理程序    function handler(){        alert('click!');    }        //注册事件处理程序    attachEvent('click',handler,false);        //注销事件处理程序    detachEvent('click',handler,false);

跨浏览器的事件处理程序

综合以上几种事件处理程序,我们封装出了一个跨浏览器的事件处理程序对象.

var EventUtil ={            //注册事件处理程序        addEventHandler:function(element,type,handler){                    if(element.addEventListener){                element.addEventListener(type,handler,false);            }                        else if(element.attachEvent) {                element.attachEvent('on'+type,handler);            }                        else{                element['on'+type]=handler;            }        },                //注销事件处理程序        removeEventHandler: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;            }        }    };    var btn = document.getElementById('btn'),            handler=function(event){                alert(this.value);            };    EventUtil.addEventHandler(btn,'click',handler);

事件对象

在触发DOM的某个事件时,会产生一个事件对象,这个对象包含着所有与事件相关的信息。包括导致事件的元素,事件的类型,以及其他与特定事件相关的信息.例如鼠标操作导致的事件对象中,包含鼠标位置的信息,键盘定义的事件中包含按下键相关的信息.所有浏览器支持event对象,但支持方式不同.

DOM中的事件对象

兼容DOM的浏览器会将一个event对象传入到事件处理程序中.DOM0和DOM2都会传入event. html事件处理程序也有event对象.

var btn = document.getElementById("btn");  btn.onclick = function(event){     alert(event.type); }  btn.addEventHandler('click',function(event){     alert(event.type); },false);

触发的事件类型不一样,可用的属性和方法也不一样.不过所有事件的event对象都有公共成员,这里列出几个常用的属性和方法.

  1. 属性

    currentTarget 指向某个元素,事件处理程序发生在此元素上
    target 事件的目标
    type 事件类型
    eventPhase 事件所处阶段

  2. 事件

    preventDefault() 取消事件的默认行为
    stopPropagation() 取消事件的进一步冒泡或捕获
    在事件处理程序内部,对象this始终等于currentTarget的值.而target则只包含事件的实际目标.

IE中的事件对象

使用DOM0级事件处理程序时,event对象作为window对象的一个属性存在;

使用attachEvent()事件处理程序时,event对象作为参数传入.

跨浏览器的事件对象

var EventUtil = {    //添加事件    addEventHandler:function(element,type,handler){        if(element.addEventListener){            element.addEventListener(type,handler,false);        }        else if(element.attachEvent) {            element.attachEvent('on'+type,handler);        }        else{            element['on'+type]=handler;        }    },        //移除事件    removeEventHandler: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;        }    },        //获取事件对象    getEvent: function (event) {        return event ? event : window.event;    },        //获取事件目标    getTarget:function(event){        return event.target || event.srcElement;    },        //阻止默认行为    preventDefault:function(event){        if(event.preventDefault){            event.preventDefault();        }        else{            event.returnValue = false;        }    },        //阻止事件冒泡    stopPropagation:function(event){        if(event.stopPropagation)        {            event.stopPropagation();        }        else{            event.cancelBubble=true;        }    }};

使用以上定义的EventUtil对象,可以在所有浏览器中进行进行事件的添加,移除,获取事件对象,获取事件目标,阻止事件冒泡,阻止事件默认行为.

转载地址:http://uxqax.baihongyu.com/

你可能感兴趣的文章
Web前端开发必备:《Jquery实战》第3版 介绍
查看>>
为AD用户启用或禁用OCS 2007 R2帐户
查看>>
JNDI数据源的连接属性
查看>>
.NET重构—单元测试重构
查看>>
linux route命令深入浅出与实战案例精讲
查看>>
Azure Remoteapp 使用指南
查看>>
【翻译】Ext JS最新技巧——2014-8-13
查看>>
Powershell批量修改用户的UPN后缀
查看>>
Exchange Server 2016管理系列课件53.DAG管理之设置滞后数据库副本
查看>>
cocos2d-x学习笔记16:记录存储1:CCUserDefault
查看>>
创业做什么好?先学习精英式创业从平庸到卓越
查看>>
降低网站跳出率的六个方法(亲身使用)
查看>>
Lync Server 2010的部署系列(四) outlook无法加入联机会议
查看>>
CentOS5.8下varnish-2.1.5的安装配置
查看>>
社群分享:涨粉的35个玩法和技巧
查看>>
大数据为智慧城市建设添砖加瓦
查看>>
OpenStack看到中国“钱”景
查看>>
POJ 2828 Buy Tickets
查看>>
刷新系统托盘(清除死掉的图标)修正版
查看>>
一个简易实用的web权限管理模块的应用与实现
查看>>