JS-进阶

变量声明

优先const,原因:语义化更好;变量不再改变,需要初始化

对引用变量,const声明的变量里面存的不是值而是地址。

Web APIs

作用:用JS操作HTML和浏览器

分类:DOM(文档对象模型),BOM(浏览器对象模型)

DOM

用来呈现以及与任意HTML或XML文档交互的API。开发网页内容特效和实现用户交互。

DOM树

作业:文档树直观的体现了标签与标签之间的关系

DOM对象(重要)

浏览器根据HTML标签生成的JS对象

        所有的标签属性都可以在这个对象上面找到

        修改这个对象的属性会自动映射到标签身上

核心思想:把网页内容当做对象来处理

document对象:是DOM提供的一个对象;它提供的属性与方法都是用来访问和操作网页内容的;网页所有内容都在document里

获取DOM元素

CSS选择器方式

语法1:

选择匹配的第一个元素

<script>
    document.querySelector('css选择器')
</script>
​
<body>
  <div class="box"></div>
  <p id="nav">daohanglan</p>
  <ul>
    <li>ceshi</li>
    <li>eshi</li>
    <li>eshi</li>
  </ul>
<script>
 const box = document.querySelector('div')
 console.log(box)
 const nav = document.querySelector('id')
 console.log(nav)
 const li = document.querySelector('ul li:first-child')
 console.log(li)
</script>
</body>

​

 返回值:

CSS选择器匹配的Nodelist 对象集合

参数:

包含一个或多个有效的CSS选择器 字符串

语法2:

可选多个元素

<script>
  document.querySelectorAll('css选择器')
</script>

得到的是一个伪数组:

1.有长度有索引号的数组;2.但是没有 pop()push()等数组方法
想要得到里面的每一个对象,则需要遍历(for)的方式获得。
注意事项
哪怕只有一个元素,通过querySelectAll()获取过来的也是一个伪数组,里面只有一个元素而已。

<script>
 const lis = document.querySelectorAll('.nav li')
 for(let i=0;i<lis.length;i++)
    console.log(lis[i])
  const p=document.querySelectorAll('#nav')
  p[0].style.color='red'
</script>

ID方式

document.getElementById('id')

类名方式

多个类名间空格隔开,返回一个数组

 document.getElementsByClassName('class')

标签名方式

  document.getElementsByTagName('tag')

事件监听

事件是在编程时系统内发生的动作或者发生的事情
比如用户在网页上单击一个按钮
事件监听就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 绑定事件或者注册事件
比如鼠标经过显示下拉菜单,比如点击可以播放轮播图等等

语法:

元素对象.addEventListener('事件类型',要执行的函数)

三要素:

例子

​
<body>
  <button>点击</button>
<script>
 const btn = document.querySelector('button')
 btn.addEventListener('click',function (){
  alert('你好')
 })
</script>
</body>

​
事件类型:

事件对象

一个对象,包含事件触发时的相关信息。可判断用户按下哪个键、鼠标点击哪个元素,从而做出相应反应。

获取方式:

在事件绑定的回调函数的第一个参数就是事件对象。一般命名为event、ev、e。

常用属性:

type,获取当前的事件类型

clientX/clientY,获取光标相对于浏览器可见窗口左上角的位置

offsetX/offsetY,获取光标相对于当前DOM元素左上角的位置

key,用户按下的键盘键的值

<body>
<input type="text">
<script>
 const input = document.querySelector('input')
 input.addEventListener('keyup',function(event){
  console.log(event.key)
  console.log(event.type)
 })
</script>
</body>

事件流

指事件完整执行过程中的流动路径。分俩个阶段:捕获阶段和冒泡阶段

事件捕获

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

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

是否捕获机制默认为false;使用时写true

<body>
<div class="fa">
  <div class="son"></div>
</div>
<script>
 const fa=document.querySelector('.fa')
 const son=document.querySelector('.son')
 document.addEventListener('click',function(){
  alert('爷爷')
 },true)
 fa.addEventListener('click',function(){
  alert('爸爸')
 },true)
son.addEventListener('click',function(){
  alert('儿子')
 },true)
</script>
</body>

事件冒泡

一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发。这一过程被称为事件冒泡
简单理解:当一个元素触发事件后,会依次向上调用所有父级元素的 同名事件
事件冒泡是默认存在的

阻止冒泡

前提,拿到事件对象

语法:事件对象.stopPropagation()

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

<body>
<div class="fa">
  <div class="son"></div>
</div>
<script>
 const fa=document.querySelector('.fa')
 const son=document.querySelector('.son')
 document.addEventListener('click',function(){
  alert('爷爷')
 })
 fa.addEventListener('click',function(){
  alert('爸爸')
 })
son.addEventListener('click',function(e){
  alert('儿子')
  e.stopPropagation()
 })
</script>
</body>

事件解绑

语法1:

<body>
<button>dianji</button>
<script>
const btn = document.querySelector('button')
//绑定事件
btn.onclick = function(){
  alert('dianji')
}
//解绑事件
btn.onclick=null
</script>
</body>

语法2:

<body>
<button>dianji</button>
<script>
  const btn = document.querySelector('button')
function fn(){
  alert('dj')
}
//绑定事件
btn.addEventListener('click',fn)
//解绑事件
btn.removeEventListener('click',fn)
</script>
</body>

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

事件委托

利用事件流的特征解决一些开发需求

优点:

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

原理:

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

<body>
<ul>
  <li>5</li>
  <li>5</li>
  <li>5</li>
  <li>5</li>
  <li>5</li>
</ul>
<script>
 const ul = document.querySelector('ul')
 ul.addEventListener('click',function(e){
  console.log(e.target)
  if(e.target.tagName='LI'){
    e.target.style.color='red'
  }
 })
</script>
</body>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值