6.2 JavaScript Apis - 事件流

6.2 JavaScript Apis -事件流、事件委托

文章目录

  • 6.2 JavaScript Apis -事件流、事件委托
  • 一、事件流
    • 1.1 事件捕获
    • 1.2 事件冒泡
    • 1.3 阻止冒泡
    • 1.4 解绑事件
    • 1.5 阻止默认行为
  • 二、事件委托
    • 2.1 介绍
    • 2.2 tab栏切换改造
  • 三、其他事件
    • 3.1 页面加载事件
      • 3.1.1 load 事件
      • 3.1.2 DOMContentLoaded
    • 3.2 页面滚动事件
      • 3.2.1 滚动显示侧边栏、
      • 3.2.2 快速回顶部
      • 3.2.3 scrollTo()
    • 3.3 页面尺寸事件
  • 四、元素尺寸与位置

一、事件流

事件流指的是事件完整执行过程中的流动路径

事件流分为两种,第一种是捕获,第二种是冒泡

捕获可以看做是从大了往小了,冒泡可以看做是从小的往大的

image-20240723142825520

说明:假设页面里面有一个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段

捕获阶段是从父到子,冒泡阶段是从子到父

实际工作都是使用事件冒泡为主

1.1 事件捕获

从DOM的根元素开始去执行对应的事件(从外到里)

事件捕获需要写对应的代码才能看到效果

DOM.addEventListener(事件类型,事件处理函数,是否使用捕获机制)

addEventListener第三个参数传入true代表是捕获阶段触发,但是这种情况很少使用

若使用L0事件监听,则只有冒泡阶段,没有捕获

效果:当我们点击紫色的div框(son)的时候,会依次执行爷爷、爸爸、儿子,这个其实就是事件流动,事件的捕获。这些盒子绑定的事件会依次执行

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    .father{
        width: 500px;
        height: 500px;
        background-color: pink;
    }
    .son{
        width: 200px;
        height: 200px;
        background-color: purple;
    }
  </style>
</head>
<body>
<div class="father">
  <div class="son"></div>
</div>
<script>
  const fa = document.querySelector('.father')
  const son = document.querySelector('.son')
  //document是最大的DOM对象
  document.addEventListener('click', function() {
    alert('我是爷爷')
  },true)
  fa.addEventListener('click', function() {
    alert('我是爸爸')
  },true)
  son.addEventListener('click', function() {
    alert('我是儿子')
  },true)
</script>
</body>
</html>

1.2 事件冒泡

实际工作是以冒泡为主

当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中一次被触发。这一个过程被称为事件冒泡

默认情况下,冒泡一定会发生的,只不过之前发生的时候我们没有看到任何的效果

下面这种情况,就是事件冒泡

正好与事件捕获反着来,依次执行儿子、爸爸、爷爷

DOM.addEventListener(事件类型,事件处理函数)
DOM.addEventListener(事件类型,事件处理函数,false)

当一个元素触发事件后,会依次向上调用所有父级元素的同名事件

父级都会执行一次同名的事件类型操作

比如儿子执行的是click事件,那爸爸、爷爷也会执行click事件

L2事件监听第三个参数时false,或者默认都是冒泡

1.3 阻止冒泡

有时候冒泡并不好,我们要进行阻止冒泡。

问题:默认有冒泡模式的存在,所以容易导致事件影响到父级元素

需求:若想把事件限制在当前元素内,就需要阻止事件冒泡

前提:阻止事件冒泡需要拿到事件的对象

语法

事件对象.stopPropagation()

注意:此方法可以阻断事件流动传播,不光在冒泡阶段有效,捕获阶段也有效

示例

son.addEventListener('click', function(e) {
  e.stopPropagation()
  alert('我是儿子')
})

1.4 解绑事件

  • L0 on事件方式,直接使用null覆盖就可以实现事件的解绑

语法

//绑定事件
btn.onclick=function(){
    alert('点击了')
}
//解绑事件 赋值空对象即可
btn.onclick=null

我们现在很少用这种事件绑定方式了

  • **L2 addEventListener事件解绑方式 **
//这个函数需要专门的拿出来
function fn(){
     alert('点击了')
}
//绑定事件
btn.addEventListener('click',)
//解绑事件
btn.removeEventListener('click',fn())

注意!匿名函数无法被解绑

1.5 阻止默认行为

