zoukankan      html  css  js  c++  java
  • 23.事件对象

    事件对象
     
    学习要点:
    1.事件对象
    2.鼠标事件
    3.键盘事件
    4.W3C与IE
     
     
    JavaScript事件的一个重要方面时它们拥有一些相对一致的特点,可以给你的开发提供更强大的功能,最方便和强大的
    就是事件对象,它们可以帮你处理鼠标事件和键盘敲击方面的情况,此外还可以修改一般事件的捕获/冒泡流的函数。
     
    一、事件对象
    事件处理函数的一个标准特性是,以某种方式访问的事件对象包含有关于当前事件的上下文信息。
    事件处理三部分组成:对象.事件处理函数=函数。例如:单击文档任意处。
     
    document.onclick = function(){
    alert('journey');
    };
     
    PS:以上程序的名词解释:click表示一个事件类型,单击。onclick表示一个事件处理函数或绑定对象的属性(或者叫
    事件监听、侦听器)。document表示一个绑定的对象,用于触发某个元素区域。function()匿名函数是被执行的函数,
    用于触发后执行。
     
    除了用匿名函数的方式作为被执行的函数,也可设置成独立的函数。
    document.onclick = box; //直接赋值函数名即可,无须括号
    function box(){
    alert('journey');
    };
     
    this关键字和上下文
    在面向对象那章我们了解到:在一个对象里,由于作用域的关系,this代表着它最近对象。
     
    var input = document.getElementsByTagName('input')[0];
    input.onclick = function(){
    alert(this.value); //HTMLInputElement,this表示input
    };
     
     
    从上面的拆分,我们并没有发现本章的重点;事件对象,那么事件对象是什么?它在哪里呢?当触发某个事件时,
    会产生一个事件对象,这个对象包含着所有与事件有关的信息。
    包括导致事件的元素、事件的类型、以及其他与特定事件相关的信息。
    事件对象,我们一般称为event对象,这个对象是浏览器通过函数把这个对象作为参数传递过来的。那么首先,我
    们就必须验证一下,在执行函数中没有传递参数,是否可以得到隐藏的参数。
     
     
    function box(a,b){
    alert(arguments.lenght); //获取参数的值
    };
    box(4,5)
     
    window.onload = function(){
    document.onclick = function(){
    alert(arguments.lenght); //如果是事件处理函数绑定的函数,浏览器会默认传递一个参数,这个参数就是event对象
    }
    }
     
    window.onclick = function(){
    document.onclick = function(){
    alert(arguments[0]); //MouseEvent,鼠标事件对象
    }
    document.onkeydown =function(){
    alert(arguments)[0]; //KeyboardEvent,键盘事件对象
    }
    }
     
    通过上面两组函数中,我们发现,通过事件绑定的执行函数是可以得到一个隐藏参数的。说明,浏览器会自动分配
    一个参数,这个参数其实就是event对象。
    input.onclick = function(){
    alert(arguments[0]); //MouseEvent,鼠标事件对象
    };
     
    上面这种做法比较累,那么比较简单的做法是,直接通过接收参数来得到即可。
    input.onclick = function(evt){ //接受event对象,名称不一定非要event
    alert(evt); //MouseEvent,鼠标事件对象
    }
     
    直接接收event对象,是W3C的做法,IE不支持,IE自定义了一个event对象,直接在window.event获取即可。
    input.onclick = function(evt){
    var e = evt || window.event; //实现跨浏览器兼容获取event对象
    alert(e);
    };
     
    二、鼠标事件
    鼠标事件时Web上面最常用的一类事件,毕竟鼠标还是最主要的定位设备。那么通过事件对象可以获取到鼠标按钮
    的信息和屏幕坐标获取等。
     
     
    1.鼠标按钮
    只有在主鼠标按钮被单击时(常规一般是鼠标左键)才会触发click事件,因此检测按钮的信息并不是必要的。但对于
    mousedown和mouseup事件来说,则在其event对象存在一个button属性,表示按下或释放按钮。
     
    非IE(W3C)中的button属性
    说明
    0 表示主鼠标按钮(常规一般是鼠标左键)
    1 表示中间的鼠标按钮(鼠标滚轮按钮)
    2 表示次鼠标按钮(常规一般是鼠标右键)
     
     
    IE中的button属性
    说明
    0 表示没有按下按钮
    1 表示主鼠标按钮(常规一般是鼠标左键)
    2 表示次鼠标按钮(常规一般是鼠标右键)
    3 表示同时按下了主、次鼠标按钮
    4 表示按下了中间的鼠标按钮
    5 表示同时按下了主鼠标按钮和中间的鼠标按钮
    6 表示同时按下了次鼠标按钮和中间的鼠标按钮
    7 表示同时按下三个鼠标按钮
     
     
    PS:在绝大部分情况下,我们最多只使用主次中三个单击键,IE给出了其他组合键一般无法使用上。所以,我们只
    需要做上这三种兼容即可。
     
     
    window.onload =function(){
    document.onmouseup = function(event){
    if(getButton(event) == 0) alert('左键');
    if(getButton(event) == 1) alert('中键');
    if(getButton(event) == 2) alert('右键');
    }
    }
     
    //跨浏览器鼠标按钮
    function getButton(event){
    var e = event || window.event;
    if(event){
    return e.button;
    }else if(window.event){
    switch(e.button){
    case 1;
    return 0;
    case 4:
    return 1;
    case 2;
    return 2;
    case 0;
    return 2;
    }
    }
    }
     
     
    2.可视区及屏幕坐标
    事件对象提供了两组来获取浏览器坐标的属性,一组是页面可视区的左边,另一组是屏幕坐标。
     
    坐标属性
    属性 说明
    clientX 可视区X坐标,距离左边框的位置
    clientY 可视区Y坐标,距离上边框的位置
    screenX         屏幕区X坐标,距离左屏幕的位置
    screenY         屏幕区Y坐标,距离上屏幕的位置
     
    document.onclick = function(event){
    var e = event || window.event;
    alert(e.clientX + '.' + e.clientY);
    alert(e.screenX + ',' + e.screenY);
    };
     
     
    3.修改键
    有时,我们需要通过键盘上的某些键来配合鼠标来触发一些特殊的事件。这些键为:Shift、Ctrl、Alt和Meat(
    Window中就是Windows键,苹果机中是Cmd键),它们经常被用来修改鼠标事件和行为,所以叫修改键。
     
    修改键属性
    属性 说明
    shiftKey 判断是否按下了Shift键
    ctrlKey 判断是否按下了Ctrl键
    altKey 判断是否按下了alt键
    metaKey 判断是否按下了windows键,IE不支持
     
    function getKey(event){
    var e = event || window.event;
    var keys = [];
     
    if(e.shiftKey)keys.push('shift'); //给数组添加元素
    if(e.ctrlKey)keys.push('ctrl');
    if(e.altKey)keys.push('alt');
     
    return keys;
    }
     
    window.onload = function(){
    document.onclick=function(event){
    alert(getKey(event));
    }
    }
     
     
    三、键盘事件
    用户在使用键盘时会触发键盘事件。DOM2级事件最初规定了键盘事件,结果有删除了相应的内容。最终还是使用
    最初的键盘事件,不过IE9已经率先支持DOM3级键盘事件。
     
    1.键码
    在发生keydown和keyup事件时,event对象的keyCode属性中会包含一个代码,与键盘上一个特定的键对应。对
    数字字母字符集,keyCode属性的值与ASCII码中对应小写字母或数字的编码相同。字母中大小写不影响。
     
    document.onkeydown = function(event){
    alert(event.keyCode); //按任意键,得到相应的keyCode
    };
     
    不同的浏览器在keydown和keyup事件中,会有一些特殊的情况:
    在Firefox和Opera中,分号键时keyCode值为59,也就是ASCII中分号的编码;而IE和Safari返回186,即键盘中按
    键的键码。
    PS:其他一些特殊情况由于浏览器版本太老和市场份额太低,这里不做补充
     
     
     
     
    2.字符编码
    Firefox、Chrome和Safari的event对象都支持一个charCode属性,这个属性只有发生keypress事件时才包含值,
    而且这个值是按下的那个键所代表字符的ASCII编码。此时的keyCode通常等于0或者也可能等于所按键的编码。
    IE和Opera则是在keyCode中保存字符的ASCII编码。
    function getCharCode(event){
    var e = event || window.event;
    if(typeof e.charCode == 'number'){
    return e.charCode;
    }else{
    return e.keyCode;
    }
    }
     
     
     charCode在使用keypress的情况下,Firefox会返回字符键盘的编码,支持大小写
    IE和Opera不支持charCode这个属性
     
    一般情况下 我们不管非字符键盘,基本上处理的都是字符按键
     
     
    做一下兼容:
    window.onload=function(){
    document.onkeypress = function(event){
    alert(getCharCode(event));
    }
    }
    function getCharCode(event){
    var e = event || window.event;
    if(typeof e.charCod == 'number'){
    return e.charCod;
    }else{
    return e.keyCode;
    }
    }
     
     
     
     
    PS:可以使用String.fromCharCode()将ASCII编码转换成实际的字符。
     
     
    keyCode和charCode区别如下:比如当按下a键(重视是小写的字母)时,在Firefox中会获得
    keydown:keyCode is 65 charCode is 0
    keyup:keyCode is 65 charCod is 0
    keypress:keyCode is 0 charCode is 97
     
     
    在IE中会获得
    keydown:keyCode is 65 charCode is undefined
    keyup:keyCode is 65 charCode is  undefined
    keypress:keyCode is 97 charCode is undefined
     
    而当按下shirt键时,在Firefox中会得到
    keydown:keyCode is 16 charCode is undefined
    keyup:keyCode is 16 charCode is undefined
     
     
    keypress:不会获得任何的charCode值,因为按shift并没有输入任何的字符,并且也不会触发keypress事件
     
    PS:在keypress事务里面,事务包含了keyCode - 用户按下的按键的物理编码。在keypress里,keyCode包含了
    字符编码,即默示字符的ASCII码,如许的情势实用于所有浏览器 - 除了火狐,它在keypress事务中的keyCode
    返回值为0。
     
     
     
     
     
    四、W3C与IE
    在标准的DOM事件中,event对象包含与创建它的特定事件有关的属性和方法,触发的事件类型不一样,可用的属
    性和方法也不一样。
     
     
    W3C中event对象的属性和方法
     
    属性和方法 类型 读/写 说明
    bubbles Boolean 只读 表明事件是否冒泡
    cancelable Boolean 只读 表明是否可以取消事件的默认行为
    currentTarget         Element 只读 其事件处理程序当前正在处理事件的 那个元素
    datail Integer 只读 与事件相关的细节信息
    eventPhase Integer 只读                                 调用事件处理程序的阶段:1.表示捕获阶段2.表示“处理目标”3.表示冒泡阶段
    preventDefault()         Function 只读 取消事件的默认行为。如果cancelabel是true,则可以使用这个方法
    stopPropagation()                 Function 只读 取消事件的进一步捕获成冒泡。如果bubbles为true,则可以使用这个方法
    target Element 只读 事件的目标
    type String 只读 被触发的事件类型
     
    IE中event对象的属性
     
    属性 类型 读/写 说明
    cancelBubble Boolean 读/写 默认值为false,但将其设置为true就可以取消事件冒泡
    returnValue Boolean         读/写 默认值为true,但将其设置为false就可以取消事件的默认行为
    srcElement Element 只读 事件的目标
    type String 只读 被触发的事件类型
     
    在这里,我们只看所有浏览器都兼容的属性或方法,首先第一个我们了解一下W3C中的target和IE中的srcElement,
    都表示事件的目标。
     
    function getTarget(event){
    var e = event || window.event;
    return e.target || e.srcElement; //兼容得到事件目标DOM对象
    }
     
    document.onclick = function(event){
    var target = getTarget(event);
    alert(target);
    }
     
     
    事件流
    事件流是描述的从页面接受事件的顺序,当几个都具有事件的元素层叠在一起的时候,那么你点击其中一个元素,
    并不是只有当前被点击的元素会触发事件,而层叠在你点击范围的所有元素都会触发事件,事件流包括两种模式:
    冒泡和捕捉。
     
    事件冒泡,是从里往外逐个触发。事件捕捉,是从外往里逐个触发。那么现代的浏览器默认情况下都是冒泡模型,
    而捕获模式则是早期的Netscape默认情况,而现在的浏览器要使用DOM2级模型的事件绑定机制才能手动定义事件
    流模式。
    Document
    Document html
    Document body
    Document div
    Document input
    向下捕获 向上冒泡
     
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
    <link rel="stylesheet" href="">
    </head>
    <body>
    <div id="box" style="100px; height:100px; background:red">
    <input type="button" value="按钮" />
    </div>
    </body>
    </html>
     
     
     
    window.onload = function(){
    document.onclick = function(){
    alert('document');
    }
    document.documentElement.onclick = function(){
    alert('html');
    }
    document.body = function(){
    alert('body')
    }
    document.getElementById('box').onclick =function(){
    alert('div');
    }
    document.getElementsByTagName('input') = function(event){
    alert('input');
    var e = event || window.event;
    e.stopPropagation(); //W3C取消冒泡
    e.cancelBubble = true; //IE取消冒泡
    setStop(event);
    }
    //document.querySelector('input').onclick=function(){
    alert('input');
    }
    //document.querySelectorAll('input')[0].onclick=function(event){
    alert('input');
    }
    }
    在阻止冒泡的过程中,W3C和IE采用的不同的方法,那么我们必须做一下兼容。
     
    function setStop(event){
    var e = event || window.event;
    window.event?e.cancelBubble == true : e.stopPropagation();
    }
    或者用:
    function setStop(event){
    var e = event || window.event;
    (typeof e.stopPropagation == 'function') ? e.stopPropagation() : e,cancelBubble = true;
    }
  • 相关阅读:
    LC 357. Count Numbers with Unique Digits
    LC 851. Loud and Rich
    LC 650. 2 Keys Keyboard
    LC 553. Optimal Division
    LC 672. Bulb Switcher II
    LC 413. Arithmetic Slices
    LC 648. Replace Words
    LC 959. Regions Cut By Slashes
    Spring框架学习之注解配置与AOP思想
    Spring框架学习之高级依赖关系配置(二)
  • 原文地址:https://www.cnblogs.com/journey-IT/p/6367682.html
Copyright © 2011-2022 走看看