Day09 DOM

Day09 DOM

DOM的概述

DOM(document object model)文档对象模型,顾名思义他就是用于操作对应的文档的,也就是操作你写的html文档。DOM是一个遵从文档流的语句。所以他是同步机制。

DOM的分类

  • document dom操作中最大的对象(表示当前操作的html文档)
  • element 元素对象 (表示的是对应的标签元素)
  • attribute 属性对象 (表示的所有的html标签里面的属性)
  • text 文本对象 (表示在html代码里面写的所有的文本)

document (文档对象)(*)

获取 通过对应的标识来获取element元素

根据id来回去元素(唯一)

  • document.getElementById(‘’) 通过id获取对应的元素(Element)
  • get 获得 element 元素 by 通过
  • 参数 里面是一个字符串 (必须加引号)
  • 返回的是一个元素对象(object)
//通过对应的id获取相关元素对象 返回的是一个element对象
var box = document.getElementById('box')
console.log(box);

根据类名返回元素对象集合**

  • document.getElementsByClassName(‘类名’) 通过className获取 (HTMLCollection)
  • 直接用类名来获取
//通过对应的class获取相关元素对象数组 (HTMLCollection (伪数组 具备下标 具备length))
var contents = document.getElementsByClassName('content')
console.log(contents);//获取HTMLCollection
console.log(contents[0]);//获取第一个匹配的元素

根据标签名获取

  • document.getElementsByTagName(‘标签名’) 通过标签名获取(HTMLCollection) 会把页面中所有元素都获得

  • 返回的是 获取过来元素的集合 以伪数组的形式储存

  • 得到是一个元素的集合,操作里面的元素需要遍历

  • document.getElementsByName 通过name属性获取 (NodeList)

//根据name属性名来获取对应的元素(表单标签)NodeList
console.log( document.getElementsByName('sex')); 

通过query获取第一个

  • document.querySelector 通过选择器获取第一个 (Element)(获取html中从上至下的第一个)
  • 返回指定选择器的第一个元素对象
  • 选择器需要加符号 .box #id
//根据对应的选择器获取 id # class . 标签 标签名 返回的都是元素对象
//querySeletor 获取匹配选择器的第一个元素 
console.log(document.querySelector('#box'));//返回匹配的元素对象
console.log(document.querySelector('.content'));//返回第一个找到的元素
console.log(document.querySelector('div'));//返回第一个找到的元素
console.log(document.querySelector('div:nth-child(1)'));//返回第一个找到的元素
  • document.querySelectorAll 通过选择器获取所有(NodeList)(多个,可通过[]指定)
//根据对应的选择器获取所有匹配的 NodeList的伪数组
console.log(document.querySelectorAll('#box'));
console.log(document.querySelectorAll('.content'));
console.log(document.querySelectorAll('div'));
//NodeList和HTMLCollection的区别 NodeList里面的存储以键值对存储

  • document.getRootNode 获取根节点(Node)
//根节点
console.log(document.getRootNode());

创建的相关方法 创建对应的节点对象

  • document.createElement 创建元素节点
//创建一个元素 传递对应的标签名
var element = document.createElement('div')
console.log(element);
  • document.createAttribute 创建属性节点
//创建属性 id = 'box' 传递属性名
//创建一个id属性 默认值伪空字符串
var attr = document.createAttribute('id')
//给当前属性对象指定对应的属性值
attr.value = 'hello world'
console.log(attr);//id = 'hello world'
console.log(typeof attr);//object
  • document.createTextNode 创建文本节点
//创建文本节点 传递的参数是显示的文本
var text = document.createTextNode('hello')
console.log(text); // "hello"
console.log(typeof text); //object

属性

获取属于文档的相关内容
  • document.body 获取body
document.body
  • document.head 获取head
document.head
  • document.froms 获取froms (返回一个HTMLCollection)
document.froms

属性操作

  • 获取元素的所有属性 元素.attributes
  • 设置元素的该属性 元素.setAttribute(‘属性名’,‘属性值’)
  • 获取元素的该属性 元素.getAttribute(‘属性名’)
  • 删除元素的该属性 元素.removeAttribute(‘属性名’)
     //获取img所有属性
      btns[0].onclick=function(){
        console.log(img.attributes);
      }
      //设置img的src属性
      btns[1].onclick=function(){
        // img.src='./images_07.jpg'
        img.setAttribute('src','./images_07.jpg')
      }
      //获取img的src属性
      btns[2].onclick=function(){
        // console.log(img.src);//获取src的绝对路径
        console.log(img.getAttribute('src'));//获取src的相对路径
      }
      //删除img的src属性
      btns[3].onclick=function(){
        img.removeAttribute('src')
      }