我们在某些情况下,需要阻止默认行为的发生,比如阻止链接的跳转或者表单域跳转等

语法

事件对象.preventDefault()
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<form action="http://www.itcast.cn">
  <input type="submit" value="免费注册">
</form>
<a href="http://www.baidu.com"></a>
<script>
  const form = document.querySelector('form')
  form.addEventListener('submit', function(e) {
    //阻止默认行为
    e.preventDefault()
  })
  const a = document.querySelector('a')
  a.addEventListener('click', function(e) {
    //阻止默认行为
    e.preventDefault()
  })
</script>
</body>
</html>

二、事件委托

2.1 介绍

事件冒泡有一个非常好的用途,就是事件委托,事件委托其实是一种技巧

事件委托是利用事件流的特征解决一些开发需求的知识技巧

优点:减少注册次数,提高程序性能

原理:事件委托其实是利用事件冒泡的特点

给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事件

如果同时给多个元素注册事件,我们之前使用的是for循环注册事件,那有没有一种技巧注册一次事件就能完成以上效果呢

我们点击的li,但是li上没有真正的点击事件,此时会事件冒泡到父级元素ul上,ul上会有点击事件

image-20240723153927415

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<ul>
  <li>1个孩子</li>
  <li>2个孩子</li>
  <li>3个孩子</li>
  <li>4个孩子</li>
  <li>5个孩子</li>
  <p>我不需要变色</p>
</ul>
<script>
  //点击每个小li,当前li文字变为红色
  //使用事件委托的方式
  //1.获取父级元素
  const ul = document.querySelector('ul')
  ul.addEventListener('click', function(e) {
    //这里的this指的是ul,不是li,所以我们要使用事件对象获取到对应的第几个li
    //e.target其实就是我们点击的对应的元素对象
    if (e.target.tagName === 'LI') {
      e.target.style.color = 'red'
    }
  })
</script>
</body>
</html>

效果如下图所示:

image-20240723171141329

2.2 tab栏切换改造

需求:优化程序,将tab切换案例改为事件委托写法

tab栏的事件委托,我们委托给ul即可

image-20240723171927581

<!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>tab栏切换</title>
  <style>
      * {
          margin: 0;
          padding: 0;
      }

      .tab {
          width: 590px;
          height: 340px;
          margin: 20px;
          border: 1px solid #e4e4e4;
      }

      .tab-nav {
          width: 100%;
          height: 60px;
          line-height: 60px;
          display: flex;
          justify-content: space-between;
      }

      .tab-nav h3 {
          font-size: 24px;
          font-weight: normal;
          margin-left: 20px;
      }

      .tab-nav ul {
          list-style: none;
          display: flex;
          justify-content: flex-end;
      }

      .tab-nav ul li {
          margin: 0 20px;
          font-size: 14px;
      }

      .tab-nav ul li a {
          text-decoration: none;
          border-bottom: 2px solid transparent;
          color: #333;
      }

      .tab-nav ul li a.active {
          border-color: #e1251b;
          color: #e1251b;
      }

      .tab-content {
          padding: 0 16px;
      }

      .tab-content .item {
          display: none;
      }

      .tab-content .item.active {
          display: block;
      }
  </style>
</head>

<body>
<div class="tab">
  <div class="tab-nav">
    <h3>每日特价</h3>
    <ul>
      <!--自定义属性 "data-"开头的属性,获取的时候使用 元素对象.dataset.id获取即可 -->
      <li><a data-id="0" class="active" href="javascript:;">精选</a></li>
      <li><a data-id="1" href="javascript:;">美食</a></li>
      <li><a data-id="2" href="javascript:;">百货</a></li>
      <li><a data-id="3" href="javascript:;">个护</a></li>
      <li><a data-id="4" href="javascript:;">预告</a></li>
    </ul>
  </div>
  <div class="tab-content">
    <div class="item active"><img src="./images/tab00.png" alt=""/></div>
    <div class="item"><img src="./images/tab01.png" alt=""/></div>
    <div class="item"><img src="./images/tab02.png" alt=""/></div>
    <div class="item"><img src="./images/tab03.png" alt=""/></div>
    <div class="item"><img src="./images/tab04.png" alt=""/></div>
  </div>
</div>

