DOM初探(22)——如何绑定事件处理函数

如何绑定事件处理函数:
1.ele.onxxx = function(event){}

     兼容性很好,但是一个元素的同一事件上只能绑定一个处理程序

     基本上等同于写在HTML行间上

2.obj.addEventListener(事件类型,处理函数,false);

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

3.obj.attachEvent(“on”+事件类型,fn);

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

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>abraham</title>
    </head>
    <body>
        <div style="width:100px;height:100px;background-color:red"></div>
        <script type="text/javascript">
            var div = document.getElementsByTagName("div")[0];
            div.addEventListener("click",function(){
                console.log("123");
            },false)
        </script>
    </body>
</html>

每点击一次方块,执行一次console.log(“123”);事件有一个时刻监听的机制,在那里等着,一旦点我,我就执行,这种事件监听机制需要消耗精力,所以不能是JS引擎干的吧!也是第三部分其他部分做的。

这样写是两个123.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>abraham</title>
    </head>
    <body>
        <div style="width:100px;height:100px;background-color:red"></div>
        <script type="text/javascript">
            var div = document.getElementsByTagName("div")[0];
            div.addEventListener("click",function(){
                console.log("123");
            },false)
            div.addEventListener("click",function(){
                console.log("123");
            },false)
        </script>
    </body>
</html>

再看这样写:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>abraham</title>
    </head>
    <body>
        <div style="width:100px;height:100px;background-color:red"></div>
        <script type="text/javascript">
            var div = document.getElementsByTagName("div")[0];
            div.addEventListener("click",test,false);
            div.addEventListener("click",test,false);
            function test(){
                console.log("123");
            }
        </script>
    </body>
</html>

点一次执行出来一个123.

这两个程序是两回事

addEventListener能给同一个对象的同一个事件绑定多个处理函数,是这两个的处理函数的地址是不一样的,长得一样,地址不一样。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>abraham</title>
    </head>
    <body>
        <div style="width:100px;height:100px;background-color:red"></div>
        <script type="text/javascript">
            var div = document.getElementsByTagName("div")[0];
            div.attachEvent("onclick",function(){
                console.log("123");
            });
        </script>
    </body>
</html>

IE独有。

 

 

练习44

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

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

(当你点击第一个li的时候输出0,点击第二个li的是时候输出1…或者点击第一个li的时候输出1,点击第二个li的时候输出2.。。)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>abraham</title>
    </head>
    <body>
        <ul>
            <li>a</li>
            <li>a</li>
            <li>a</li>
            <li>a</li>
        </ul>
        <script type="text/javascript">
            var liCol = document.getElementsByTagName("li");
            var len = liCol.length;
            for(var i = 0; i < len; i ++){
                liCol[i].addEventListener("click",function(){
                    console.log(i);
                },false);
            }
        </script>
    </body>
</html>

是不是这样写,绑定个事件,点哪个出哪个li的序号,多么正确的想法啊!

怎么看着怎么对,但是,你看:

点哪个li都是4!!是闭包吧,你想把i贴到元素上去,贴不上吧,事件相当于把这个函数放到属性上,但是什么时候执行这个函数不好说吧,至少是for循环结束以后,

for循环结束以后的那个i已经变成4了,所以怎么解决这个问题,立即执行函数吧!!

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>abraham</title>
    </head>
    <body>
        <ul>
            <li>a</li>
            <li>a</li>
            <li>a</li>
            <li>a</li>
        </ul>
        <script type="text/javascript">
            var liCol = document.getElementsByTagName("li");
            var len = liCol.length;
            for(var i = 0; i < len; i ++){
                (function(i){
                    liCol[i].addEventListener("click",function(){
                        console.log(i);
                    },false);
                }(i))
            }
        </script>
    </body>
</html>

这样就完事了吧!所以这里绑定事件要记住:一旦你这个事件出现在了循环里面你就要考虑是否形成了闭包!如果你这个绑定事件的处理函数里面没有用到i的话,那随便。

猜你喜欢

转载自blog.csdn.net/hdq1745/article/details/88345168