DOM整理

DOM总结

什么是dom?

dom是文档对象模型。将网页转化成js对象,从而可以使用js操作网页

js获取元素的方式
  1. 获取非常规元素

    //获取html元素
    document.documentElement
    
    //获取head元素
    document.head 
    
    //获取body元素
    document.body 
    
  2. 获取常规元素

    //根据ID获取元素
    document.getElementById('id名') 
    
    /*
    	根据class名称获取元素
    	获取的是一个伪数组,没有push等方法,但是可循环
    	可以通过Array.from(elements)转换成真数组去使用
    */
    document.getElementsByClassName('class名')
    
    /*
    	根据标签名称获取元素
    	获取的是一个伪数组,没有push等方法,但是可循环
    	可以通过Array.from(elements)转换成真数组去使用
    */
    document.getElementsByTagName('标签名')
    
    /*
    	根据name属性获取元素
    	获取的是一个伪数组,没有push等方法,但是可循环
    	可以通过Array.from(elements)转换成真数组去使用
    	普遍运用在input标签上 
    */
    document.getElementsByName('name属性名称')
    
    /*
    	只返回一个对象,如果有多个同名元素,则只返回第一个
    */
    document.querySelector('css名') 
    
    /*
    	querySelector的补足,可返回数组
    */
    document.querySelectorAll('css名') 
    
      
    
js操作元素属性
  1. 元素本身属性

    <input id="name" type="text" />
    <script>
        var nameInput = document.getElementById('name')
     // 获取属性
     console.log(nameInput.type)
     // 设置属性
     nameInput.type = 'password'
    </script>
    
  2. 自定义属性

    <input id="name" type="text" data-name='zhangsan' />
    <script>
     var name = document.getElementById('name')
     /* 
     	方式一
     */
     // 获取属性
     name.getAttribute("data-name")
     // 设置属性
     name.setAttribute("data-name", 'lisi')
     // 删除属性
     name.removeAttribute("data-name")
        
     /* 
     	方式二
     */
     // 只能获取自定义属性
     console.log(name.dataset)
     // 只能设置自定义属性
     name.dataset.age = 12
     // 删除自定义属性
     delete name.dataset.name
     delete name.dataset.age
    </script>
    
案例:全选/取消全选

操作文本元素
  1. innerHTML(‘内容’) //获取/设置完整的html片段
  2. innerText(‘内容’) // 不解析html标签,只能操作文本,但是比innerHTML更安全
  3. value // 表单元素
操作元素样式
  1. 获取元素**行内样式**的方法(可读可写)

    document.getElementById('id').style.width
    
    
    /*例如`background-color`这种样式,需使用如下方式获取:*/
    //['background-color']方式
    document.getElementById('id').style['background-color']
    //驼峰方式
    document.getElementById('id').style.backgroundColor
    
  2. 获取行内、内部(style标签)、外部(link标签)样式的方法(只读)

    var box = document.getElementById('id')
    var res = getComputedStyle(box);
    console.log(res);
    res.width // 获取宽度
    res.backgroundColor // 取背景颜色
    

    兼容性问题,不支持IE678,需要使用 res.currentStyle.width

    注意:

    box.style和getComputedStyle(box)这种方式只能获取content的宽高

操作元素类名
  1. 直接操作元素class名

    var box = document.getElementById('id')
    console.log(box.className); // 获取元素class
    box.className = 'classname' // 设置classname,如果有多个,直接覆盖
    
  2. 通过classList属性操作

    var box = document.getElementById('id')
    console.log(box.classList) // 结果是一个数组
    //设置class名称,如果有重复,自动去重
    box.classList.add('classname')
    //删除classname
    box.classList.remove('classname') 
    //切换classname,如果有item,就删除,没有就加上
    box.classList.toggle('item')
    
    
案例:选项卡

DOM节点
节点分类

document/元素/文本/属性/注释节点

  • document

    根节点

  • 元素节点

    通过getElementBy…获取的都是元素节点

  • 属性节点

    通过getAttribute获取,无父子关系

  • 文本节点

    通过innerText获取

  • 注释节点

<!--box中有几个直系子节点-->
<div id="box">
    hello
	<p>123456</p>
	<!--注释-->
