美文网首页
JS事件对象

JS事件对象

作者: 哪树繁花 | 来源:发表于2017-09-19 22:16 被阅读17次

    概念

    当某个对象触发了某种事件时,所发生的一切详细信息保存在一个临时的地方,这个地方叫做事件对象(黑匣子)

    获取事件对象

    要考虑兼容
    标准浏览器:通过事件触发函数的第一个形参获得
    arguments:伪数组,接收函数调用时所传递的所有实参
    IE9以下:通过内置的全局对象window.event获得

    兼容:
    oDiv.onclick = function(event){
    var e = event || window.event;
    };

    使用事件对象

    获取鼠标按键的编码
    event.button
    oDiv.onmousedown = function(event){
        //var e = event || window.event;
        //console.log(e.button);
    
        console.log(getButton(event));
    };
    //兼容
    function getButton(event){
        var e = event || window.event;
        if(e){
            return e.button;
        } else if(window.event) {
            switch(e.button){//  IE左中右键值为 1 4 2
                case 1:return 0;
                case 4:return 1;
                case 2:return 2;
            }
        }
    }
    
    获取鼠标坐标值

    可视区坐标值
    event.clientX, event.clientY
    相对坐标值
    event.offsetX, event.offsetY
    绝对坐标值(页面坐标值)
    event.pageX, event.pageY
    屏幕坐标值
    event.screenX, event.screenY

    获取键盘的编码
    onkeydown/onkeyup  //监听整个键盘
        event.keyCode  //字母的大写的值
    onkeypress
        event.keyCode //火狐返回0,google和IE可区分字母大小写
        event.charCode, event.which//火狐,google可区分大小写,IE不识别
    兼容
    oDiv.onkeypress = function(event){
        var e = event || window.event;
        var keyValue = e.keyCode || e.charCode || e.which;
        return keyValue;
    }
    

    组合键(表示按住这些键的同时)
    event.ctrlKey, event.shiftKey, event.altKey
    demo:

    document.onclick = function(event){
      event = event || window.event;
      if(event.ctrlKey){
        alert("hello");//按住 ctrl 的时候点击鼠标  
      }
    };
    document.onkeydown = function(event){
      event = event || window.event;
      var key = event.keyCode || event.charCode || event.which;
      if(event.shiftKey && event.key == 13){
        alert("你同时按下了shift 和 enter(回车)");
      }
    };
    

    事件流(系统默认采用事件冒泡)

    事件捕获(IE,opera不支持)

    由祖先节点依次向他的子节点依次传递事件的过程

    事件冒泡

    由子节点一次向他的祖先节点传递事件的过程,成为事件冒泡,如果那个祖先节点有事件触发函数,则执行该函数。具体表现为,我在一个子元素上添加了一个点击事件,他的所有父级元素上也都添加了点击事件,当我点击这个子元素的时候,程序会依次从子元素逐级向上调用点击事件。下面的 demo 里会依次弹出:btn , box , body

    阻止事件冒泡

    e.stopPropagation();//只有标准能用
    e.cancelBubble = true;//都能用
    demo:

    <div id="box">
        <input id="btn" type="button" >
    </div>
    <script type="text/javascript">
        /*
        事件冒泡
        清除事件冒泡:
        e.stopPropagation();IE不能用
        e.cancelBubble();都能用,但还是要做兼容(滑稽~)
        e.cancelBubble?e.cancelBubble = true : e.stopPropagation();
         */
        var btn = document.getElementById("btn");
        var box = document.getElementById("box");
        btn.onclick = function(event){
    
            var e = event || window.event;
            //e.cancelBubble = true;
            //e.stopPropagation();
            e.cancelBubble?e.cancelBubble = true : e.stopPropagation();
                alert("btn");
            };
            box.onclick = function(){
                alert("box");
            };
            document.body.onclick = function(){
                alert("body");
        };
    
    </script>
    

    相关文章

      网友评论

          本文标题:JS事件对象

          本文链接:https://www.haomeiwen.com/subject/mgvgsxtx.html