【JS】APIs:事件流、事件委托、其他事件、页面尺寸、日期对象与节点操作

news2024/11/19 19:45:50

1 事件流

捕获阶段:从父到子

冒泡阶段:从子到父

1.1 事件捕获

<body>
<div class="fa">
  <div class="son"></div>
</div>
<script>
  const fa=document.querySelector('.fa');
  const son=document.querySelector('.son');
  // 事件捕获,从父到子;冒泡阶段:从子到父
  // 事件冒泡:默认,当一个元素触发事件,会依次调用父级元素的同级事件,比如'click'
document.addEventListener('click',function(){
alert('我是yeye')
},true)
fa.addEventListener('click',function(){
alert('我是father')
},true)
son.addEventListener('click',function(){
alert('我是son')
},true)
</script>
<!-- 结果:yeye->father->son -->
</body>

1.2 事件冒泡

<body>
<div class="fa">
  <div class="son"></div>
</div>
<script>
  const fa=document.querySelector('.fa');
  const son=document.querySelector('.son');
  // 事件冒泡:默认,当一个元素触发事件,会依次调用父级元素的同级事件,比如'click'
document.addEventListener('click',function(){
alert('我是yeye')
})
fa.addEventListener('click',function(){
alert('我是father')
})
son.addEventListener('click',function(){
alert('我是son')
})
</script>
//结果:son->father->yeye

1.3 阻止冒泡

son.addEventListener('click',function(e){
alert('我是son')
e.stopPropagation()
})
<!-- 结果:只有son的alert -->

1.4 阻止捕获

// 在yeye身上加,而不是在son的身上加
document.addEventListener('click',function(e){
alert('我是yeye')
e.stopPropagation()
},true)

1.5 解绑事件

<body>
<button>提交</button>
<script>
const btn=document.querySelector('button')
btn.onclick=function(){
  
}
// L0事件移除解绑
btn.onclick=null
function fn(){}
// 绑定事件
btn.addEventListener('click',fn)
// 解绑事件
// L2事件移除解绑
btn.removeEventListener('click',fn)
</script>
</body>

1.5 鼠标经过事件

1.6 两种注册事件区别

2 事件委托

2.1 事件委托

<body>
<ul>
  <li>1111111111</li>
  <li>2222222222</li>
  <li>3333333333</li>
  <span>66666666</span>
</ul>
<script>
  // 子元素没有绑定事件,但是冒泡到了父元素身上,点li跳出警告11
const ul=document.querySelector('ul')
ul.addEventListener('click',function(e){
  alert('11')
  // console.dir()可以显示一个对象所有的属性和方法
  // e.target是我们点击的那个对象
  console.dir(e.target)
  // 只点击li才有效果
  if(e.target.tagName==='LI')
  {
    e.target.style.color='red'
  }
})
</script>

2.2 Tab栏切换(用事件委托)

<body>
  <div class="tab">
    <div class="tab-nav">
      <h3>每日特价</h3>
      <ul>
        <li><a class="active" href="javascript:; " data-id="0">精选</a></li>
        <li><a href="javascript:;" data-id="1">美食</a></li>
        <li><a href="javascript:;" data-id="2">百货</a></li>
        <li><a href="javascript:;" data-id="3">个护</a></li>
        <li><a href="javascript:;" data-id="4">预告</a></li>
      </ul>
    </div>
    <div class="tab-content">
      <div class="item active"><img src="./image/tab00.png" alt="" /></div>
      <div class="item"><img src="./image/tab01.png" alt="" /></div>
      <div class="item"><img src="./image/tab02.png" alt="" /></div>
      <div class="item"><img src="./image/tab03.png" alt="" /></div>
      <div class="item"><img src="./image/tab04.png" alt="" /></div>
    </div>
  </div>
<script>
  const ul=document.querySelector('ul')
  const items=document.querySelectorAll('.item')
  ul.addEventListener('click',function(e){
    document.querySelector('.tab-nav .active').classList.remove('active')
    e.target.classList.add('active')
    // 下面大盒子模块
  // i是字符串型,'1'+1为'11'
  const i=+e.target.dataset.id
  document.querySelector('.tab-content .active').classList.remove('active')
   //document.querySelector(`.tab-content .item:nth-child(${ i + 1 })`).classList.add('active')
  //  第二种方法
  items[i].classList.add('active')
})
</script>
</body>

3 其他事件

3.1 阻止元素默认跳转

<a href="#">跳转</a>
</ul>
<script>
const a=document.querySelector('a')
a.addEventListener('click',function(e){
  // 不让你跳转
  e.preventDefault()
})
</script>

3.2 页面加载事件

