热门标签 | 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的元素举行比较并按需举行 插进去 移除 重排等操纵


推荐阅读
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • 第8章 使用外部和内部链接
    8.1使用web地址LearnAboutafricanelephants. ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 一、什么是闭包?有什么作用什么是闭包闭包是定义在一个函数内部的函数,它可以访问父级函数的内部变量。当一个闭包被创建时,会关联一个作用域—— ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • angular.element使用方法及总结
    2019独角兽企业重金招聘Python工程师标准在线查询:http:each.sinaapp.comangularapielement.html使用方法 ... [详细]
author-avatar
姓陈的女青年
这个家伙很懒,什么也没留下!