js DOM

js DOM

  • DOM树
  • 浏览器得到一个页面会做的事
    1.解析
    2.创建一棵DOM树
    3.创建一棵CSSOM树
    4.将DOM树和CSSOM树合并成一棵渲染树
    5.计算页面布局(相对来说,有点慢)
    6.描绘页面 =====>重绘

由于页面布局改变触发的计算布局叫做【回流】
JS跟DOM树的操作,比JS本身的操作慢很多,所以不宜在频繁触发的事件中涉及DOM树的操作

DOM树图

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="a">
       <p></p>
       <p></p>
    </div>
   
</body>

</html>

DOM树

  • offset属性
属性名功能参数
offsetTop返回距离上级盒子(最近的带有定位)上边的位置
offsetLeft返回距离上级盒子(最近的带有定位)左边的位置
offsetWidth包含border外边缘以内的所有内容的宽度
offsetHeight包含border外边缘以内的所有内容的高度
  • 节点属性
属性名功能参数
nodeType返回节点类型
nodeName返回名称
nodeValue返回值
  • getElement 从页面取得元素节点
  • 通过id

var dom节点=document.getElementById(‘id名’)
只找到一个元素,返回了一个对象,这个对象代表了页面中的一个节点
我们称之为DOM节点

  • 通过标签名

var dom节点们=document.getElementsByTagName(‘标签名’)
返回值是伪数组,数组的每一个元素都是一个DOM节点
==dom节点.getElementsByTagName(‘标签名’)==在dom节点下获取指定标签名的元素

  • 通过类名

var dom节点们=document.getElementsByClassName(‘类名’)
返回值是伪数组,数组的每一个元素都是一个DOM节点

  • 通过name属性

var dom节点们=document.getElementsByName(‘name名’)
返回值是伪数组,数组的每一个元素都是一个DOM节点

  • 通过css的选择器(一个)

var dom节点=document.querySelector(选择器)
返回符合选择器的第一个元素
选择器例如 div #a .class a:nth-child

  • 通过css的选择器(所有)

var dom节点=document.querySelectorAll(选择器)
返回一个伪数组,取得符合选择器的所有元素
选择器例如 div #a .class a:nth-child

  • attribute函数操作属性
函数名功能参数
setAttribute()修改属性、增加属性('属性名','属性值')
getAttribute()获取属性('属性名')
removeAttribute()删除属性('属性名')
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
        }

        .red {
            background: red;
        }

        .black {
            background: black;
        }
    </style>
</head>

<body>
    <div id="a"></div>
    <script>
        //操作属性
        var a = document.querySelector('div');
        console.log(a.getAttribute('class'))//null
        a.setAttribute('class', 'red');//增加class属性,属性值为red
        a.setAttribute('class', 'black');//修改class属性,属性值为black
        a.removeAttribute('class');//删除class属性
    </script>
</body>

</html>
  • 元素节点属性
属性名功能描述
tagName返回标签名(只读)大写标签名
innerHTML设置标签里的内容(读写)不包含标签名
outerHTML设置标签里的内容(读写)包含标签名
id设置id(读写)id
className设置class名(读写)calss名
style设置内联样式(读写)如果样式为xxx-yy 的话,那么去掉横线,然后横线后面的单词首字母大写,如xxxYy
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
        }

        .red {
            background: red;
        }

        .black {
            background: black;
        }
    </style>
</head>

<body>
    <div id="a"></div>
    <script>
        //操作属性
        var a = document.querySelector('div');//找到页面上的第一个div
        console.log(a.tagName)//DIV 输出标签名 注意,标签名为大写
        a.innerHTML = '哈哈';//在标签里添加哈哈
        a.outerHTML = '<p>haha</p>'//把<div id="a">哈哈</div>替换成<p>haha</p>
        a = document.querySelector('p');//从新得到下页面上的p标签,因为页面上的div标签已经没有了,被替换为p标签了
        a.id = 'a';//给p标签加id的属性,属性值为a
        a.className = 'red';//给p标签加class 属性值为red
        a.style.fontSize = '20px';//给p标签加内联样式font-size='20px'
        //把横线去掉,size首字母大写
    </script>
</body>

</html>

属性操作

  • 节点访问
  • 访问父节点

dom节点.parentNode访问父节点

  • 访问子节点(所有)

