事件节点案例

131 阅读1分钟

事件节点案例

二维码-点击关闭(多个)

关闭多个的,就是找通过parentNode找到父元素,隐藏父元素,那么子元素自然也隐藏不见了,还有获取到父元素下的每个子元素遍历,一个个关闭


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background-color: yellowgreen;
            margin: 100px auto;
            text-align: right;

        }
    </style>
</head>

<body>
    <div><img src="./1.png" alt=""></div>
    <div><img src="./1.png" alt=""></div>
    <div><img src="./1.png" alt=""></div>
    <div><img src="./1.png" alt=""></div>

    <script>
        /* 
1 先处理好静态结构
2 先获取到关闭按钮 数组 
3 遍历数组 给关闭按钮 绑定 点击事件
4 事件触发了 
     通过  this 获取到 对应的父元素  隐藏
*/
        let i = document.querySelectorAll("img")
        // 遍历
        for (let index = 0; index < i.length; index++) {
            i[index].addEventListener("click", function () {
                // this 获取到 对应的父元素  隐藏
                this.parentNode.style.display = "none";//多个关闭和单个不同的是dom元素名换成this仅仅代表关闭自己就可以了
            })

        }
    </script>
</body>

</html>

二维码-点击关闭(单个)

单个关闭,就是找通过parentNode找到父元素,隐藏父元素,那么子元素自然也隐藏不见了

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>09-二维码-点击关闭.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <div>
      <img class="close-btn" src="./images/2.png" alt="">
      <img src="./images/1.png" alt="">
    </div>
    <script>
      // 1 获取 关闭 标签
      let closeBtn=document.querySelector(".close-btn");

      // 2 点击事件
      closeBtn.addEventListener("click",function () {
        // 3 是 当前点击的元素的  父元素
        // console.log(this.parentNode);
        this.parentNode.style.display="none"; // 隐藏父元素 
        
      })
    </script>
  </body>
</html>

移动点菜的案例(1)

就是将左边的东西点击的时候放到右边(缺点不可以放回来)

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>14-剪切-移动.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      body {
        display: flex;
        justify-content: space-between;
        padding: 100px;
      }
      ul {
        width: 300px;
      }
      .left {
        background-color: yellow;
      }
      .right {
        background-color: blueviolet;
      }
    </style>
  </head>
  <body>
    <ul class="left">
      <li>龙虾</li>
      <li>鲍鱼</li>
      <li>皇帝蟹</li>
      <li>鱼子酱</li>
    </ul>
    <ul class="right"></ul>

    <script>
      /* 
      1 获取到左侧所有的li标签
      2 遍历 绑定点击事件
        appendChild 
        父元素.appendChild(要插入的元素-点击了谁)
       */
      let lis = document.querySelectorAll('li');
      let right = document.querySelector('.right');
      for (let index = 0; index < lis.length; index++) {
        lis[index].addEventListener('click', function () {
          right.appendChild(this);
        });
      }
    </script>
  </body>
</html>

移动点菜的案例(2)

就是将左边的东西点击的时候放到右边,可以放回来(缺点必须全部放过去才能拿回来)

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>14-剪切-移动.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      body {
        display: flex;
        justify-content: space-between;
        padding: 100px;
      }
      ul {
        width: 300px;
      }
      .left {
        background-color: yellow;
      }
      .right {
        background-color: blueviolet;
      }
    </style>
  </head>
  <body>
    <ul class="left">
      <li>龙虾</li>
      <li>鲍鱼</li>
      <li>皇帝蟹</li>
      <li>鱼子酱</li>
    </ul>
    <ul class="right"></ul>

    <script>
      /* 
      问题
      1 移动的方向不确定  
        在判断 点击时候  先判断 哪个ul标签的子元素的长度为 0  就移动到谁哪里
       */

      let lis = document.querySelectorAll('li');

      let left = document.querySelector('.left');
      let right = document.querySelector('.right');

      // 准备要插入新元素的  父元素
      let parent;

      for (let index = 0; index < lis.length; index++) {
        lis[index].addEventListener('click', function () {
          // 先判断当前要插入到哪个标签中 谁的子元素长度为0 就插入到谁哪里
          // right.appendChild(this);
          if (right.children.length === 0) {
            // 现在要插入到右边
            parent = right;
          }
          if (left.children.length === 0) {
            parent = left;
          }

          parent.appendChild(this);
        });
      }
    </script>
  </body>