<script>
  //采取事件委托的形式 tab栏切换
  //1.获取ul父元素 因为ul只有一个
  const ul = document.querySelector('.tab-nav ul')
  // 获取 5个 item
  const items = document.querySelectorAll('.tab-content .item')
  //2.给ul添加事件
  ul.addEventListener('click', function(e) {
    //我们只有点击了a标签后,才会进行排查
    //e.target.tagName 是点击对象的标签名
    if (e.target.tagName === 'A') {
      //首先先移除原来的active,当前元素添加active
      document.querySelector('.tab-nav .active').classList.remove('active')
      //当前的A标签添加active
      e.target.classList.add('active')

      //下面的大盒子模块
      //我们在data-id后面加引号了,取过来的是一个字符串,会导致${i + 1}出现错误,所以我们首先得把其改为字符串类型
      const i = +e.target.dataset.id
      console.log(i)
      //移除大盒子的active
      document.querySelector('.tab-content .active').classList.remove('active')
      //对应的大盒子添加active
      //document.querySelector(`.tab-content .item:nth-child(${i + 1})`).classList.add('active')
      items[i].classList.add('active')
    }
  })
</script>
</body>
</html>

三、其他事件

3.1 页面加载事件

3.1.1 load 事件

加载外部资源(如图片、外联CSS、JavaScript等),加载完毕时触发的事件

我们目前是把JavaScript的代码写在了body标签的最底部,但是其实也可以写在head标签中

  • 事件名:load

  • 监听页面所有资源加载完毕

给window添加load事件(window代表着整个窗口)

最大的事window,其次是document

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>

  <script>
    //给window添加load事件
    //等待页面所有资源加载完毕,就会执行回调函数
    window.addEventListener('load', function() {
      const btn = document.querySelector('button')
      btn.addEventListener('click', function() {
        alert('你好')
      })
    })

  </script>
</head>
<body>
<button>点击</button>
</body>
</html>
  • 注意!不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件

等待某个图片加载完成后,就会执行回调函数

    img.addEventListener('load',function(){
      //等待图片加载完毕
    })

3.1.2 DOMContentLoaded

当初始的HTML文档被完全加载和解析完成后,DOMContentLoaded事件被触发,而无需等待样式表、图像等完全加载

load是监听整个页面资源,是给window加的,一定不要混淆

监听页面DOM加载完毕:给document添加DOMContentLoaded事件

document.addEventListener('DOMContentLoaded',function() {
  //执行的操作
})

3.2 页面滚动事件

或者说是元素滚动事件

滚动条在滚动的时候,持续触发的事件

很多网页需要检测用户把页面滚动到某一区域后做一些处理,比如固定导航栏,比如返回顶部

事件名:scroll

监听整个页面的滚动

  window.addEventListener('scroll',function() {
    console.log('页面进行滚动了')
  })

给window或document添加scroll事件,我们一般是给window

我们也可以单独监听某个元素内部滚动,直接给某个元素加即可

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>

  <style>
      body {
          height: 3000px;
      }

      div {
          width: 200px;
          height: 200px;
          border: 1px solid #000;
          /*滚动条*/
          overflow: scroll;
      }
  </style>
</head>
<body>
<div>
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
</div>
<script>
  // window.addEventListener('scroll', function() {
  //   console.log('页面进行滚动了')
  // })
  const div = document.querySelector('div')
  div.addEventListener('scroll',function(){
    console.log('文字进行滚动了')
  })
</script>
</body>
</html>
  • 使用场景

滚动一段距离,让某些元素显示或者高亮等

可以使用scroll来检测滚动的距离scrollLeft和scrollTop属性

使用其两个属性,能够获取被卷去的大小

获取元素内容往左往上滚出去看不到的距离

这两个值是可读写的

一定要是数值型的

image-20240724114109812

竖着的长方体是内容,横着的代表是范围框,红色标出的长度就是scrollTop

image-20240724114610547

<script>
  // window.addEventListener('scroll', function() {
  //   console.log('页面进行滚动了')
  // })
  const div = document.querySelector('div')
  div.addEventListener('scroll',function(){
    console.log('文字进行滚动了')
    //被卷去的头部div.scrollTop
    console.log(div.scrollTop)
    
  })
</script>

image-20240726165717884

也能对整个页面进行滚动事件

开发中,我们经常检测页面滚动的距离,比如页面滚动100像素就可以显示某个元素或者固定某一个元素

