事件对象及兼容处理

一、什么是事件?

//1.什么是事件?
//->事件分为两部分:
//1)行为本身:浏览器天生就赋予其的行为 onclick、onmouseover、(onmouseenter)
//onmouseout(onmouseleave)、onmousemove、onmouseup、onmousedown、onmousewheel
//(鼠标滚轮滚动行为)、onscroll(滚动条滚动行为)、onresize(window.onresize 浏览器的
//窗口大小改变事件)、onload、onunload、onfocus(文本框获取焦点行为)、onblur(文本框
//失去焦点行为)、onkeydown、onkeyup(键盘的按下和抬起行为)
//->哪怕我没有给上述的行为绑定方法,事件也是存在的。当我们点击这个盒子的时候,
//同样会触发它的onclick行为,只是什么事情也没做而已。

//2)事件绑定:给元素的某一个行为绑定方法
var oDiv = document.getElementById("div1");

//onclick这个行为定义在当前元素的私有属性上
oDiv.onclick = function () {
    //->当我们触发oDiv的click行为的时候,会把绑定的这个函数执行
};

//->false是什么意思?
//->这是第二种绑定的方法
oDiv.addEventListener("click", function () {
    console.log('ok');
}, false);

//addEventListener 这个属性是定义在当前元素所属EventTarget这个类的原型上的
//可以通过原型链机制去查找

//onclick 是DOM0级事件绑定
//addEventListener是DOM2级事件绑定

二、事件对象及兼容处理

<div id="div1"></div>
<script>
  
    var oDiv = document.getElementById("div1");

    //->我们是把匿名函数定义的部分当做一个值赋值给oDiv的点击行为(函数表达式)
    //->当我们触发#div1的点击行为的时候,会执行对应绑定上的方法
    //->重要:不仅仅把绑定的方法执行了,而且浏览器还默认的给这个方法传递了一个参数值
    //叫做 MouseEvent, 叫做鼠标事件对象,是一个对象属性类型的值
    //1)它是一个对象数据类型的值,里面包含了很多的属性名和属性值,这些都是用来记录当前鼠标
    //的相关信息的
    //clientX 和 clientY 是鼠标触发的,离屏幕的x和y轴的距离
    //2)MouseEvent,往上找是UIEvent, 然后是Event, 最后是Object
    //这是它的原型链

    //3)MouseEvent记录的是页面中唯一一个鼠标每一次触发时候的相关信息,和到底是
    //在哪个元素上触发的没有关系
    // oDiv.onclick = function(){
    //     console.dir(arguments);
    // };
    // document.body.onclick = function(e){
    //     console.dir(e); //MouseEvent
    // };


    //2.关于事件对象MouseEvent的兼容问题

    //->传进来这个e,在iE9以上才有
    //->在IE6,7,8时,e是不会传进去的
    //->window.event谷歌下也有,IE6,7,8下也有,但是火狐下没有window.event
    //->但是IE6,7,8下只能用window.event
    //而IE9,谷歌,火狐等标准浏览器,e都是可以用的
    oDiv.onclick = function (e) {
        console.dir(e);

        //->IE6,7,8下是存在window.event里面的
        console.dir(window.event);
    };


    //->1)事件对象本身的获取存在兼容问题:
    //标准浏览器中是浏览器给方法传递的参数,
    //我们只需要定义形参e就可以获取到。
    //在IE6~8中浏览器不会给方法传递参数e,我们如果需要的话,
    //在IE6,7,8下只能用window.event中获取查找

    //->处理兼容的办法
    oDiv.onclick = function (e) {
        //如果左边为false, 就走右边的值
        //在IE6,7,8下,不会传递参数e, 那么e就没有,就是undefined
        //走的就是右边
        e = e || window.event;

        //e.clientX / e.clientY: 当前鼠标触发点距离当前屏幕左上角的
        //x/y轴的坐标值

        //e.type : 存储的是当前鼠标触发的行为类型 比如"click"

        //e.target: 它叫事件源,当前鼠标触发的是哪一个元素,那么它存储的就是哪一个元素

        //e.pageX / e.pageY : 当前鼠标触发点距离body左上角(页面第一屏幕最左上端)的x/y轴的坐标

        //e.preventDefault: 阻止浏览器的默认行为
        //什么叫默认行为?
        //e.preventDefault在IE6,7,8下没有这个方法,需要用e.returnValue=false;来代替
        //这样写:
        e.preventDefault ? e.preventDefault() : e.returnValue = false;

        //第二种写法:
        //return false;

        //第三种写法:
        // <a href="javascript:;"></a>
        // 或者
        // <a href="javascript:void 0;"></a>


        //->e.stopPropagation:阻止事件的冒泡传播,在IE6,7,8中不兼容
        //在IE6,7,8中使用e.cancelBubble = true;来代替
        // e.stopPropagation();

        //这样写:
        e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
    };


    document.body.onclick = function (e) {
        e = e || window.event;
        //事件源,在IE6,7,8下也有问题, e.target 在IE6,7,8下是 undefined
        //在IE6,7,8下不是用e.target来获取事件源的,只能用e.srcElement
        //在IE6,7,8下只能用e.srcElement来获取事件源

        //如果e.target存在,就用这个值,否则就用e.srcElement
        e.target = e.target || e.srcElement;
        console.log(e.target);


        //e.clientY 在IE6,7,8下存在,而e.pageY 在IE6,7,8下不存在,是undefined
        //在IE6,7,8中,没有e.pageY 这个属性
        //在IE6,7,8中,我们通过使用clientY + 滚动条卷去的高度来获取页面
        console.log(e.clientY); //287, 是距离当前屏的左上角
        console.log(e.pageY); //1087, 是距离第一屏最左上角

        e.pageX = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
        e.pageY = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));

    };

</script>

三、键盘事件

<input type="text" id="input1">
var input1 = document.getElementById("input1");
//键盘按下抬起事件
input1.onkeyup = function (e) {
    e = e || window.event;
    //e不一定是MouseEvent,还有可能是KeyboardEvent(键盘事件)
    console.log(e); //KeyboardEvent (键盘事件)

    //有哪些键盘事件:
    //->e.keyCode:当前键盘上每一个按键对应的值
    //几个常用的:空格(32) , 回退按键(BackSpace)->8, 回车按键(Enter)为13
    //删除按键(Del)为46, 四个方向键:左(37) , 上(38), 右(39), 下(40)
    console.log(e.keyCode);
};

document.body.onkeyup = function (e) {
    e = e || window.event;
    console.log(e.keyCode);
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值