前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >28·灵魂前端工程师养成-DOM编程

28·灵魂前端工程师养成-DOM编程

作者头像
DriverZeng
发布2022-09-26 17:11:24
4370
发布2022-09-26 17:11:24
举报
文章被收录于专栏:Linux云计算及前后端开发

-曾老湿, 江湖人称曾老大。


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。


网页其实是一棵树


第一个知识点

代码语言:javascript
复制
<!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>队列示例</title>
    <link rel="stylesheet" href="./style.css">
</head>
<body>
    <div id="screen"></div>
    <div class="actions">
        <button id="createNumber">取号</button>
        <button id="callNumber">叫号</button>
    </div>
    <div>
        当前号码:<span id="newNumber"></span>
    </div>
    <div>
        当前队列:<span id="queue"> </span>
    </div>
    <script src="./main.js"></script>
</body>
</html>


JS如何操作这棵树

JS一开始是无法操作这个树的,后来浏览器发明了一个功能,浏览器往window上加一个document即可

在浏览器的控制台中输入,window.document 我们就可以得到 百度这个树的文档。将鼠标放在 #document上后,我们能看到整个网页都变成了蓝色

切记,我们这样操作那么就只得到了,该网页的根节点:html , body , head

只有在我们点开左边的三角后,才能看到其他的节点,所以想要获得某个详细的节点,我们可以进一步获取。

那么由此可见,JS是用document来操作整个网站页面的。 这就是 Document Object Model 文档对象模型 三个单词,简写: DOM 那么这就是我们今天要讲的,DOM编程

但是我们要记住,一开始我们就说过,JS不是一门特别好的语言,所以DOM很难用,那么我们需要想办法,解决这个难题。

如果你觉得,DOM 很智障,那么请你不要怀疑自己,DOM就是很智障,你觉得是对的。

DOM自带的API接口,是真的很智障,反人类,于是乎后来就有了使用:JQuery来操作DOM,使用VUE操作DOM,使用React操作DOM,后面我们就会学习,JQuery,VUE,React

获取元素(也叫获取标签)


获取所有元素API

代码语言:javascript
复制
window.idxxx  或者直接 idxxx
document.getElementById('idxxx')
document.getElementsByTagName('div')[0]
document.getElementsByClassName('red')[0]
document.querySelector('#idxxx')
document.querySelectorAll('.red')[0]

代码语言:javascript
复制
window.idxxx  或者直接 idxxx
document.getElementById('idxxx')
document.getElementsByTagName('div')[0]

以上的三种方法都不用 ,我们了解即可。

那我们到底用哪个呢?

工作中:

代码语言:javascript
复制
document.querySelector('#idxxx')
document.querySelectorAll('.red')[0]

自己做项目:

我们可以偷偷使用下面的方法 ,但是不要让老板发现。

代码语言:javascript
复制
window.idxxx
idxxx

要兼容IE的可怜虫:

代码语言:javascript
复制
document.getElementById('idxxx')
document.getElementsByTagName('div')[0]
document.getElementsByClassName('red')[0]

那么我们来 说一下 querySelectorquerySelectorAll

代码语言:javascript
复制
// 类似于CSS的调用方式,我们调用div里面的span的第二个元素
document.querySelector('div>span:nth-child(2)')

// 结果如下
<span class="show-icon"><span class="weather-icon" style="background-image:url(https://dss0.bdstatic.com/k4oZeXSm1A5BphGlnYG/icon/weather/aladdin/png_18/a0.png);*background-image:none;*filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=https://dss0.bdstatic.com/k4oZeXSm1A5BphGlnYG/icon/weather/aladdin/png_18/a0.png, enabled=true,sizingMethod=" crop")";=""></span><em class="show-icon-temp">1℃</em></span>

// 使用All,上面的只能找到 第一个div里面的第二个span元素,那么想找到每个div的就加All
document.querySelectorAll('div>span:nth-child(2)')


获取指定元素API

代码语言:javascript
复制
// 获取html元素
document.documentElement
// 获取head元素
document.head
// 获取body元素
document.body
// 获取窗口
window
// 获取所有元素,不过这个是个奇葩,是第六个falsy值
document.all

给大家展示一下JS的反人类之处。

我们获取html的标签名,他出来的居然是大写 mmp...

使用window,虽然window不是一个元素,但是我们可能会经常 使用windows

代码语言:javascript
复制
// 监听window的点击事件,只要点击鼠标,就打印 出一个hi,下图点击8次,打印8次
window.onclick = () => {console.log('hi')}


div原型链

