DOM扩展的那些事儿

前言:关于DOM的扩展,之前自己也接触了一些,但是没有系统的去看,这次有机会系统的学习JavaScript,所以就把这些知识好好的总结一下。
1、选择符的扩展

在没有扩展之前,我们在进行元素选择之前,使用最广泛的就是

document.getElementById()

但是在扩展以后,我们在进行元素选择的时候方便了很多,关于选择符一共扩展了三个方法

document.querySelector()
document.querySelectorAll()
document.getElementsByClassName()//看书才知道这也是DOM扩展的内容(尴尬)

自己平时用的最多的就是下面这样

document.querySelector("#content");
或者
document.querySelector(".container");

但是关于这个方法的魅力远远不只是这个简单,我们在css中可以怎么选择元素,这里就可以这样选择,什么意思呢,通过下面的例子来说明

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
</head>
<body>
    <ul class="ul">
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script>
        window.onload = function() {
            var oUl = document.querySelector(".ul");
            var oLi = oUl.querySelector("li:first-child");
            console.log(oLi);//结果为<li>1</li>
        }
    </script>
</body>
</html>

感受到这个方法的强大了吧,关于CSS的选择符,自己之前总结过一篇文章,感兴趣的伙伴可以看看CSS选择器总结


关于querySelectorAll()也是一样的,只是返回的结果是NodeList。


对于getElementsByClassName()我们可以传入多个class名称,返回结果如果是多个也是NodeList

2、元素遍历的扩展

不知道还记不记得我们之前在遍历元素的时候,经常使用nextSibling,firstChild。我们经常要考虑到文本节点,弄得很烦恼。现在终于有了一些方法不用考虑到文本节点了,只是考虑文档节点,看看下面例子就明白了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
</head>
<body>
    <ul class="ul">
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script>
        window.onload = function() {
            var oUl = document.querySelector(".ul");
            // 获取子元素的个数
            console.log(oUl.childElementCount);//结果为3
            // 返回第一个子元素
            console.log(oUl.firstElementChild);
            // 返回最后一个元素
            console.log(oUl.lastElementChild);
            // 获取同辈的下一个元素
            console.log(oUl.firstElementChild.nextElementSibling);
            // 获取同辈的上一个元素
            console.log(oUl.lastElementChild.previousElementSibling);
        }
    </script>
</body>
</html>
2、了不起的classList属性

关于这个属性的出现,真得好处多多啊,进行类名操作的时候只需要调用一个属性即可。下面进行简单对比
正常情况下,我们要增加一个元素的类名是下面这样的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
    <style>
        .red-color {
            color: red;
        }
        .bg-gray {
            background-color: gray;
        }
        .center {
            text-align: center;
        }
    </style>
</head>
<body>
    <ul class="red-color bg-gray">
        xiaoD
    </ul>
    <script>
        window.onload = function() {
            var oUl = document.getElementsByTagName("ul")[0];
            var classNames = oUl.className.split(/\s+/);
            classNames.splice(0,0,'center');
            oUl.className = classNames.join(" ");
        }
    </script>
</body>
</html>

但是我们又了classList属性的时候,我们就可以对上面的操作秒杀。classList主要有四个方法

add 如果已经存在值了,就不会增加,如果不存在就增加
contains 判断是否存在该值
remove 删除值
toggle 如果存在就删除,如果不存在就增加,就是逆向而行

具体例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
    <style>
        .red-color {
            color: red;
        }
        .bg-gray {
            background-color: gray;
        }
        .center {
            text-align: center;
        }
    </style>
</head>
<body>
    <ul class="red-color bg-gray">
        xiaoD
    </ul>
    <script>
        window.onload = function() {
            var oUl = document.getElementsByTagName("ul")[0];
            oUl.classList.add('center');
            oUl.classList.remove('bg-gray');
            console.log(oUl.classList.contains('red-color'));//结果为true
            oUl.classList.toggle("bg-gray");
        }
    </script>
</body>
</html>
3、焦点管理

通过document.activeElement获取当前或者焦点的元素
通过document.hasFocus()判断文档是否获取到了焦点,通过该方法我们可以知道用户是不是正在和页面进行交互,因为只要用户的鼠标在document中,返回的值都是true

4、readyState

通过document.readyState判断页面是否已经加载完成,如果加载完成则为complete

5、outerHTML

我们都知道innerHTML,但是这里却出现了一个outerHTML,先看一下下面的例子,在进行解释

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
    <style>
        p.red {
            color: red;
        }
    </style>
</head>
<body>
    <div id="div1"></div>
    <script>
        window.onload = function() {
            var oDiv = document.getElementById("div1");
            oDiv.outerHTML = "<p class='red'>123</p>";
        }
    </script>
</body>
</html>

我们通过上面的操作,再看elment中的元素,发现div不见了,只有一个p标签。对,你没有看多,这就是outerHTML,其实质就是

var p = document.createElement("p");
p.appendChild(document.createTextNode("welcome"));
oDiv.parentNode.replaceChild(p, oDiv);
6、insertAdjacentHTML

这个方法有两个参数,使用方法如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
</head>
<body>
    <div id="div1">
        <p class="list">1</p>
    </div>
    <script>
        window.onload = function() {
            var oDiv = document.querySelector("#div1");
            // 作为同辈元素插入在oDiv之前
            oDiv.insertAdjacentHTML("beforebegin", "<p>0</p>");
            // 作为同辈元素插入在oDiv之后
            oDiv.insertAdjacentHTML("afterend", "<p>2</p>");
            // 作为第一个子元素插入
            oDiv.insertAdjacentHTML("afterbegin", "<p>1.1</p>");
            // 作为最后一个子元素插入
            oDiv.insertAdjacentHTML("beforeend", "<p>1.2</p>");
        }
    </script>
</body>
</html>

我们来看看结构图就清楚了
这里写图片描述

7、scrollIntoView

可以取值为true和false。如果是true则是容器的上边框和页面的顶部对齐,如果是false则是容器的下边框和页面的底部对齐,但是这是有条件的,就是当页面的可视区高度小于容器的高度。如果容器的可视区的高度大于容器的高度,那么不管设置为false,还是true都是和页面的底部对齐。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
    <style>
        div {
            width: 200px;
            height: 100px;
            margin-top: 3000px;
            border: 1px solid red;
        }
        .content {
            width: 300px;
            height: 2000px;
        }
    </style>
</head>
<body>
    <button id="btn">向上</button>
    <div class="content">welcome</div>
    <script>
        window.onload = function() {
            var oBtn = document.getElementById("btn");
            var oContent = document.querySelector(".content");
            oBtn.onclick = function() {
                oContent.scrollIntoView(true);
            }
        }
    </script>
</body>
</html>

(完,写于2017/11/14 0:46)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值