Dom基本知识

76 阅读13分钟

获取Dom对象

1想要获取标签的Dom对象,可以使用document.querySelector(选择器)

2document.qusrySelector假如有多个重复标签,只能获取第一个标签

3如果document.querySelector选择器找不到元素,只会返回null

语法结构

let h1 = document.quertSelector('h1')

这样就可以获取h1的dom对象了

获取元素All

当我们页面中有多个重复标签,我们可以把它转换成数组一起输出

使用docunment.querySelectorAll(),All就是代表数组

语法结构

let h2 = document.querySelectorAll(h2)

innerText使用

innerText作用就是可以把我们输出的内容,输出到标签中

innerText可以设置也可以修改,也可以取值,没有赋值就是取值,没有等号*就是取值

console.log(h2Dom.inneHTMLr)如果内用中有其他子元素,那么也会一起输出并且忽略标签

语法结构

let userName = prompt('输入你想邀请的伙伴')
let h1Dom = document.querySelector('h1')
  h1Dom.innerText = userName 
  userName 把值 赋值给 h1Dom.innerText里面,innerText具有可            以把信息传到标签中
​
​

也可以直接赋值

   let h2Dom = document.querySelector('h2')
   h2Dom.innerText = '你好呀'
   innerText是用来把需要的信息传到标签里面的。属性名.innerText

设置文本属性

!!!注意 单标签用value来给元素添加信息

!!!注意 双标签则使用 innerHTML 和innerText来给父元素添加息

我们可以获取usrename这个成为为Dom对象,然后我们就可以通过usrename来给文本设置信息
​
let usrename = document.querySelector('.usrename')
usrename.value = '我会在input里面出现嘛?'
usrename.value表示在input里面添加了一个value,然后给value添加了文字
设置单选框,只能选中一次,需要取消选中还要设置false属性取消
let radio =document.querySelector('.radioa')  
 ridio.checked = true(表示选中状态)
 ridio .checked = false(表示没选中状态)
设置复选框,可以多次点击选中或取消,好用
 let checkbox =document.querySelector('.checkbox1')
 checkbox.checked = true(表示选中状态)
​
设置下拉列表option.selected 表示下拉列表
<select>
  <option>去云南</option>
  <option>去重庆</option>
  <option>去三亚</option>
  <option>去海南</option>
</select>
​
   let option = document.querySelector('option : nth-        child(3)')
   option.selected = true(表示设置第几个默认显示在第一个位置)
设置按钮属性
 let btn3 = document.querySelector('.btn1')
        btn3.innerText = '我是btn3'
        btn3.disabled = false
        disabled = false表示启用该按钮
        btn4.disabled = true
        disabled = true表示禁用该按钮

在js中设置样式

 设置样式必须每个都要加上属性名和style
 let div = document.querySelector('div')
        div.style.color = "red"
        div.style.fontSize = '100px';
        div.style.backgroundColor= 'pink'
        div.style.width = '2600px'
        div.style.height= '2600px

获取ID,类,标签等Dom方法

<p></p>
    <div class="iii">1</div>
    <div class="#yt"></div>
​
    <script>
        let i =  document.querySelector('.iii')
        我们在获取 类 Dom属性必须在类前面加上.
        console.log(i);
        let yt1 =  document.querySelector('#yt')
        我们在获取id Dom属性必须在id前面加上#
        console.log(yt1);
    </script>

修改 文字 / 图片

在我们Dom里面是可以修改属性得,修改可以改变属性得值,比如图片,文字,链接等等都可以修改

但是得要先获取它的标签,比如h1 p span div img 等等标签

<img src ='' art''
img就是标签 src是属性,想要修改src的信息,得先要获取标签中得img
let img = document.querySelector = 'img'
img src =`想要修改的图片地址`

className

let div = document.querySelector('div')
​
   div.classList.add = ('d2','d3','d4')
   classList.add是添加一个类,可以添加多个类
​
   div.classList.remove = ('d2','d3','d4')
   classList.remove是删除一个或多个类
​
   div.classList.toggle ('d2','d3','d4')
​
  classList.toggled,如果body标签没有这个类,那么作业就是添加   一个类如果body里面有这个类,那么就会移除这个类

定时器初体验

开启定时器