我们获取到元素,我们需要 了解他的原型链,知道他的构造,都有哪些方法可以用。

节点的增删改查

程序猿的宿命,离不开增删改查


创建节点

代码语言:javascript
复制
// 创建一个标签 节点
let div1 = document.createElement('div')
document.createElement('style')
document.createElement('script')
document.createElement('li')

// 创建文本节点
text1 = document.createTextNode('曾老湿')

// 标签里插入文本
div1.appendChild(text1)
div1.innerText = '你好' 或者 div1.textContent = '你好'
// 但是不能用 div1.appendChild('你好')

显示在网页上

上面的创建元素都只能在JS中创建,但是显示不在页面上,所以我们需要把内容显示在页面上。

代码语言:javascript
复制
// 先创建一个div
let div1 = document.createElement('div')

// 然后创建一个文本
let text1 = document.createTextNode('曾老湿')

// 把文本加入到div中
div1.appendChild(text1)
"曾老湿"

// 加入到页面中
document.body.appendChild(div1)
<div>​曾老湿​</div>​

// 正常来说,上面的操作做完,我们就已经能看到了,但是百度页面的原因我们还是看不到

//于是乎,我们把 '曾老湿' 用 CSS 给他浮动起来
div1.style.position = 'fixed'
"fixed"
div1.style.top = 0
0
div1.style.left = 0
0
div1.style.color='red'
"red"

删除节点

删除节点,我们必须要先找到这个节点的爸爸 ,然后 让爸爸删儿子

代码语言:javascript
复制
// 方法一
div1.parentNode.removeChild(div1)

代码语言:javascript
复制
// 方法二
div1.remove()

修改属性

代码语言:javascript
复制
// 修改class
div.className = 'red'
div.classList.add('blue')

// 修改style
div.style = 'width:100px;color:blue;'

// 修改style的一部分
div.style.width = '200px'

// 修改背景颜色,注意大小写
div.style.backgroundColor = 'white'

// 修改data属性
div.dataset.x = 'zls'

// 读取标准属性
div.classList / a.href
div.getAttribute('class') / a.getAttribute('href')

举例:

代码语言:javascript
复制
let div1 = document.createElement('div')

let text1 = document.createTextNode('曾老湿')

div1.appendChild(text1)
"曾老湿"
document.body.appendChild(div1)
<div>​曾老湿​</div>​
div1.style.position = 'fixed'
"fixed"
div1.style.top = 0
0
div1.style.left = 0
0
div1.style.color='red'
"red"
div1.style.backgroundColor='yellow'
"yellow"
div1.style.fontSize='100px'
"100px"

在网页上添加一个div

可以看到,这样我们就将div加入到body中了。

我们修改一下这个div的class

代码语言:javascript
复制
div1.className = 'red'
"red"

但是这种方法是以覆盖的形式,那么如果我们要改成 class = 'red blue'怎么办?

代码语言:javascript
复制
div1.className += 'blue'

新语法,我们可以直接添加,接下来我们添加一个原谅色 class = 'red blue green'

代码语言:javascript
复制
div1.classList.add('green')


修改内容

代码语言:javascript
复制
// 修改文本内容
div.innerText = 'xxx'
div.textContent = 'xxx'

// 改HTML内容
div.innerHTML = '<strong>曾老湿</strong>'

// 改标签
div.innerHTML = '' // 先清空
div.appendChild(div2) // 再加内容 

查看API

代码语言:javascript
复制
// 查爸爸
node.parentNode
node.parentElement

// 查爷爷
node.parentNode.parentNode

// 查子代
node.childNodes
node.children

// 查兄弟姐妹
node.parentNode.childNodes
node.parentNode.children

// 查看老大
node.firstChild

// 查看老幺
node.lastChild

// 查看上一个哥哥/姐姐
node.previousSibling

// 查看下一个弟弟/妹妹
node.nextSibling

查看一个div里面的所有元素

代码语言:javascript
复制
// 遍历div
travel = (node,fn) => {
    fn(node)
    if(node.children){
        for(let i=0;i<node.children.length;i++){
            travel(node.children[i])
        }
    }
}
travel(div1,(node) => console.log(node))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 网页其实是一棵树
  • 获取元素(也叫获取标签)
  • 节点的增删改查
相关产品与服务
运维安全中心(堡垒机)
腾讯云运维安全中心(堡垒机)(Operation and Maintenance Security Center (Bastion Host))可为您的 IT 资产提供代理访问以及智能操作审计服务,为客户构建一套完善的事前预防、事中监控、事后审计安全管理体系,助力企业顺利通过等保测评。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档