JavaScript 事件

事件

如何绑定事件处理函数:

1.ele.onxxx = funcyion(event){}

  • 兼容性很好,但是一个元素的同一个事件上只能绑定一个处理程序
  • 基本等于写在HTML行间上

2.obj.addEventListener(type,fn,false);

  • IE9以下不兼容,可以为一个事件绑定多个处理程序

3.obj.attachEvent(‘on’+type,fn);

  • IE独有,一个事件同样可以绑定多个处理程序

4.小练习

举例详细说明前三个属性:
1.例如:

<body>
    <div style = "width:100px;height:100px;background-color:red;"></div>
    <script type="text/javascript">
        var div = document.getElementsByTagName('div')[0];
        div.onclick = function() {
            console.log('a');
        }
        div.onclick = function() {
            console.log('b');
        }
    </script>
</body>

此时一个元素的一个事件绑定了两个处理程序,是不会同时生效的,后面的会覆盖前面的。

2.三个参数(事件类型,处理函数,false)
例子:

<body>
    <div style = "width:100px;height:100px;background-color:red;"></div>
    <script type="text/javascript">
        var div = document.getElementsByTagName('div')[0];
        div.addEvenListener {'click',function() {
            console.log('a');
        },false);
        div.addEvenListener {'click',function() {
            console.log('b');
        },false);        

    </script>
</body>
//a b

此时一个元素的一个时间可以绑定多个处理程序,而且会按照顺序进行;同一个函数不可以绑定多次。

3.两个参数(’on’+事件类型,处理函数);
例子:

<body>
    <div style = "width:100px;height:100px;background-color:red;"></div>
    <script type="text/javascript">
        var div = document.getElementsByTagName('div')[0];
        div.attachEven {'onclick',function() {});

    </script>
</body>
//a b

一个元素的一个事件可以绑定多个处理程序,而且会按照顺序进行;同一个函数可以绑定多次。

4.练习:

<ul>
    <li>a<li>
    <li>a<li>
    <li>a<li>
    <li>a<li>
</ul>

使用原生js,addEventListener,给每个li元素绑定一个click事件,输出他们的顺序。

<body>
    <ul>
    <li>a<li>
    <li>a<li>
    <li>a<li>
    <li>a<li>
    </ul>
    <script type="text/javascript">
        var liCol = document.getElementsByTagName('li');
            len = liCol.length;
        for(var i = 0;i < len;i++) {  //会形成闭包,此时需要用立即执行函数
            (function(i){
                liCol[i].addEvenListener('click',function() {
                    console.log(i);
                },false);
            }(i))
        }

    </script>
</body>
1 2 3 4 

对此题目的思考:要注意绑定事件,一但事件出现在了循环里面,就要注意有没有形成闭包。

事件处理程序的运行环境:

1.ele.onxxx = funcyion(event){}

  • 程序this指向是dom元素本身

2.obj.addEventListener(type,fn,false);

  • 程序this指向是dom元素本身

3.obj.attachEvent(‘on’+type,fn);

  • 程序this指向window

4.封装兼容性的addEvent(elem,type,handle);方法,来处理不同浏览器的兼容方法(addEvent:给一个dom对象添加一个该事件类型的处理函数)

<body>
    <div style = "width:100px;height:100px;background-color:red;"></div>
    <script type="text/javascript">
     function addEvent(elem,type,handle) {
        if(elem.addEventListener) {
            elem.addEvenListener(type,handle,false);
        }else if(elem.attachEvent) {
            elem.attachEvent('on' + type,function() {
                handle.call(elem);
                })
            }else{
                elem['on'+type] = handle;
            }
    }
    </script>
</body>

解除事件处理程序

  • ele.onclick = false/”/null;
  • ele.removeEvenListener(type,fn,false);
  • ele.detachEvent(‘on’+type,fn); //fn表示函数的引用
  • 注:若绑定匿名函数,则无法解除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值