初始化的时候没有显示,当整个页面的顶部像素卷入超过100px后,div会展示出来

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>

  <style>
      body {
          height: 3000px;
      }

      div {
          display: none;
          width: 200px;
          height: 200px;
          border: 1px solid #000;
          /*滚动条*/
          overflow: scroll;
      }
  </style>
</head>
<body>
<div>
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
</div>
<script>
  const div = document.querySelector('div')
  window.addEventListener('scroll', function() {
    console.log('页面进行滚动了')
    //我想知道页面到底滚动了多少像素,也就是被卷去了多少 scrollTop
    //body的获取可以用document.body 但是html标签的获取不能用document.html获取
    //获取html要document.documentElement这样获取
    //得到的是数字型,不带单位
    console.log(document.documentElement.scrollTop)//这样的话我就能知道大页面滚动了多少
    const n = document.documentElement.scrollTop
    if (n >= 100) {
      div.style.display = 'block'
    }

  })
</script>
</body>
</html>

3.2.1 滚动显示侧边栏、

当页面滚动大于300像素,就显示电梯导航

红色框中的内容就是电梯导航

image-20240729094035913

  //获取元素
  const elevator = document.querySelector('.xtx-elevator')
  //1.当页面滚动大于300像素,就显示电梯导航
  //2.给页面添加滚动事件
  window.addEventListener('scroll', function() {
    //被卷去的头部大于300
    //获取html要document.documentElement这样获取
    const n = document.documentElement.scrollTop
    if (n >= 300) {
      //显示电梯导航
      elevator.style.opacity = 1
    } else {
      elevator.style.opacity = 0
    }
  })

3.2.2 快速回顶部

添加一个点击事件,让scrollTop=0即可

  //点击返回页面顶部
  const backTop = document.querySelector('#backTop')
  backTop.addEventListener('click', function() {
    document.documentElement.scrollTop = 0
  })

3.2.3 scrollTo()

scrollTo()方法可把内容滚动到指定的坐标

//页面滚动到Y轴1000像素的位置
window.scrollTo(0,1000)

3.3 页面尺寸事件

image-20240729142733697

  • 会在窗口尺寸改变的时候触发事件resize
  //resize 浏览器窗口大小发生变化的时候触发的事件
  window.addEventListener('resize', function() {
    console.log("窗口大小发生了变化")
  })
  • 检测屏幕宽度clientWidth、clientHeight属性

获取元素的可见部分宽高,不包含边框、margin、滚动条等

image-20240729101122695

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
      div {
          display: inline-block; /*块的大小由内容来定*/
          width: 200px;
          height: 200px;
          background-color: pink;
          padding: 10px;
      }
  </style>
</head>
<body>
<div>

</div>
<script>
  //获取元素
  const div = document.querySelector('div')
  console.log(div.clientWidth)
  console.log(div.clientHeight)
  //resize 浏览器窗口大小发生变化的时候触发的事件
  window.addEventListener('resize', function() {
    console.log('窗口大小发生了变化')
  })
</script>
</body>
</html>
  • 页面尺寸于位置-尺寸

获取位置 element.getBoundingClientRect()

方法返回元素的大小及相对于视口的位置

image-20240729142854556

当我们的盒子顶部隐藏了一部分后,top的值就变成负的了

image-20240729142957556

四、元素尺寸与位置

我想要得到我这个盒子再页面中是多大的,并且能够知道他的位置

前面的案例滚动多少距离使我们自己算的,但是我们想页面滚动到某个元素,就可以做某些事情

简单的说,我们想通过js的方式,得到元素在页面中的位置

这样我们做页面滚动到某个具体位置执行具体的操作了,省了我们计算距离这一步,方便了一点

  • 获取宽高offsetWidth、offsetHeight

获取元素的自身的宽高、包含元素自身设置的宽高、padding、border

获取出来的是数值,方便计算

注意!获取的是可视宽高,如果盒子是隐藏的,获取的结果是0

image-20240729105032785

电梯导航栏就可以做下面的修改

这样就不用担心盒子上移和下移的问题

  //获取元素
  const elevator = document.querySelector('.xtx-elevator')
  const entry = document.querySelector('.xtx-entry')
  //1.当页面滚动大于300像素,就显示电梯导航
  //2.给页面添加滚动事件
  window.addEventListener('scroll', function() {
    //获取html要document.documentElement这样获取
    const n = document.documentElement.scrollTop
    elevator.style.opacity = n>= entry.offsetTop ? 1 :0
    //if (n >= 300) {
      //显示电梯导航
      //elevator.style.opacity = 1
    //} else {
      //elevator.style.opacity = 0
    //}
  })
  • 获取位置