可以做轮播图,还有倒计时等等
语法结构
itmeId = setIdterval(function(){
},1000(1000毫米代表1秒))

关闭定时器

语法结构
clearInterval(itmeId)

事件监听初体验

addEventListener表示时间监听,简单点来说就是当我们

对属性点击或者输入的时候,提示一些信息

语法
 属性名.addEventListener(click,匿名函数(){}

绑定不同事件

 绑定不同事件
        let div = document.querySelector('div')
        let input = document.querySelector('input')
​
​
        div.addEventListener('click',function(){
            console.log('click 鼠标点击事件');
        })
​
       div.addEventListener('mouseenter',function(){
           console.log('mouseenter 鼠标经过事件');
        })
​
       div.addEventListener('mouseover',function(){
           console.log('mouseover 鼠标离开事件');
        })
         
        
        input.addEventListener('focus',function(){
           console.log('blur 输入框获得焦点');
          document.body.style.backgroundColor='#000'
        })
​
         input.addEventListener('blur',function(){
           console.log('blur 输入框失去焦点');
            document.body.style.backgroundColor='#fff'
            
        })
​
       input.addEventListener('input',function(){
            console.log('只要你在我的输入框输入了内容,我就触发');
       })
       input.addEventListener('keyup',function(){
           console.log('keyup 按住键盘某一个键,放开之后便触发');
       })

节点介绍

节点可以分为元素节点,也就是div p 等等标签

属性节点就是 herf 就是 a 标签里面的 herf 就叫做属性节点

文本节点 inptu 包括我们输入的文字 都算是 文本节点

获取子元素节点

子元素节点 用 chlidren来创建的,使用方法就是 父元素.chlidren来快速准确获取我们子元素

实列:

<ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
 let ul = document.querySelector = ('ul')
 父元素ul.chlidren

获取父元素节点

父元素节点用parendNode来创建的,假如我们想对父元素做一些什么改变,我们就可以使用 parendNode, 使用方法就是子元素.parendNode

实列:

<ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
let li = document.querySelector('li')
li.parentNode.style.display = 'none'
通过子元素隐藏父元素

获取兄弟元素

兄弟元素有两个,一个是向上一个兄弟节点,另一个是向下兄弟节点

我们可以通过兄弟节点来修改我们上下兄弟元素的属性

向上兄弟节点 previousElementSibling 属性

向下兄弟节点 nextElementSibling 属性

实列;

<ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
  </ul>
  let li = document.querySelector('li')
  li.previousElementSibling 上一个兄弟节点
  li.nextElementSibling 下一个兄弟节点

创建节点和追加节点

创建节点和追加节点

创建节点也就是,如果我创建了一个节点,而这个节点在网页中没有出现的,那么这个就叫做创建节点。

追加节点也就是,如果我创建了一个节点,而这个节点在网页中已经有了,那么创建的这个节点会在标签后面先,这就叫做追加节点.

创建节点需要我们父元素.appendChild(li)来进行创建或追加节点

实列

      let li = document.createElement('li')
        创建一个新的节点
        li.style.color = 'green'
        li .style.backgroundColor = 'red'
        li.style.width = '200px'
        li.style.height='50px'
        let ul = document.querySelector('ul')
        ul.appendChild(li)
        把创建节点的li,需要用父元素 apppendChild来输出

appednChild移入/插入功能

假如我们有两个ul标签,一个ul里面装着li标签,一个ul里面没有li标签,那么我们就可以向两个其中一个插入节点/或移入节点

移入节点也就是,如果我创建了一个节点,然后我把这个节点插入其他ul标签中,而这个节点在这个u里面没有出现的,那么这个就叫做移入节点。

插入节点也就是,如果我创建了一个节点,然后我把这个节点插入其他ul标签中,而这个节点在这个u里面是已经出现的,那么这个就叫做插入节点,强行霸占一个位置

实列

 <ul class="left">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
      </ul>
      <ul class="right"></ul>
      
       let li = document.querySelector('.left li:nth- 
       把left里面第2个li标签 输出,转到right 的ul标签里面
       child(2)')
        let right = document.querySelector('.right')
        right.appendChild(li)
        把li标签插入到right的ul里面,插入哪个标签里面
        就以哪个 标签开头 .appendChild

insertBefore

这insertBefore和appendChild类型相似 ,但是insertBefore在插入的同时并且可以指定插入元素在第几个位置占用

实列

 <ul class="left">
        <li>a</li>
        <li>b</li>
        <li>c</li>
        <li>d</li>
      </ul>
      <ul class="right">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
      </ul>
      
      let c = document.querySelector('.left li:nth-child(3)');
       就是说选中left第三个li标签转移到rightul里面。
        let two = document.querySelector('.right li:nth-child(2)');
       表示把leftli标签插入到rightul标签第二个位置
        let right = document.querySelector('.right');
       insertBefore 也能插入元素 功能也类似 appendChild
       如果要插入的元素 是已经存在的  那么insertBefore作用 就是移动占据位置
       如果要插入的元素 是新创建的  insertBefore作用 仅仅 插入

克隆节点

克隆简单点来说就是复制,可以复制标签中所有的样式,效果

克隆就等于复制,不过克隆比较方便,肯定有它存在的意义

实列

<div class = 'box'>
<p></p>
</div>
let box = document.querySelector(.box)
let Newbox = box.cloneNode() 表示克隆了div这个盒子
如果cloneNode括号里面加上true就是深度克隆,会连标签里面的子元素一起克隆.
把克隆插入body标签输出,克隆的盒子
document.body.appendChild(Newbox)括号里面是变量名

删除元素节点

实列

<button>点我删除li</button>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>
    <script>
        let button = document.querySelector('button')
        let ul = document.querySelector('ul')
        let li = document.querySelector('li:nth-child(1)')
       是我们的li标签放在注册事件外面,我们删除只会删除第一个,第二个永远是第二
        button.addEventListener('click',function(){
          let li = document.querySelector('li:nth-child(1)')
          要是我们的li标签放在注册事件里面,那么button删除第一个之后,然后js会自动再排序,删除第一个,第二个变成第一个
            删除第二个,第三个变成第一个 */
            ul.removeChild(li)
            ul.remove()
             自杀,删除自己
            
        })

时间

 let date = new Date(  )定义时间戳
     let num  = date.getFullYear() 年份
     let num1 =date.getMonth();月份
     let num2 =date.getDate();日
​
     let num4 =date.getHours(); 小时
     let num5 =date.getMinutes(); 分钟
     let num6 =date.getSeconds(); 秒数

let date = new Date()

console.log(Date.now()); 获取时间戳 方法 1

console.log(date.getTime()); 获取时间戳 方法 2

console.log(+(new Date())); 获取时间戳 方法 3

以上三种方法均可获取时间戳

事件对象

event v ev 三种随便用一种都可以 ,可以来获取我们点击事件一瞬间的信息

let btn = document.querySelector('button')
        btn.addEventListener('click',function(event){
            console.log(event);event 开始记录点击一瞬间的信息
        })

事件对象2

   let div = document.querySelector('div')
      div.addEventListener('click',function(event){
          console.log(event.clientX,event.clientY);
          上面这行代码是表示 默认鼠标点击事件 数据参数参照左上角
          不是参照div 
          console.log(event.offsetX,event.offsetY);
           上面这行代码代表的是 参照元素本身的位置,来进行
          参照位置,和client刚好相反 
​
      })

滚动触发事件scroll

scroll就是我们滑动鼠标滚轮往下滑或者往下滑,那么就会触发scroll属性

div.addEventListener('scroll',function(){
            console.log('要出来啊');
            这样我们每滑动一次鼠标都会打印出来 ('要出来啦')
        })

设置滑动高度

document.documentElement.scrollTop()

mousemove随着鼠标移动

mousemove 给鼠标绑定移动事件,当鼠标发生移动时,mousemove就会显示鼠标所移动的位置的值

  let div = document.querySelector('div')
        当我们不知道给哪个绑定事件,那么就可以绑定document
        document.body.addEventListener('mousemove',function(event){
         mousemove是鼠标移动的时候触发事件,event是记录事件触发的一瞬间
            记录下来的,
            client是相对于视口的定位,offset是相对于当前元素
            div.style.left = event.clientX - 70+'px'
            把记录下来的值赋值给left,可以让div跟随着鼠标移动
            div.style.top = event.clientY  - 80+'px'
          
        })

preventdefault阻止元素的默认行为

比如 a标签里面的 href默认跳转行为 当我们想阻止元素的默认行为时,可以使用preventdefault()来阻止默认行为

实列

 <a href="http://www.baidu.com">我不想跳转</a>
    <script>
        let a = document.querySelector('a')
        a.addEventListener('click',function(event){
            console.log('我点击了啊');
            a.style.color = 'red'
            event.preventDefault()
            当我们设置了之后,点击a标签将不会跳转
          
        因为a里面恶的href有一个默认跳转行为,我们可以用preventdefault()来阻止
            默认跳转行为
          
        
        })

stopPropagation阻止传播

let div1 = document.querySelector('.div1')
        let div2 = document.querySelector('.div2')
        假如我们只需要捕获某一个元素,不想其他元素
        也被获取,那么我们就可以设置event.shotpropagation来阻止
        其他元素也被捕获
        div.addEventListener('click',
        function(event){
            
            console.log('div');
             event.stopPropagation()
             只捕获div一个元素 就算有多个元素
             我们只会获取当前div的元素 
            
        
        }
        我们加上true之后,就变成了捕获阶段,
        默认值是false,是默认冒泡排序,一般很少用到
        捕获阶段,因为没有这个需求 
        )
        div1.addEventListener('click',
        function(event){
            console.log('div1');
           
          如果我们设置了当前的div1,那么它的父元素也会被获取
           因为我们设置了true,默认从父元素开始捕获
         要想捕获自己,就得把父元素的true去掉
​
        },  true
       假如div1是div2的父元素,假如div添加了
        true就是捕获阶段,div1没加true,那么捕获阶段就是
        div - div2 - div1,最后才捕获div1
        ,因为默认是false冒泡排序的 
        )
        div2.addEventListener('click',
        function(){
            console.log('div2');
            event.stopPropagation()
            只设置捕获自己
​
        },true
        )

委托事件

当我们需要获取某一个元素进行判断或者点击事件,就可以用event.target 点击你要要绑定事件或要进行判断条件的元素。从而获取到 local.Name(元素小写,没变化) 或 nodeName(元素大写)不用再遍历子元素进行绑定点击事件了,直接使用event.target 就能处理子元素了

event.target等于当前选中当前点击的元素

来点击某一个子元素,可以用localName 直接等于元素就可以了*

event.target.localName ==='li'即可选中li标签

也可以用nodeName,不过要选中想要的元素必须是

event.target.nodeName === 'LI'把元素换成大写就可以了

 <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
    <script>
        const li = document.querySelector('li')
        const ul = document.querySelector('ul')
        ul.addEventListener('click',function(event){
            console.log(event.target.nodeName);
             event.target.nodeName可以获取元素的标签
            if(event.target.nodeName == 'LI'){
               当我们点击获取的元素标签 和LI匹配时候,
               就会执行下面的代码
                
                event.target.style.backgroundColor = 'red'
                点击和上面代码匹配的标签  就能变成红色
            }
        })

lode加载完外部资源才触发事件

1 我们一般在网页开发中,都是需要网页元素全部加载完才会显示可以使用网页的功能

2 有很多业务和功能,都需要使用到外部资源 (外部js文件 ,外部css文件 ,图片 ,视频)我们希望等待资源全部加载完毕,才显示给用户看。

3 在写代码的时候,我们会把所有的代码都放在window.addEventlistener('load',function(){

}) 里面

实例

window.addEventListener('load',function(){
            console.log(('我要等全部加载出来我才触发'));
        })

DomContentLoaded 加载完标签就会触发事件

DOMContentLoaded就是等我们页面标签加载完就触发事件了,一般都不怎么用, 因为现在一般都是等外部资源和标签一样加载完才触发事件,也就是全部加载完用户才能看到页面效果或者进行交互 。

语法

 window.addEventListener('DOMcontentLoaded',function(){}

关于老版本讲js代码写在head标签里面

早期的把代码写在head标签里面 ,这样写会加载报错的,因为下面那个的h1还没有加载出来,我们就调用了它的h1标签,所以我们设置的样式就不会生效,标签都还没有加载出来,我们设置样式就会找不到标签

1.错误写法 let h1 = document.querySelector('h1')

document.addEventListener('DOMContentLoaded',function(){

console.log(h1)

h1.innerText = '我是新创建的

})

 老版本代码正确写法
        document.addEventListener('DOMContentLoaded',function(){
            let h1 = document.querySelector('h1')
            console.log(h1);
            h1.innerText = '我是新创建的'
        })

2.正确写法 所以早些时期,程序员会把 let h1 = document.querySelector('h1')放在

DOMContentLoaded里面,标签全部加载完才开始生成dom元素,才可以执行,不会报错

DOMContentLoaded

页面的标签 都加载完毕就触发了,不需要等待标签的内容回来

video标签一生成, 事件就触发*

load事件等待 vide标签生成了,同时 video标签内的视频也加载回来 才触发*

video加载 分两部

只是加载标签而已 一瞬间加载完很快 DOMContentLoaded

会去加载 标签对应的视频 比较慢

scroll家族

页面滚动统计 使用 window.addEventListener("scroll") 事件

页面的滚动看得到移动距离 document.documentElement.scrollTop

1

let div = document.querySelector('div')
console.log(div.scrollWidth)
​
  1 输出当前div的宽度 ,div的宽度不包含滚动条 ,滚动条是占了宽度17px
         实际div宽度被滚动条减去17px,pc端会滚动条会占用当前元素的宽度17px,
         移动端则不会占用当前元素的宽度 
         scrollWidth 
         获取容器的宽度(包含滚动条的区域)
​
console.log(div.scrollHeight)
  获取高度整个区间,就是实际滚动距离
           2  输出当前div的高度 ,div的宽度不包含滚动条 ,滚动条是占了高度17px
         实际div宽度被滚动条减去17px,pc端会滚动条会占用当前元素的高度17px,
         移动端则不会占用当前元素的高度 
         })
​

2

  div.addEventListener('scroll',function(){
        console.log(div.scrollLeft);
     获取当前元素容器 --就是子元素在父元素里面滚动的距离,宽度滚动距离
  }
                       
  console.log(this.scrollTop)  
  获取当前元素容器 --就是子元素在父元素里面滚动的距离,高度滚动距离 

offset家族

offsetHeight高度包含滚动条大小是当前元素的100%,没有变化

offsetWidth宽度包含滚动条大小是当前元素的100%,没有变化

 <div class="d1">
       <div class="d2">
       </div>
   </div>
let d2 = document.querySelector('.d2')
        console.log(d2.offsetWidth);
        console.log(d2.offsetHeight);
​
 console.log(d2.offsetLeft);
//获取当前元素距离 定位了的父元素的大小(找不到定位了的父元素,相对于页面来计算)
    /*     1 如果子元素没有定位,父元素也没有定位
        就会相当于我们页面,也就是body来获取我们移动的距离 
        1 如果子元素有固定定位我们设置了 外边距,那么就会参考父元素来计算我们的移动距离
        // 只要父元素没有设置定位,我们子元素就会参考于页面也就是body进行移动距离
        
        
 console.log(d2.offsetTop);
   我们设置了一个top为10,所以说打印出来d2的移动距离和页面的距离为10px
       因为我们没有给d1父元素设置定位,所以d2是跟随着页面也就是body来定位的
    1 offsetWidth  获取元素的宽度 包含这滚动条
      2 offsetHeight 获取元素的高度 包含这滚动条
      3 offsetLeft 获取定位了的父元素的 水平距离 左 
      4 offsetTop 获取定位了的父元素的 垂直距离 上 

client家族

   const clientDom = document.querySelector('.client');
    // 宽度和高度
    console.log(clientDom.clientWidth); // 不包含 滚动条(类似 scrollWidth)
    console.log(clientDom.clientHeight); // 不包含 滚动条(类似 scrollHeight)
​
    // 获取边框的大小
    console.log(clientDom.clientLeft); // 左边框
    console.log(clientDom.clientTop); // 上边框  
​
    // scollWidth     获取容器的宽度(不包含滚动的区域)
    // offsetWidth    获取可视区域的宽度(包含滚动条)
    // clientWidth    获取可视区域的宽度(不包含滚动条)
​
    // scrollLeft    获取左侧滚动的距离
    // offsetLeft    获取和已经定位了的父级元素的左距离
    // clientLeft    获取左边框的大小 

\