热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

掌控DOM它不像你想的那末难

许多开发者以为DOM是真的很难(或许很慢)以至于你须要一个庞大的框架才能让它帖服。因而他们投入了大批的时候去进修这些框架。一两年过去了,又一个框架火了因而你不能不抛弃之前的框架重新

许多开发者以为 DOM 是真的很难(或许很慢)以至于你须要一个庞大的框架才能让它帖服。因而他们投入了大批的时候去进修这些框架。一两年过去了,又一个框架火了因而你不能不抛弃之前的框架重新学起。如许的事变多反复频频就能让你对 Javascript 发作委靡,更不用说那多的数不过来的依靠。

假如我通知你 DOM 实在没那末庞杂,你信吗?

DOM 并不难而且它也不慢。

建立元素

要建立一个元素,你只须要写 document.createElement(tagName)

const h1 = document.createElement('h1')
//

修正文本内容

HTML 元素假如没有任何内容,那就是空的,让我们用 element.textContent 来增添一些文本

h1.textCOntent= 'Hello world!'
//

Hello world!

属性

要定义一个 HTML 元素的属性,你能够用 element.setAttribute(name, value)

h1.setAttribute('class', 'hello')
//

Hello world!

若要治理 class 有一个 element.className 属性

h1.className = 'hello'
//

Hello world!

然则,最好的体式格局是运用 classList

h1.classList.add('hello')
//

Hello world!


h1.classList.remove('hello')
//

Hello world!

要设置一个元素的 ID,你能够运用标签属性或许 id 属性

h1.setAttribute('id', 'hello-world')
h1.id = 'hello-world'
//

Hello world!

假如你不确定用标签属性(attributes)照样对象属性(properties),就用标签属性 (表单元素的状况除外,如 value 和 checked)

注重,有些布尔值的修正不能运用 element.setAttribute(someBoolean, false),下面这些则能够

input.checked = true
//
input.checked = false
//
input.setAttribute(‘checked’, ‘’)
//
input.removeAttribute('checked')
//

元素附加

HTML 是结构化的。能够经由过程 parent.appendChild(child) 来完成元素附加

document.body.appendChild(h1)
//

Hello world!

元素移除

有时候你愿望去掉一个元素,那末你能够运用 parent.removeChild(child)

document.body.removeChild(h1)
//

元素查找

你能够运用以下要领来查找子元素

  • document.getElementById(id)

  • element.childNodes[i]

  • element.firstChild === element.childNodes[0]

  • element.lastChild === element.childNodes[element.childNodes.length – 1]

  • element.getElementsByTagName(tagName)

  • element.getElementsByClassName(className)

  • element.querySelector(query)

  • element.querySelectorAll(query)

注重 getElementsByTagName, getElementsByClassName 和 querySelectorAll 返回的不是数组,而是 NodeList,你不能经由过程 ES5 的数组疾速接见体式格局来迭代。

元素间插进去元素

想要将元素查到另一个元素的前面?尝尝 parent.insertBefore(child, before)

/*
*
*
*
*/
document.body.insertBefore(h1, document.body.firstChild)
/*
*

Hello world!


*
*
*/

建立元素列表

假如我们有一些数据,能够很轻易的动态建立元素。

const data = [
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]

const table = document.createElement('table')
data.forEach(row => {
const tr = document.createElement('tr')
row.forEach(cell => {
const td = document.createElement('td')
td.textCOntent= cell
tr.appendChild(td)
})
table.appendChild(tr)
})
document.body.appendChild(table)

https://jsfiddle.net/pakastin…

更新元素列表

你愿望元素坚持最新状况,能够这么做

const table = document.createElement('table')
document.body.appendChild(table)
updateTable(table, [
[ 1, 2 ],
[ 3, 4, 5 ],
[ 6, 7, 8, 9 ]
])
setTimeout(() => {
updateTable(table, [
[ 1, 2, 3, 4 ],
[ 5, 6, 7 ],
[ 8, 9 ]
])
}, 1000)
function updateTable (table, data) {
const rowLookup = table._lookup || (table._lookup = [])
setChildren(table, updateRows(rowLookup, data))
}
function updateRows (rowLookup, rows) {
return rows.map((row, y) => {
const tr = rowLookup[y] || (rowLookup[y] = document.createElement('tr'))
const cellLookup = tr._lookup || (tr._lookup = [])
setChildren(tr, updateCells(cellLookup, row))
return tr
})
}
function updateCells (cellLookup, cells) {
return cells.map((cell, x) => {
const td = cellLookup[x] || (cellLookup[x] = document.createElement('td'))
td.textCOntent= cell
return td
})
}
function setChildren (parent, children) {
let traverse = parent.firstChild
for (let i = 0; i const child = children[i]
if (child == null) {
return
}
if (child === traverse) {
traverse = traverse.nextSibling
} else if (traverse) {
parent.insertBefore(child, traverse)
} else {
parent.appendChild(child)
}
}
while (traverse) {
const next = traverse.nextSibling
parent.removeChild(traverse)
traverse = next
}
}

https://jsfiddle.net/pakastin…

以上代码有两个事变发作

  1. 一个隐蔽属性 element._lookup = [] 用来查找子元素,运用lookup 我们能够复用DOM中已存在的元素并更新它们。

  2. setChildren(parent, children) 要领能让你供应一个元素列表。它很智慧的和已附加在 parent的元素举行比较并按需举行 插进去 移除 重排等操纵


推荐阅读
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
姓陈的女青年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有