</html>

移动点菜的案例(3)

将上面所说的都解决了,可以随时拿过来拿过去

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>14-剪切-移动.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      body {
        display: flex;
        justify-content: space-between;
        padding: 100px;
      }
      ul {
        width: 300px;
      }
      .left {
        background-color: yellow;
      }
      .right {
        background-color: blueviolet;
      }
    </style>
  </head>
  <body>
    <ul class="left">
      <li>龙虾</li>
      <li>鲍鱼</li>
      <li>皇帝蟹</li>
      <li>鱼子酱</li>
    </ul>
    <ul class="right"></ul>

    <script>
      /* 
       要插入到哪里 不确定

       1 获取被点击的元素的父元素
         left > 皇帝蟹  this.parentNode 
       2 父元素之后 和 left 或者 right比较
        如果 被点击的父元素  不等于 right ,设置 要插入的父元素 = right 
        如果 被点击的父元素  不等于 left ,设置 要插入的父元素 = left 
      
       */

      let lis = document.querySelectorAll('li');
      let left = document.querySelector('.left');
      let right = document.querySelector('.right');

      let parent;

      for (let index = 0; index < lis.length; index++) {
        lis[index].addEventListener('click', function () {
            //常规写法
          // if (this.parentNode !== right) {
          //   parent = right;
          // }
          // if (this.parentNode !== left) {
          //   parent = left;
          // }
                  //三元表达式简写
          parent = this.parentNode !== right ? right : left;

          parent.appendChild(this);
        });
      }
    </script>
  </body>
</html>

微博输入保存案例

就是文本域显示字数和限制字数加点发布把内容新建存起来

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        ol {
            width: 500px;
        }
    </style>

</head>

<body>
    <div class="w">
        <div class="controls">
            <!-- <img src="images/tip.png" alt=""><br> -->
            <textarea placeholder="说点什么吧..." id="area" cols="30" rows="10" maxlength="1000"></textarea>
            <div>
                <span class="useCount">0</span>
                <span>/</span>
                <span>1000</span>
                <button id="send">发布</button>
            </div>

        </div>
        <div class="contentList">
            <ol>

            </ol>
        </div>
    </div>
    <script>
        let area = document.querySelector("#area")
        let useCount = document.querySelector(".useCount")
        let fa = document.querySelector('#send')
        let ul = document.querySelector("ol")
        area.addEventListener("input", function () {
            //字符串长度的值赋予显示字数
            useCount.innerText = area.value.length;
            //限制字数,有点小bug,复制粘贴的话,本身被复制的字数不算在限制里面
            // if (area.value > 200) {
            //     area.value = area.value.slice(0, 200)
            // }
        })
        //作业要求:1.点击发布的时候文本域显示字数  2.点发布的时候输出的文字生成一个存放的标签,同时清空文本域
        //思路:文本域早上做过了,直接c+v,点击发布的时候生成存放的标签,先写按钮点击事件,在里面写标签生成和插入,然后百度怎么清空文本域,,最后把早上的计算文本域字数的代码再复制丢进去就可以了,用ol还可以有序排列
        //发布按钮点击事件
        fa.addEventListener("click", function () {
            //创建一个新的li标签
            let li = document.createElement("li")
            //插入li标签
            ul.appendChild(li)
            //把文本域里面的内容(value:文本域属性)赋予li
            li.innerText = area.value
            //函数清空文本域里面的文字
            area.value = area.value.slice(0, 0)
            //把文本域的字符串长度的值赋予左边span标签的字数显示
            useCount.innerText = area.value.length;

        })

    </script>
</body>

</html>