获取元素距离自己定位父级元素的左、上距离,会受父级元素的影响

检测盒子的位置,最近一级带有定位的父级/祖先级元素

offsetLeft和offsetTop等注意是只读属性

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
      div {
          width: 200px;
          height: 200px;
          background-color: pink;
          margin: 100px;
      }
  </style>
</head>
<body><!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
      div {
          width: 200px;
          height: 200px;
          background-color: pink;
          margin: 100px;
      }

      p {
          width: 100px;
          height: 100px;
          background-color: purple;
          margin: 50px;
      }
  </style>
</head>
<body>
<div>
  <p></p>
</div>

<script>
  const div = document.querySelector('div')
  console.log(div.offsetLeft) //108 因为body还有一个8像素的外边距 100+8=108
  const p = document.querySelector('p')
  console.log(p.offsetLeft) //158 8+100+50 ,不是说会受父级元素影响么,为什么不是50? 因为父级元素div没有定位住
</script>
</body>
</html>

<script>
const div = document.querySelector('div')
console.log(div.offsetLeft) //108 因为body还有一个8像素的外边距 100+8=108
</script>
</body>
</html>

给div定位住

      div {
          position:relative;
          width: 200px;
          height: 200px;
          background-color: pink;
          margin: 100px;
      }
console.log(div.offsetLeft) //50

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用Docker分层构建优化镜像大小

合适docker镜像文件大小不仅影响容器启动效率&#xff0c;也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像&#xff0c;采用多种方式避免镜像文件太大而影响性能。 Docker 镜像大小优化的重要性 资源利用效率 较小的镜像文件在存储和传输过程中占用更少的空间和带…

SpringBoot3整合SpringMVC

一、实现过程: (1).创建程序 (2).引入依赖: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

【C++】闰年判断问题完整解析与代码优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;我的解法分析 &#x1f4af;老师解法分析代码 1&#xff08;未优化版本&#xff09;分析 代码 2&#xff08;优化版本&#xff09;分析 &#x1f4af…

【深度学习】深刻理解ViT

ViT&#xff08;Vision Transformer&#xff09;是谷歌研究团队于2020年提出的一种新型图像识别模型&#xff0c;首次将Transformer架构成功应用于计算机视觉任务中。Transformer最初应用于自然语言处理&#xff08;如BERT和GPT&#xff09;&#xff0c;而ViT展示了其在视觉任务…

深度学习实验十四 循环神经网络(1)——测试简单循环网络的记忆能力和梯度爆炸实验

目录 一、数据集构建 1.1数据集的构建函数 1.2加载数据集并划分 1.3 构建Dataset类 二、模型构建 2.1嵌入层 2.2SRN层 2.3模型汇总 三、模型训练 3.1 训练指定长度的数字预测模型 3.2 损失曲线展示 四、模型评价 五、修改 附完整可运行代码 实验大体步骤&#x…

js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写

问&#xff1a; 我按在要在template中v-for循环遍历这个centrerTopdata&#xff0c;我希望自循环前面三个就可以了怎么写&#xff1f; 回答&#xff1a; 问&#xff1a; <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…

2、开发环境优化与创建第一个插件程序

一、创建测试用例二、vscode优化2.1 修改默认终端为普通cmd2.2 配置一键编译&&运行&&监视一、创建测试用例 使用命令yo code生成一个测试用例,选择或输入下面的内容。2. 命令的最后会提示是否使用vscode打开,选择打开就行。 3. 在当前目录下会产生helloworld…

element-ui实现table表格的嵌套(table表格嵌套)功能实现

最近在做电商类型的官网&#xff0c;希望实现的布局如下&#xff1a;有表头和表身&#xff0c;所以我首先想到的就是table表格组件。 表格组件中常见的就是&#xff1a;标题和内容一一对应&#xff1a; 像效果图中的效果&#xff0c;只用基础的表格布局是不行的&#xff0c;因…

华为TaurusDB与GaussDB:信创改造的“降本提效”之路

近年来&#xff0c;信创&#xff08;信息技术应用创新&#xff09;已成为中国国央企数字化转型的关键词。伴随这一浪潮&#xff0c;众多企业面临一个迫切问题&#xff1a;如何在兼顾性能与成本的前提下&#xff0c;完成核心系统的迁移改造&#xff1f;华为TaurusDB和GaussDB的加…