</div>
<script>
/*
	共5个节点
	1.包含hello和回车换行的文本节点
	2.<p>123456</p>节点
	3.p节点和注释节点之间的回车换行文本节点
	4.注释节点
	5.注释节点之后的回车换行文本节点
*/
</script>
获取节点的方式
  1. 获取所有子节点

    var box = document.getElementById("box")
    console.log(box.childNodes) //节点数组
    
  2. 获取所有元素节点

    var box = document.getElementById("box")
    console.log(box.children) //节点数组
    
  3. 获取第一个子节点

    var box = document.getElementById("box")
    console.log(box.firstChild) //第一个节点
    console.log(box.firstElementChild) //第一个元素节点
    
  4. 获取最后一个子节点

    var box = document.getElementById("box")
    console.log(box.lastChild) //最后一个节点
    console.log(box.lastElementChild) //最后一个元素节点
    
  5. 获取上一个兄弟节点

    var box = document.getElementById("box")
    console.log(box.previousSibling) //获取上一个兄弟节点
    console.log(box.previousElementSibling) //获取上一个兄弟元素节点
    
  6. 获取下一个兄弟节点

    var box = document.getElementById("box")
    console.log(box.nextSibling) //获取下一个兄弟节点
    console.log(box.nextElementSibling) //获取下一个兄弟元素节点
    
  7. 获取父节点

    var box = document.getElementById("box")
    console.log(box.parentNode) //获取父节点
    console.log(box.parentNode.parentNode) //可以无限向上层找,最终找到document,根节点
    console.log(box.parentElement) //获取父元素节点,可以无限向上层找,最终找到html节点
    //这也是parentNode和parentElement的主要区别
    
  8. 获取所有属性节点

    var box = document.getElementById("box")
    console.log(box.attributes) // 返回NamedNodeMap,注意返回的是map集合
    
节点操作
  1. 创建节点

    //创建div节点
    var odiv = document.createElement('div')
    //追加属性
    odiv.className = 'item'
    odiv.innerHTML = 'new Element'
    //作为box的子节点,追加到box节点中
    var box = document.getElementById('box')
    box.appendChild(odiv)
    

  2. 插入节点

    var odiv = document.createElement('div')
    odiv.innerHTML = 'new Element'
    var box = document.getElementById('box')
    box.insertBefore("要插入的节点","在哪个节点前面插入")
    
  3. 删除节点

    var box = document.getElementById("box")
    box.removeChild("要删除的节点") //删除box的后代节点
    box.remove() //删除自己以及后代节点
    
  4. 替换节点

    var box = document.getElementById("box")
    box.replaceChild("新节点", "老节点")
    
  5. 克隆节点

    var box = document.getElementById("box")
    //默认。克隆自己不克隆后代
    var boxClone1 = box.cloneNode()
    //克隆自己和后代
    var boxClone2 = box.cloneNode(true)
    
节点属性
// nodeType。获取方式:
var box = document.getElementById("box")
var boxChildNodes = box.childNodes
boxChildNodes[0].nodeType // 2 || 3 || 8 || 1
文本节点元素节点属性节点注释节点
3128

获取元素尺寸
var box = document.getElementById("box")
/*
	offsetWidth | offsetHeight
	计算的是 border+padding+content
	
	注意:
	 1. 获取的单位是number类型
	 2. 设置box-sizing 虽对结果有影响,但是计算方式是不变的。
	 3. 设置display:none。结果是0
*/
console.log(box.offsetWidth, box.offsetHeight)
/*
	clientWidth | clientHeight
	计算的是 padding+content
	
	注意:
	 1. 获取的单位是number类型
	 2. 设置box-sizing 虽对结果有影响,但是计算方式是不变的。
	 3. 设置display:none。结果是0
*/
console.log(box.clientWidth, box.clientHeight)
// margin的大小对以上结果没有任何影响
获取元素偏移量
var box = document.getElementById("box")
/*
	偏移量计算参考点:
	1. 偏移量相对于最近定位父级元素
	2. 如果没有定位,偏移量相对于body
*/
console.log(box.offsetLeft, box.offsetTop)
/*
	表示内容区域的左上角相对于整个元素左上角的位置(不包括padding、margin),也就是一个元素的左边框(border-left)的宽度
	特别的:如果元素的文本方向是从右向左(RTL, right-to-left),并且由于内容溢出导致左边出现了一个垂直滚动条,则该属性包括滚动条的宽度。
	
	不常用
*/
console.log(box.clientLeft, box.clientTop)
获取可视窗口的尺寸
/*
	Bom方式
*/
//获取窗口的宽度(包含滚动条)
console.log(window.innerWidth)
//获取窗口的高度(包含滚动条)
console.log(window.innerHeight)

/*
	Dom方式
*/
//获取窗口的宽度(不包含滚动条)
console.log(document.documentElement.clientWidth)
//获取窗口的高度(不包含滚动条)
console.log(document.documentElement.clientHeight)
案例-懒加载

原理:

页面的总高度 = 滑动的高度(scrollTop) + 可视窗口的总高度(clientHeight)

页面总高度获取方式:

  1. scrollHeight
  2. offsetHeight + offsetTop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值