节点关系

 		//parentNode
        var li3 = document.getElementById('li3')
        li3.parentNode.style.border = '1px solid red' 
        console.log(li3.parentNode);//返回ul
        //childNodes
        var ul = document.querySelector('ul')
        console.log(ul.childNodes);//NodeList(11) [text, li, text, li, text, li#li3, text, li, text, li, text]
        console.log(ul.childNodes.length);//length 11会包含空格(文本节点) 
         //children
        console.log(ul.children);//HTMLCollection(5) [li, li, li#li3, li, li, li3: li#li3]
        console.log(ul.children.length);//5

方式一 利用 childNodes 做各行换色

		var list = []
        for (var i = 0; i < ul.childNodes.length; i++) {
            if (ul.childNodes[i].nodeType == 1) {
                list.push(ul.childNodes[i])
            }
        }
        list.forEach((item, index) => {
        //     item.style.background = index % 2 == 0 ? 'green' : 'greenyellow'
        })

方式二 利用children 做隔行换色

 		for (var i = 0; i < ul.children.length; i++) {
            ul.children[i].style.background = i % 2 ? 'blue' : 'green'
        }

获取节点

获得父亲或者儿子

  • 子.parentNode 获得的是父亲
  • 子.offsetParent 获得的是最近带有定位的父亲,找不到就会找到body
  • childNodes 儿子 包含文本节点和元素节点(w3c) 父.childNode
  • children 包含所有的元素节点 (微软),在ie678下会把注释当做元素节点 父.children

父子关系

  • 父.childNodes 获得所有的子节点包括文本节点和属性节点
  • 父.children 获得所有的子节点 只有属性节点 ie678受限制
  • 父.lastElementChild || 父.lastChild 获得父亲里最后一个儿子
  • 父.firstElementChild || 父.firstChild 获得父亲里第一个儿子
  • 父.children[下标] 获得父亲里任意一个儿子

兄弟关系

  • 获得上一个兄弟 兄弟.previousElementSibling || 兄弟.previousSibling
  • 获得下一个兄弟 兄弟.nextElementSibling || 兄弟.nextSibling
		//获取第一个节点
        var first = ul.firstElementChild || ul.firstChild
        first.style.background = 'red'
        //获取最后一个节点
        var last = ul.lastElementChild || ul.lastChild
        last.style.background = 'pink'
        //指定中间某一个
        ul.children[2].style.background = 'yellow'

        //上一个兄弟  
        var prev = li3.previousElementSibling || li3.previousSibling
        prev.style.background = 'green'

        //下一个兄弟
        var next = li3.nextElementSibling || li3.nextSibling
        next.style.background = 'white'

创建节点

创建圆

<button>创建圆</button>
    <script>
        var btn = document.querySelector('button')
        btn.onclick=function(){
            //1.创建div
            var box =document.createElement('div')
            //2.给div设置文字
            var oText =document.createTextNode('小日子过的不错')
            //3.设置样式
            box.style.width='200px'
            box.style.height='200px'
            box.style.background='red'
            box.style.borderRadius='50%'
            //4.文字要与div关联
            box.appendChild(oText)
            //5.将box添加到body
            document.body.appendChild(box)
        }   

类样式的添加

classlist是一个对象

  • add(‘box1’) 添加box1这个样式
  • remove(‘box1’) 删除box1样式
  • contains(‘box1’) 是否包含box1这个样式
  • toogle(‘box2’) 在之前存在的样式与box2之间来回切换
  • replace(‘原样式’, ‘新样式’) 将原样式替换为新样式

className 他的值必须是字符串 通过 = 赋值

