美文网首页
事件相关

事件相关

作者: 盗花 | 来源:发表于2018-09-05 21:53 被阅读9次

1.for循环与事件的配合

初学者容易遇到的坑,将事件嵌入for循环中,实际执行时,确触发不了事件。
原示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.12.2.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
        }

        #box {
            border: 1px solid #cccccc;
            width: 360px;
            height: 70px;
            padding-top: 360px;
            margin: 100px auto;
            background: url("image/01big.jpg") no-repeat;
        }

        ul {
            display: flex;
            justify-content: center;
            align-items: center;
            cursor: pointer;
        }


    </style>

</head>
<body>
<div id="box">
    <ul>
        <li id="li01"><img src="image/01.jpg" alt=""></li>
        <li id="li02"><img src="image/02.jpg" alt=""></li>
        <li id="li03"><img src="image/03.jpg" alt=""></li>
        <li id="li04"><img src="image/04.jpg" alt=""></li>
        <li id="li05"><img src="image/05.jpg" alt=""></li>

    </ul>
</div>


<script>
    'use strict';
    var box = document.getElementById('box');
    var ul = document.getElementsByTagName('ul')[0];
    var liList = ul.getElementsByTagName('li');

    for (var i = 0; i < liList.length; i++) {
        var each_li = liList[i];
        each_li.onmouseover = function () {
            var url_li = 'url("image/0' + (i + 1) + 'big.jpg") no-repeat';
            console.log(url_li);
            box.style.background = url_li;
        }
    }


</script>

</body>
</html>

控制台的输出结果线束i已经等于5了,并且鼠标进入图片时,mouseover事件并不能触发。
修改代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.12.2.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
        }

        #box {
            border: 1px solid #cccccc;
            width: 360px;
            height: 70px;
            padding-top: 360px;
            margin: 100px auto;
            background: url("image/01big.jpg") no-repeat;
        }

        ul {
            display: flex;
            justify-content: center;
            align-items: center;
            cursor: pointer;
        }


    </style>

</head>
<body>
<div id="box">
    <ul>
        <li id="li01"><img src="image/01.jpg" alt=""></li>
        <li id="li02"><img src="image/02.jpg" alt=""></li>
        <li id="li03"><img src="image/03.jpg" alt=""></li>
        <li id="li04"><img src="image/04.jpg" alt=""></li>
        <li id="li05"><img src="image/05.jpg" alt=""></li>

    </ul>
</div>


<script>
    'use strict';
    var box = document.getElementById('box');
    var ul = document.getElementsByTagName('ul')[0];
    var liList = ul.getElementsByTagName('li');

    for (var i = 0; i < liList.length; i++) {
        var each_li = liList[i];
        each_li.index = i; // 注意此处是重点
        //下一行语句中用了this.index
        each_li.onmouseover = function () {
            var url_li = 'url("image/0' + (this.index + 1) + 'big.jpg") no-repeat';
            console.log(url_li);
            box.style.background = url_li;
        }
    }


</script>

</body>
</html>

注意上述代码中的each_li.index = i;var url_li = 'url("image/0' + (this.index + 1) + 'big.jpg") no-repeat';这两句,使得for循环中i的值能够及时保留到each_li.index中,后续this.index能够直接调用。

2.querySelectorAll与getElementsByTagName

document.querySelectorAll方法取得的元素可以使用forEach方法,用document.getElementsByTagName方法取得的元素不能使用forEach方法。(chrome中是这样)
示例:
使用document.getElementsByTagName方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.12.2.min.js"></script>
    <style>


    </style>

</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
<button>按钮6</button>


<script>
    'use strict';
    var btns = document.getElementsByTagName('button');
    btns.forEach(function (cur, index, arr) {
        cur.onclick = function () {
            console.log('这是第' + (index + 1) + '个按钮');
        }
    })


</script>

</body>
</html>

结果控制台报错


使用document.getElementsByTagName方法:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.12.2.min.js"></script>
    <style>


    </style>

</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
<button>按钮6</button>


<script>
    'use strict';
    var btns = document.querySelectorAll('button');
    btns.forEach(function (cur, index, arr) {
        cur.onclick = function () {
            console.log('这是第' + (index + 1) + '个按钮');
        }
    })


</script>

</body>
</html>

运行结果正常。
若要坚持使用document.getElementsByTagName方法,则可以使用闭包实现同样的功能。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.12.2.min.js"></script>
    <style>


    </style>

</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
<button>按钮6</button>


<script>
    'use strict';
    var btns = document.getElementsByTagName('button');
    for (var i = 0; i < btns.length; i++) {
        // 此处使用了闭包
        (function (jj) {
            btns[i].onclick = (function () {
                console.log('这是第' + (jj + 1) + '个按钮');
            })
        })(i);
    }

</script>

</body>
</html>

相关文章

  • 事件相关

    1、点击页面时,过滤某些元素的事件

  • 事件相关

    1.for循环与事件的配合 初学者容易遇到的坑,将事件嵌入for循环中,实际执行时,确触发不了事件。原示例如下: ...

  • 事件相关

    如何批量操作 css 如何获取 DOM 计算后的样式 使用getComputedStyle获取元素计算后的样式 实...

  • 事件相关

    事件相关功能函数,使用直接调取即可;事件绑定 事件解绑 获取事件对象 获取事件目标元素 阻止默认事件---->注意...

  • “滴滴事件”相关

    滴滴成长历程 •2012年6月,程维创办北京小桔科技有限公司,专注开发滴滴打车。开发初期,遭遇技术难题。同年年底,...

  • UIButton 相关事件

    ** UIControlEventTouchDown **单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时...

  • transition 相关事件

    事件介绍 transition 相关事件有 4 个: transitionend: 过渡结束后触发 transit...

  • js实现拖拽事件

    拖放事件 拖放是由拖动与释放两部分组成,拖放事件也分为被拖动元素的相关事件,和容器的相关事件。 被拖动元素的相关事...

  • Android事件管理源码剖析

    序言 最近在看Android触摸屏事件相关的源码,为了对整个事件体系的了解,所以对事件相关,从事件的产生,写入设备...

  • dataBinding 入门笔记

    Databinding 相关符号 相关文档 示例 点击事件 点击事件02 跳转方法 跳转方法(注解) 问题 inc...

网友评论

      本文标题:事件相关

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