<head>
  <meta charset="UTF-8">
  <script>
    // 当页面所有资源执行完毕,再去执行回调函数
    window.addEventListener('load',function(){
      const a=document.querySelector('a')
    a.addEventListener('click',function(e){
      e.preventDefault()
    })
    })
    // 当图片资源执行完毕,再去执行回调函数
    img.addEventListener('load',function(){
      const a=document.querySelector('a')
    a.addEventListener('click',function(e){
      e.preventDefault()
    })
    })
     // 给document加,当HTML文档被完全加载和解析执行完成(不等样式、图片加载完),再去执行回调函数
     document.addEventListener('DOMContentLoaded',function(){
      const a=document.querySelector('a')
    a.addEventListener('click',function(e){
      e.preventDefault()
    })
    })
    </script>
</head>

3.3 元素滚动事件

<body>
<script>
  // 可以读取,可以赋值
  window.addEventListener('scroll',function () {
    // document.documentElement获取html元素
    console.log(document.documentElement.scrollTop)
  })
</script>
</body>

注意不能少这句:

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

3.4 页面尺寸

getBoundingClientRect():

<body>
  <div></div>
  <script>
    const div=document.querySelector('div')
    // 返回元素的大小和距离视口的位置
    console.log(div.getBoundingClientRect());
  </script>

3.4 案例

3.4.1 仿新浪固定头部

 .header {
//修改
            top: -80px;
} 
<script>
        const sk=document.querySelector('.sk')
        const header=document.querySelector('.header')
        window.addEventListener('scroll',function(){
            const n=document.documentElement.scrollTop
            // if(n>=sk.offsetTop)
            // {
            //     header.style.top=0
            // }else{
            //     header.style.top='-81px'
            // }
            header.style.top=n>=sk.offsetTop?0:'-80px'
        })


        
    </script>

3.4.2 blibli点击小滑块移动效果

  <script>
    const list = document.querySelector('.tabs-list')
    const line = document.querySelector('.line')
    list.addEventListener('click', function (e) {
      if (e.target.tagName === 'A') {
        //translatex设置对象沿X轴平移
        line.style.transform = `translateX(${e.target.offsetLeft}px)`
      }
    })
  </script>

 过渡效果:

.suspension .channel-menu .tabs .tabs-list .line {
 
  transition: all 0.5s;
}

3.4.3 电梯导航

APIs-day3-114-综合案例-电梯导航案例上集_哔哩哔哩_bilibili

见资源包源码

4 日期对象

日期对象作用:获取系统时间

4.1 实例化

  <script>
    const n1=new Date()
    console.log(n1);
    const n2=new Date('2030-6-6')
    console.log(n2);
  </script>

4.2 日期对象方法

效果:

<body>
  <div></div>
  <script>
    // 获得现在的时间年月日时分秒
   const div=document.querySelector('div')
   const n1=new Date()
  function fn(){
    const n=new Date()
    let h=n.getHours()
    let m=n.getMinutes()
    let s=n.getSeconds()
    h=h<10?'0'+h:h
    m=m<10?'0'+m:m
    s=s<10?'0'+s:s
    // getMonth()取值0-11
    return `现在的时间是${n.getFullYear()}年:${n.getMonth()+1}月${n.getDate()}日:${h}:${m}:${s}`
  }
  div.innerHTML=fn()
  setInterval(() => {
    div.innerHTML=fn()
  }, 1000);2024/3/10 11:20:44
  //得到日期对象
 div.innerHTML=n1.toLocaleString()//2024/3/10 11:20:44
 div.innerHTML=n1.toLocaleDateString()//2024/3/10
 div.innerHTML=n1.toLocaleTimeString()//11:21:48
  </script>
</body>

4.3 时间戳

从1970.1.1到某个时间的毫秒数

将来的时间戳-现在的时间戳=剩余时间毫秒数

<script>
    const date=new Date()
    // 获取时间戳第一种方法
    console.log(date.getTime())
        // 获取时间戳第二种方法
        // new Date()本来是字符型,+''变为数字型
        console.log(+new Date());
        // 获取时间戳第三种方法,不需要实例化
        console.log(Date.now());
        const arr=['星期日','星期一','星期二','星期三','星期四','星期五','星期六']
        // getDay()返回的是0-6,如果今天是星期天,那就返回0
        console.log(arr[date.getDay()]);
  </script>

4.4 毕业倒计时案例

  <script>
   function getime(){
    const n=+new Date()
    const f=+new Date('2024-8-1 00:00:00')
    // 转换为秒数
    const t=(f-n)/1000
    let h=parseInt(t/60/60%24)
    h=h<10?'0'+h:h
    let m=parseInt(t/60%60)
    m=m<10?'0'+m:m
    let s=parseInt(t%60)
    s=s<10?'0'+s:s
    document.querySelector('#hour').innerHTML=h
    document.querySelector('#minutes').innerHTML=m
    document.querySelector('#sceond').innerHTML=s
   }
   getime()
   setInterval(getime,1000)
  </script>