dom节点.childNodes访问子节点
返回值为伪数组

  • 访问子元素节点(所有)

dom节点.children访问元素子节点
返回值为伪数组

  • 访问前一个兄弟节点(可能是其他类型节点)

dom节点.previousSibling 访问前一个兄弟节点

  • 访问前一个元素兄弟节点(元素)

dom节点.previousElementSibling访问前一个元素兄弟节点

  • 访问后一个节点(可能是其他类型节点)

dom节点.nextSibling访问后一个节点

  • 访问后一个元素节点(元素)

dom节点.nextElementSibling访问后一个元素节点

  • 访问父节点的第一个节点(可能是其他类型节点)

dom节点.firstChild 访问父元素的第一个节点

  • 访问父节点的第一个元素节点(元素)

dom节点.firstElementChild 访问父元素的第一个节点

  • 访问父节点的最后一个节点(可能是其他类型节点)

dom节点.lastChild 访问父元素的最后一个节点

  • 访问父节点的最后一个元素节点(元素)

dom节点.lastElementChild 访问父元素的最后一个节点

  • 祖宗节点

dom节点. ownerDocument访问祖宗节点 ,也可以直接document

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="a">
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
            <li>6</li>
            <li>7</li>
            <li>8</li>
        </ul>
    </div>
    <script>
        //访问父节点
        var ul = document.querySelector('ul');//得到ul
        console.log(ul.parentNode.tagName)//DIV
        //访问子节点
        console.log(ul.childNodes[1])//#text 代表的是文本节点
          //返回值是伪数组,所以需要加索引
        //访问元素子节点
        console.log(ul.children[0]);//<li>1</li>
        //返回值是伪数组,所以需要加索引
        //访问前一个兄弟节点
        var li2 = document.querySelector('ul>li:nth-child(2)');//得到第二个li
        console.log(li2);//<li>2</li>
        console.log(li2.previousSibling);//#text 代表的是文本节点
        //访问前一个兄弟元素节点
        console.log(li2.previousElementSibling);//<li>1</li>
        //访问后一个兄弟节点
        console.log(li2.nextSibling);//#text 代表的是文本节点
        //访问后一个元素兄弟节点
        console.log(li2.nextElementSibling);//<li>3</li>
        //ul的第一个节点
        console.log(ul.firstChild)//#text  代表的是文本节点
        //ul的第一个元素节点
        console.log(ul.firstElementChild.innerHTML)//1
        //ul的最后一个节点
        console.log(ul.lastChild)//#text  代表的是文本节点
        //ul的最后一个元素节点
        console.log(ul.lastElementChild.innerHTML)//8
        //祖宗节点
        console.log(ul.ownerDocument);//#document

    </script>
</body>

</html>

访问节点

  • 节点操作
  • 创建元素节点

document.createElement(‘标签名’)

  • 追加元素节点

父节点.appendChild(dom节点)
参数:dom节点

  • 插队元素节点

父节点.insertBefore(新节点,被插队节点)
在指定节点前插入一个节点
参数:dom节点

  • 删除元素节点

父节点.removeChild(dom节点)

参数:dom节点
dom节点.remove() ie浏览器不兼容

  • 复制元素节点

var 新dom节点=dom节点.cloneNode() 没上树,默认不复制子节点
var 新dom节点=dom节点.cloneNode(true) 没上树,参数为true,会将子元素一起复制

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="a">
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
            <li>6</li>
            <li>7</li>
            <li>8</li>
        </ul>
    </div>
    <script>
        //节点操作
        //创建元素节点
        var li = document.createElement('li')//创建li节点
        li.innerHTML = '10';//li里的内容为10
        //追加元素节点
        var ul = document.querySelector('ul');//得到ul
        ul.appendChild(li);//将li追加到ul的最后面
        //插队元素节点
        var li1 = document.createElement('li')//创建li节点
        li1.innerHTML = '我插队';//li里的内容为 我插队
        ul.insertBefore(li1, ul.lastElementChild);//将li1插入到ul最后一个节点的前面
        //删除元素节点
        var li2 = document.querySelector('ul>li:nth-child(2)')//得到ul里的第二个li
        ul.removeChild(li2)//删除ul的第二个li
        //复制元素节点
        var li3 = li1.cloneNode(true)//把li1复制给li3
        ul.appendChild(li3)//把li3追加到ul的最后面
    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值