博客列表 >JS事件的理解、留言板功能的实现-2019/7/12

JS事件的理解、留言板功能的实现-2019/7/12

降落伞的博客
降落伞的博客原创
2019年07月12日 18:12:06737浏览

1、理解事件

  • 事件触发可以是鼠标、键盘、系统。

  • 常见的事件属性有:keydown, keyup, keypress(常用),mouseover, mouseout,click(常用) ,setInterval,setTimeout,clearInterval,clearTimeout……

  • 事件捕获阶段就是指浏览器在执行某个元素的事件时,其实是从外到内去寻找这个元素,先占到最外面的父元素、再找里面的子元素。

  • 找到以后就会到触发阶段,也就是执行,如果从里到外都有事件,就从最里面开始执行,最后执行外面,也就是冒泡阶段。

2、通过实践了解事件的特点

  • 通过元素属性添加一个事件的多次执行,只会成功执行一个。

  • 通过监听器可以为某个元素的添加一个事件的多次执行,会按顺序依次执行。

  • 事件委托就是利用冒泡原理,让子元素委托父元素来触发它的事件。(也叫事件代理)

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <button id="btn1">点击试试看</button>
        <button id="btn2">点击试试看</button>
    </div>
    <div>
        <ul id="ul">
            <li>item1</li>
            <li>item2</li>
            <li>item3</li>
            <li>item4</li>
            <li>item5</li>
        </ul>
    </div>
    <script>
        var b1=document.getElementById('btn1');
        /*事件属性是click,通过元素属性的形式添加事件,加上了on,所以写成onclick*/
        b1.onclick = function (event) {
            alert('第一次点击');  /*此时只有一个事件,能成功执行*/
        };
        b1.onclick = function (event) {
            alert('第二次点击');  /*此时有两个时间,只会执行第二个*/
        };
        /*也就是说,通过元素属性添加多个事件时,只会成功执行最后一个*/
        /*并且是在冒泡阶段执行,也就是优先执行最里面的事件*/

        /*那么如何同时添加多个事件呢,并且让所有事件依次触发? 利用addEventListener方法*/
        var b2=document.getElementById('btn2');
        b2.addEventListener('click',function (event) {
            alert('第一次点击');
        },false);/*addEventListener方法 有三个参数,1是事件属性 2是函数 3是代表捕获阶段or冒泡阶段,false是冒泡阶段*/
        b2.addEventListener('click',function (event) {
            alert('第二次点击');
        },false);
        b2.addEventListener('click',function (event) {
            alert('第三次点击');
        },false);
        /*点击b2以后, 会依次按顺序弹出三个框,也就是关闭第一个,弹出第二个,关闭第二个,弹出第三个*/

        /*如何快捷地给所有的li元素添加事件?利用事件冒泡原理:
        * 所有子元素li的事件都会冒泡到其父元素ul上,所以我们可以给ul加上一个监听器*/
        var ull=document.getElementById('ul');
        ull.addEventListener('click',function (event) {
            alert('我被点击了');
            event.currentTarget; /*这是ul*/
            event.target;/*这是li*/
        },false);
        /*这就是事件代理,父元素代理了子元素的事件;也就事件推脱,子元素委托父元素来触发它的事件*/
    </script>  <!--注意,要把script代码写到</body>前面,DOM之后
    由于html页面由上向下解析执行, 执行到js时, 还没有发现下面的html元素,就不会生效
    如果坚持把scri写在DOM之前, 就放在window.onload = function () {  ..... }中-->
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

3、留言板的留言添加和删除

  • 理解留言的添加和删除原理,就是往ul添加子元素和删除子元素。

  • 灵活运用event.currentTarget,将其理解为谁添加事件,我们利用冒泡原理为父元素ul添加了 一个监听事件,所以这是ul。

  • 灵活运用event.target,将其理解为触发事件的元素,在监听事件上定义的触发行为是click,click之后就会执行监听事件里面的函数del,谁被点击了会执行这个函数,所以这个target可以理解成按钮。

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>留言板制作</title>
    <style>
        #comment{
            width: 400px;
            height: 100px;
            border: 5px solid chartreuse;
            position: absolute;
            top: 30px;
        }
        p{
            position: relative;
        }
        #label{
            position: absolute;
            left:150px;
        }
        ul{
            position: absolute;
            top: 150px;
        }
    </style>
</head>
<body>
    <p>
        <label for="comment" id="label">有意见请反馈:</label>
        <input type="text" id="comment"  autofocus>
        <ul id="list"></ul>
    </p>

    <script>
        var comment = document.getElementById('comment'); /*获取到留言输入框*/
        var list = document.getElementById('list');/*获取到留言列表*/
        comment.addEventListener('keypress',addCom,false);
        function addCom(event) {
            /*event.key 是当前用户按下去的键*/
            if (event.key === 'Enter') {   /*判断是否按下 回车键*/
                /*1、添加新留言这个元素*/
                var li = document.createElement('li'); /*创建一个新的li元素*/
                /*2、把文本框的输入值 赋给新元素,同时加上删除按钮*/
                // li.innerText = comment.value; /*把文本框的内容赋给新元素li,这是直接赋值文本内容*/
                li.innerHTML = comment.value +' <button>删除</button>';
                /*innerHTML可以解析超文本标记语言,识别到 添加按钮的意思*/
                /*button的父元素是li*/
                /*3、把最新添加的留言始终显示在最前面*/
                if (list.childElementCount === 0) {  /*如果list没有子元素,也就是没有内容*/
                    list.appendChild(li);/*把新元素添加到ul中*/
                } else {
                    list.insertBefore(li,list.firstElementChild); /*把新元素li添加到目前的第一个子元素之前*/
                }
                comment.value = null; /*清空文本框*/
            }
        }
        /*4、删除一条留言,利用事件委托,让父元素ul来监听是否有删除按钮的点击事件*/
        list.addEventListener('click',del, false);
        /*删除留言的函数*/
        function del(event) {
            /*event.currentTarget,指添加事件的元素,也就是往哪个元素上添加事件,我们是往父元素ul上添加监听事件*/
            // console.log(event.currentTarget); 输出<ul>元素
            /*event.target,指触发事件的元素,也就是哪个按钮被点击了 触发了del这个函数*/
            // console.log(event.target);输出button元素
            // confirm(): 确定对话框, 点确定返回true,点取消返回false
            if (confirm('是否删除?')) {  /*弹出确认对话框,确认的话会执行下列操作*/
                event.currentTarget.removeChild(event.target.parentElement);
                /*我们针对ul这个元素,移除它的子元素
                * 哪个子元素呢?按钮的父元素,也就是li*/
            }
        }
    </script
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例



声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议