5 节点操作

DOM树每一个内容都是一个节点

节点类型:元素节点、属性节点、文本节点

5.1 查找节点

5.1.1 查找父节点

<body>
  <div class="box">
    <div class="box1">1</div>
  </div>
  <div class="box">
    <div class="box1">2</div>
  </div>
  <div class="box">
    <div class="box1">3</div>
  </div>
  <script>
    const n=document.querySelectorAll('.box1')
    for(let i=0;i<n.length;i++)
    {
      n[i].addEventListener('click',function(){
        // display='none'消除盒子所占地方,从第一个开始关,下一个就顶上来
        // this.parentNode父节点查找
        this.parentNode.style.display='none'
      })
  }
  </script>
</body>

效果:点击一个,这一个就没有了

5.1.2 查找子节点

<body>
  <ul>
    <li><span>123</span></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul>
  <script>
    const ul=document.querySelector('ul')
    console.log(ul.children);//得到的是伪数组,仅获得所有元素节点
  </script>
</body>

5.1.3 查找兄弟节点

<body>
  <ul>
    <li><span>123</span></li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
  </ul>
  <script>
    const li3=document.querySelector('ul li:nth-child(3)')
     console.log(li3.previousElementSibling);//上一个兄弟
     console.log(li3.nextElementSibling);//下一个兄弟
  </script>
</body>

 

 5.2 增加节点

5.2.1 增加节点

<body>
  <ul>
    <li><span>123</span></li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
  </ul>
  <script>
    const ul=document.querySelector('ul')
    // 创建节点
    const lihou=document.createElement('li')
    lihou.innerHTML='我是创建的lihou'
    // 增加节点,插入到这个父元素的最后
     ul.appendChild(lihou)
    //  增加节点,插入到这个父元素指定位置之前
    const libef=document.createElement('li')
    libef.innerHTML='我是创建的libef'
    ul.insertBefore(libef,ul.children[0])
  </script>
</body>

 5.2.2克隆节点

<body>
  <ul>
    <li><span>123</span></li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
  </ul>
  <script>
    const ul=document.querySelector('ul')
    // cloneNode(true)深克隆表示ul.children[0]里面有什么东西全拿过来;(),(false)浅克隆只克隆标签
    ul.appendChild(ul.children[0].cloneNode())
  </script>
</body>

 

5.3 删除节点

<body>
  <ul>
    <li><span>123</span></li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
  </ul>
  <script>
    const ul=document.querySelector('ul')
    // 没有父子关系删除不成功
    ul.removeChild(ul.children[0])
  </script>
</body>

 

 6 swiper插件

Swiper中文网-轮播图幻灯片js插件,H5页面前端开发

7 学生信息表案例

APIs-day4-124-今日综合案例-学生信息表上集_哔哩哔哩_bilibili

代码见资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1507490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱

1 基本定义 移动中位数滤波算法是一种基于中位数的滤波方法&#xff0c;它通过对信号进行滑动窗口处理&#xff0c;每次取窗口内的中位数作为当前点的估计值&#xff0c;以去除噪声。该算法的主要思想是利用中位数的鲁棒性&#xff0c;对信号中的噪声进行有效的消除。 具体来说…

RocketMQ入门指南:从零开始学习分布式消息队列技术

RocketMQ 1. MQ介绍1.1 为什么要用MQ1.2 MQ的优点和缺点1.3 各种MQ产品的比较 2. RocketMQ快速入门2.1 准备工作2.1.1 下载RocketMQ2.2.2 环境要求 2.2 安装RocketMQ2.2.1 安装步骤2.2.2 目录介绍 2.3 启动RocketMQ2.4 测试RocketMQ2.4.1 发送消息2.4.2 接收消息 2.5 关闭Rocke…

【AIGC+VisionPro】空间视频生意的创业者