自然哲学的智能原理

一、自然哲学的智能原理 自然哲学的智能原理是一个跨学科的话题&#xff0c;它涉及哲学、自然科学、人工智能&#xff08;AI&#xff09;等多个领域的交集。自然哲学起源于古希腊&#xff0c;是探索自然界规律与现象的哲学分支&#xff0c;现代的“智能”概念则涉及到思维、学习…

硬件成本5元-USB串口采集电表数据完整方案-ThingsPanel快速入门

ThingsPanel开源物联网平台支持广泛的协议&#xff0c;灵活自由&#xff0c;本文介绍ThingsPanel通过串口来采集电表数据&#xff0c;简单易行&#xff0c;成本低廉&#xff0c;适合入门者学习试验&#xff0c;也适合一些特定的应用场景做数据采集。 适用场景&#xff1a; 降低…

在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型&#xff1a;从镜像冗余问题看 Docker 最佳实践 ⭐ 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能技术的迅猛发展&#xff0c;开发者们越来越多地尝试在本地环境中部署模型进行实验。 但部署过程中常…

数字化招聘系统如何帮助企业实现招聘效率翻倍提升?

众所周知&#xff0c;传统的招聘方式已经难以满足现代企业对人才的需求&#xff0c;而数字化招聘系统的出现&#xff0c;为企业提供了全新的解决方案。通过数字化招聘系统&#xff0c;企业可以自动化处理繁琐的招聘流程&#xff0c;快速筛选合适的候选人&#xff0c;从而大幅提…

【Email】基于SpringBoot3.4.x集成发送邮件功能

【Email】基于SpringBoot3.4.x集成发送邮件功能 摘要本地开发环境说明pom.xml启动类application.yaml写一个邮件模板定义模板引擎工具类定义一个邮件发送对象封装一个邮件发送器单元测试邮件模板单元测试发送邮件单元测试 邮件效果参考资料 摘要 在业务系统开发过程中&#xf…

如何在小米平板5上运行 deepin 23 ?

deepin 23 加入了 ARM64 支持&#xff0c;这里尝试将 deepin 系统刷入平板中&#xff0c;平常使用中&#xff0c;带个笔记本电脑有时候也会嫌比较麻烦&#xff0c;把 Linux 系统刷入平板中既满足了使用需要&#xff0c;又满足了轻便的需求。为什么不使用 Termux &#xff1f;虽…

java+springboot+mysql在线文件管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的在线文件管理系统&#xff0c;系统包含管理员、使用员、监察员角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;使用员管理&#xff1b;监测员管理&#xff1b;留言管理&#xff08;回复&#xff09;&#xff1b…

网站多语言前端翻译translate.js 在vue项目中的使用方法

网站多语言前端翻译translate.js 在vue项目中的使用方法 需求 客户网站&#xff0c;想要多语言版本的&#xff0c;通常的解决办法有两种&#xff1a; 1、最直接的办法&#xff1a;编写两种&#xff0c;或者多种语言版本的网站&#xff0c;也就是一个网站有几种语言&#xff0…

《Django 5 By Example》阅读笔记:p493-p520

《Django 5 By Example》学习第 17 天&#xff0c;p493-p520 总结&#xff0c;总计 28 页。 一、技术总结 1.internationalization(国际化) vs localization(本地化) (1)18n&#xff0c;L10n&#xff0c;g11n 以前总觉得这两个缩写好难记&#xff0c;今天仔细看了下维基百科…

mycat2读写分离配置

逻辑库配置 登录mycat 创建逻辑库&#xff0c;配置数据源 mycat2安装和使用 create database mycar_db1;修改mycar_db1.schema.json配置文件 指定的数据’targetName’&#xff1a;‘prototype’&#xff0c;配置主机数据源 targetName的参数可以是数据源 也可以是集群 这儿…

.Net 多线程、异步、性能优化应用与心得

文章目录 概要多线程Thread方式创建线程:Task方式创建线程[C#5.0引入]&#xff08;推荐使用&#xff09;:线程池方式创建线程&#xff1a; 异步异步方法异步IO操作异步数据库操作异步Web请求取消异步ValueTask[C# 7.0引入]ValueTask<TResult> 和 Task 性能优化懒加载对象…