box.claasName = ‘fox’


        var btns = document.querySelectorAll('button')

        var div = document.createElement('div')
        //设置初始样式
        div.style.width = '200px'
        div.style.height = '200px'
        div.style.border = '5px solid pink'
        console.log(div);
        document.body.appendChild(div)
        //添加样式box1
        btns[0].onclick = function () {
            div.classList.add('box1')
        }
        //删除样式box1
        btns[1].onclick = function () {
            div.classList.remove('box1')
        }
        //切换样式为box2 切换可以来回切换
        btns[2].onclick = function () {
            div.classList.toggle('box2')
        }
        //判断是否存在样式box2
        btns[3].onclick = function () {
            console.log(div.classList.contains('box2'));
        }
        //将box2这个样式替换box3.replace('旧样式名','新样式名')
        btns[4].onclick = function () {
            div.classList.replace('box2', 'box3');
        }

插入

父.insertBefore(新的元素,参照物) 插在参照物之前
insertBefore 的第二个参数为null时 和appendChild 一样 相当于成为父亲的最后一个娃

 //获得所有的按钮
        var btns = document.querySelectorAll('button')
        //获得li3
        var li3 = document.querySelector('#li3')
        //创建div

        //插在3前面
        btns[0].onclick = function () {
            var div = document.createElement('div')
            div.innerHTML = '我是添加的元素'
            div.className='a'
            div.classList.add('font')
            li3.parentNode.insertBefore(div, li3)
        }
        //插在3后面
        btns[1].onclick = function () {
            var div = document.createElement('div')
            div.innerHTML = '我是添加的元素'
            div.classList.add('a')
            var li4 = li3.nextElementSibling || li3.nextSibling
            li3.parentNode.insertBefore(div, li4)
        }
        //插在最后
        btns[2].onclick = function () {
            var div = document.createElement('div')
            div.innerHTML = '我是添加的元素'
            li3.parentNode.insertBefore(div, null)
        }

替换

父.replaceChild(新的元素,被替换的元素)

		var li3 =document.querySelector('#li3')
        var btn =document.querySelector('button')
        var li4 =li3.nextElementSibling||li3.nextSibling
        btn.onclick=function(){
            var a =document.createElement('a')
            a.href='http://www.qq.com'
            a.innerHTML='我 是文字'

            var comment =document.createComment('我是注释')
            a.appendChild(comment)

            li3.parentNode.replaceChild(a,li3)
        }

删除

父.removeChild(儿子) 父亲删除这个儿子
自己.remove() 自己删自己

  //父.removeChild(子)
        var li3 =document.querySelector('#li3')
        var btns =document.querySelectorAll('button')
        var li4 =li3.nextElementSibling||li3.nextSibling
        btns[0].onclick=function(){
            li3.parentNode.removeChild(li4)
        }
        btns[1].onclick=function(){
            li3.remove()//自杀
        }

克隆

自己.cloneNode(true/fasle)

  • cloenNode 参数为false 表示浅克隆
  • 浅克隆只克隆自身的结构 ,不会克隆子元素和文本
  • cloenNode 参数为true 表示深克隆
  • 深克隆会克隆自身的结构 ,也会克隆子元素和文本
   var box =document.querySelector('.box')
        var btns =document.querySelectorAll('button')
        //浅克隆
        btns[0].onclick=function(){
            var obox=box.cloneNode(false)
            document.body.appendChild(obox)
        }
        //深克隆
        btns[1].onclick=function(){
            var obox=box.cloneNode(true)
            document.body.appendChild(obox)
        }

this指向问题

  • 在对象中的方法中的this指向该对象
  • 在事件内的方法指向该事件的调用者
<body>
    <button>1</button>
    <button>2</button>
    <button>3</button>
    <button>4</button>
    <button>5</button>
</body>
    <script>
        var btns =document.querySelectorAll('button')
        for(var i =0 ;i<btns.length;i++){
            btns[i].onclick=function(){
                //排他思想先给所有的按钮添加为空
                for(var j =0;j<btns.length;j++){
                    btns[j].style.background=''
                }
                console.log(this);//指向点击的按钮
                //再给每个添加颜色
                this.style.background='red'
            }
        }

    </script>

下标 获得下标的两种方法

  • 藏值
  • forEach 获得下标(只有document.querySelementorAll获得的才有此方法)
var btns = document.querySelectorAll('button')
        for (var i = 0; i < btns.length; i++) {
            //藏值 获得下标i
            btns[i].index = i
            btns[i].onclick = function () {
                console.log(this.index);
            } 
        }

        foreach 获得下标
        btns.forEach((item, index) => {
           item.onclick=function(){
            console.log(index);
           }
        })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值