1. 产品概述 -一款基于人工智能的2D到3D视频/图像转换工具,可将普通的2D视频/图像转换为令人惊艳的3D视觉体验。 - 它支持在PC上进行转换,并输出适用于Meta Quest、Apple Vision Pro等XR设备的3D格式。 2. 产品功能 - 利用尖端的3D AI系统,可将任何视频(Youtube、电影、游戏、…

C++第一弹---C++入门(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 【C详解】 C入门 1、C关键字(C98) 2、命名空间 2.1、命名空间定义 2.2、命名空间使用 3、C输入&输出 4、缺省参数 4.1、缺省参数概念 4.2、缺省参…

《Ubuntu20.04环境下的ROS进阶学习0》

一、逛ROS应用商店 在上一专栏http://t.csdnimg.cn/oGlcu&#xff0c;我们了解了ROS的基本功能。这一专栏将会在此基础上做出进一步拓展学习。那么首先我们要学会下载并阅读别人的代码。常用的两个应用商店一个是ROS的官方应用商店ROS index&#xff0c;另一个就是我们熟知的gi…

基于SpringBoot+MYSQL的房屋租赁系统

1、 前言介绍 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c…

学校Java的第七天

目录 一、什么是数组 二、作用 三、如何使用数组 1、声明数组变量 2、创建数组 示例&#xff1a; 3、数组的使用 示例&#xff1a; 4、数组的遍历 for循环示例&#xff08;不知道for循环的可以查看我之前发的文章&#xff09; for-each循环&#xff08;也就是增强for…

Visual Studio单步调试中监视窗口变灰的问题

在vs调试中&#xff0c;写了这样一条语句 while((nfread(buf, sizeof(float), N, pf))>0) 然而&#xff0c;在调试中&#xff0c;只要一执行while这条语句&#xff0c;监视窗口中的变量全部变为灰色&#xff0c;不能查看&#xff0c;是程序本身并没有报错&#xff0c;能够继…

每日OJ题_链表⑤_力扣25. K 个一组翻转链表

目录 力扣25. K 个一组翻转链表 解析代码 力扣25. K 个一组翻转链表 25. K 个一组翻转链表 难度 困难 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总…

2024-03-10 c++

&#x1f338; MFC下拉框控件 | Combo Box eg 计算器 1。新建MFC项目&#xff08;基于对话框、静态库&#xff09; 2。添加控件&#xff0c;删除初始的3个多余控件 加3个edit control 加1个combo box&#xff0c;属性sort改为false&#xff0c;data为 ;-;;;% 加1个static text…

invoke()到底是个什么方法???

调用jquery的方法返回属性值 1、invoke&#xff08;‘val’&#xff09; 在form的select下&#xff1a; cy.get(.action-select-multiple).select([apples, oranges, bananas])// when getting multiple values, invoke "val" method first jquery中val方法是用于返…

【c语言 】 函数入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

笔记 mysql text 不能设置他的默认值如not null

mysql text 不能设置他的默认值 那么插入时默认值是多少&#xff1f; 在 MySQL 中&#xff0c;TEXT 类型的字段不能直接指定默认值 因此&#xff0c;如果你尝试在创建表时为 TEXT类型的字段指定默认值&#xff0c;MySQL 会抛出错误。 然而&#xff0c;虽然不能在表定义中为 TE…

2024年腾讯云优惠券_云服务器代金券_优惠折扣整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

【零基础学习01】嵌入式linux驱动中pinctrl和gpio子系统实现

大家好,为了进一步提升大家对实验的认识程度,每个控制实验将加入详细控制思路与流程,欢迎交流学习。 今天给大家分享一下,linux系统里面pinctrl和gpio子系统控制实验,操作硬件为I.MX6ULL开发板。 第一:pinctrl和gpio子系统简介 Linux系统是一个庞大又完善的系统,如果采用…

matlab 基操~

MATLAB基本操作 1. 对象定义 使用sym定义单个对象、使用syms定义多个对象 2. 使用limit求极限 $$ \lim_{v \rightarrow a} f(x) $$ limit(f,v,a) % 使用limit(f,v,a,left)可求左极限 3. 导数 使用diff(f,v,n)对$ f(v)v^{t-1} $求 $ n $ 阶导 $ \frac{d^nf}{d^nv} $&#xf…

【题解】—— LeetCode一周小结10

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结9 4.用栈实现队列 题目链接&#xff1a;232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a…

一文了解原型和原型链

本文重点概念&#xff1a; 1、所有的对象都是new一个函数创建的 2、所有的函数都有一个属性prototype&#xff0c;称为函数原型 3、函数原型得到的这个对象都有一个属性constructor,指向该函数 4、所有的对象都有一个属性&#xff1a;隐式原型__proto__&#xff0c;隐式原型…

计算机网络—OSPF单区域配置

目录 目录 1.实验环境准备 2.配置 OSPF 3.验证 OSPF 配置 4.修改 OSPF hello 和 dead 时间参数 5.OSPF缺省路由发布及验证 6.控制 OSPF DR/BDR 的选举 7.配置文件 拓扑图&#xff1a; 1.实验环境准备 基本配置以及IP编址。 <Huawei>system-view Enter system vi…

Python中的运算符介绍

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…