JavaScript 回顾(八)

141 阅读3分钟

这是我参与更文挑战的第31天,活动详情查看: 更文挑战

1, DOM 查询

(1) 获取body标签

var body = document.getElementsByTagName('body')[0]
在document中有一个属性body, 保存了body的引入
var body = document.body
// 保存html标签
var html = document.documentElement
// 页面所有元素
var all = document.all
或者
all = document.getElementsByTagName("*")

(2) 根据元素的class属性值查询一组元素节点对象

var box = document.getElementsByClassName("box")
​
// 获取页面所有的DIV
var div = document.getElementsByTagName('div')
​
// 获取指定的DIV
通过CSS选择器
var abox = document.querySelector(".box div")

注意:兼容性最好的就是: querySelector(), 但是如果查询的选择器有多个,它只返回第一个, 如果想返回多个,可以用:querySelectorAll()

2, DOM增删改查

(1) 添加新的子节点

// 创建广州li元素节点, 需要一个标签名作为参数
var li = document.createElement("li")
// 创建文本节点, 需要一个文本内容作为参数
var text = document.createTextNode(“广州”)
// 文本节点添加到li中,作为子节点
   li.appendChild(text)
var city = document.getELementById('city')
     city.appendChild(li)

(2)删除子节点

// 父节点调用
city.removeChild(节点)

(3) 替换子节点

// 替换子节点, 父节点调用
city.replaceChild('新节点'"旧节点")

(4) 插入子节点

// 在指定的子节点前面插入新的子节点
city.insertBefore(新节点, '旧节点')

注意1:可以不获取父元素,直接:

子节点.parentNode.removeChild(子节点)

注意2: 可以通过innerHTML完成增加操作

obj.innerHTML += "<li>广州</li>"

3, JS修改样式

(1) 内联样式

语法: 元素.style.样式名 = 样式值

// 获取box
var box = document.getElementById('box')
// 修改box样式
box.style.width = "300px";
// 修改颜色,
box.style.backgroundColor = "yellow"

注意: 如果CSS样式名中又 -, 需要将这种样式名修改成驼峰命名法。

我们通过style属性设置的样式都是内联样式,读取的也是内联样式。

(2) 读取当前元素正在显示的样式

box.currentStyle.width
box.currentStyle.backgroundColor

注意: currentStyle只有IE能够使用,其他浏览器getComputedStyle()

需要两个参数: 第一个: 要获取样式的元素

第二个: 可以传递一个伪元素,一般为null

返回是一个对象,这个对象封装了当前元素对应的样式,可以通过获取的对象,去读取样式。

getComputedStyle(box1, null).width

定义一个函数,用来获取指定元素的当前样式

/*
* obj :要获取样式的元素
* name: 要获取的样式名
*/
function getStyle(obj, name) {
    // 正常浏览器
   return getComputedStyle(obj, null)[name]
    // IE8浏览器
  /// return obj.currentStyle[name]
}
// 最终优化版本
function getStyle(obj, name) {
    if(window.getComputedStyle) {
        return getComputedStyle(obj, null)[name] 
    } else {
        return obj.currentStyle[name]
    }
}
或者
function getStyle(obj, name) {
    return window.getComputedStyle ? getComputedStyle(obj, null)[name] : obj.currentStyle[name]
}

总结:通过currentStyle 和 getComputedStyle() 读取的样式都是只读属性,不能修改,如果修改必须通过style属性

4, 其他样式

(1) clientWidth/clientHeight

这两个属性可以获取元素的可见宽度和高度,包括内容区和内边框。 不带px, 且都是只读属性,无法修改

(2) offsetWidth/offsetHeight

可以获取元素的整个宽度和高度,包括内容区,内边框,和边框

(3) offsetParent

可以用来获取当前元素的定位父元素, 会获取到离当前元素最近的开启了定位的祖先元素。

(4) offsetLeft

当前元素相对于其定位父元素的水平偏移量

(5)offsetTop

当前元素现对于其定位父元素的垂直偏移量

(6)scrollWidth/scrollHeight

可以获取整个滚动区域的宽度和高度

(7)scrollLeft/scrollTop

可以获取水平滚动条滚动的距离/垂直滚动条滚动的距离

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>滚动条滚动到底</title>
  <style>
     #info {
       width: 300px;
       height: 500px;
       background-color: indianred;
       overflow: auto;
     }
  </style>
</head>
<body>
  <h3>欢迎大家注册</h3>
  <p id="info">
    你猜猜xxxx省略50000
  </p>
  <input type="checkbox" disabled="disabled" />我已经仔细阅读协议,一定遵守
  <input type="submit" value="注册" disabled="disabled" />
</body>
</html>
<script>
   window.onload = function() {
       /**
       * 当滚动条滚动到低的时候,检查滚动条
       */
       // 获取滚动条
       var info = document.getElementById('info')
       var inputs = document.getElementsByTagName('input')
       window.addEventListener('onscroll', function() {
          console.log('我滚动了')
       } )
       info.onscroll = function() {
         console.log('我是scrollHeight=' + info.scrollHeight)
         console.log('我是scrollTop=' + info.scrollTop)
         console.log('我是clientHeight=' + info.clientHeight)
         if(info.scrollHeight - info.scrollTop === info.clientHeight) {
           inputs[0].disabled = false
           inputs[1].disabled = false
         }
       }
   }
</script>