原生js操作DOM基础-笔记
原文参考http://mp.weixin.qq.com/s?__biz=MzU3MDA0NTMzMA==&mid=2247485490&idx=1&sn=15197b4b53e0669e4a017e54a31fb39c&source=41#wechat_redirect
使用原生js为了提高效率,纯js操作dom
一 查询DOM
document.querySelector()参数是任意css选择器格式,只会返回第一个匹配到值
document.querySelectorAll()同上,返回结果不同,会返回所有查找到的值
尽量在父元素中查找指定dom,减少document的整个文档查找,这样可以简化选择器并提高性能。
与getElementsByTagName()这些方法的比较,querySelector()的结果不是动态的,当我们动态添加元素时,集合不会更新
代码:
const elements1 = document.querySelectorAll('div')
const elements2 = document.getElementsByTagName('div')
const newElement = document.createElement('div')
document.body.appendChild(newElement)
elements1.length === elements2.length // 0 1 结果false
querySelectorAll()返回的结果不用调用node方法,结果也不是一个数组(是伪数组),需要转为数组才能使用数组的方法
const myElements=document.querySelectorAll('.cla')
Array.from(myElements).forEach(doSomeThing)
Array.prototype.forEach.call(myElements,doSomeThing)
[].forEach.call(myElements,doSomeThing)
每个元素都有一些引用‘家族’的不需要说明的只读属性(即element属性),并且是动态的,基于元素的
myElements.children子节点
myElements.firstElementChild第一个子节点
myElements.lastElementChild最后一个子节点
myElements.previousElementSibling前一个子节点
myElements.nextElementSibling后一个子节点
node属性,除了parentElement可以是任何类型节点
myElements.childNodes
myElements.firstChild
myElements.lastChild
myElements.previousSibling
myElements.nextSibling
myElements.parentNode
myElements.parentElement
通过nodeType来判断节点的类型
检查节点的原型链可以使用instanceof
二 修改类和属性
修改类
myElement.classList.add()
myElement.classList.remove()
myElement.classList.toggle()
访问属性
myElement.value
myElement.value = 'test'// 赋值
设置多属性
Object.assign(myElement,{
value:'test',
id:'app'
})
以下方法会导致浏览器重绘消耗性能
getAttribute()
setAttribute()
removeAttribute()
三添加css样式
使用驼峰形式
myElement.style.marginLeft = '1px'// 只会获取明确属性
window.getComputedStyle(myElement)// 可以获取次元素所有css属性集合,包括继承下来的
window.getComputedStyle(myElement).getPropertyValue('width')// 获取全部集合中的一种(如宽度)
四修改DOM
element1.appendChild(element2)
element1.insertBefore(element2,element3)// 在容器element1中,将element2插入到element3之前
五克隆一个元素
let myEleClone = myElement.cloneNode()// 参数为true将创建一个深层副本,它的子元素也会被克隆
六创建
创建元素
document.createElement('div')
创建文本节点
document.createTextNode('hell')
七删除
parentBox.removeChild(myElement)// 从父容器中删除子元素
myElement.parentNode.removeChild(myElement)
八读写元素属性
innerHTML='<p>test</p>'// 元素中添加html内容
textContent='test'// 只能添加纯文本
九事件监听
使用addEventListener方法可以不断绑定事件,事件都会触发
myElement.addEventListener('click',function(event){
console.log(event.target);
})
event.target是触发事件的元素
阻止默认事件e.preventDefault()
阻止事件冒泡e.stopPropagation()
myElement.addEventListener('click',function(){},true)
第一个参数是事件类型,第二个参数是回调函数,第三个参数是布尔值,true表示事件在捕获阶段执行false事件在冒泡阶段执行。默认是false
removeEventListener()删除事件监听器
myElement.addEventListener('click',function(e){})// 第一个参数是事件类型,第二个参数是回调函数
事件委托
列表的每个列表需要添加绑定事件,可以使用这种方式,在父元素上绑定事件,利用冒泡原理在判断触发事件的元素,节约性能
parentBox.addEventListener('click',function(e){
console.log(e.target);
})
十 动画
使用window.requestAnimationFrame()来同步更新,将更改安排到浏览器下次重绘中。
格式
const start = window.performance.now()
const duration = 2000
window.requestAnimationFrame(function fadeIn(now){
consot progress = now - start
myElement.style.opacity = progress / duration
if(progress < duration){
window.requestAnimationFrame(fadeIn)// 递归
}
})
十一 封装自己方法
const $ = function $(selector, context = document) {
const elements = Array.from(context.querySelectorAll(selector))
return {
elements,
html(newHtml){
this.elements.forEach(element => {
element.innerHTML = newHtml
})
},
css (newCss) {
this.elements.forEach(element => {
Object.assign(element.style, newCss)
})
return this
},
on (event, handler, options){
this.elements.forEach(element => {
element.addEventListener(event, handler, options)
})
return this
}
}
}
原生js操作DOM基础-笔记的更多相关文章
- 框架操作DOM和原生js操作DOM比较
问题引出 对于Angular和React操作DOM的速度,和原生js操作DOM的速度进行了一个比较: 一个同学做的demo 代码如下: <!DOCTYPE html> <html n ...
- 原生js操作Dom节点:CRUD
知识点,依然会遗忘.我在思考到底是什么原因.想到研究生考试准备的那段岁月,想到知识体系的建立,知识体系分为正向知识体系和逆向知识体系:正向知识体系可以理解为教科书目录,逆向知识体系可以理解考试真题. ...
- 原生js操作dom的方法
今天学习了原生js的dom节点的操作,就记录下来,仅供自己以后参考. 1)创建节点:除了可以使用createElement创建元素,也可以使用createTextNode创建文本节点. documen ...
- 原生Js操作DOM
查找DOM .querySelectorAll(),它接受包含一个CSS选择器的字符串参数,返回一个表示文档中匹配选择器的所有元素的NodeList元素. .querySelector(),返回第一个 ...
- 原生js 操作dom
1.一些常用的方法 obj.getElementById() 返回带有指定 ID 的元素. obj.getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节 ...
- 原生js操作Dom命令总结
常用的dom方法 document.getElementById(“box”);//通过id获取标签 document.getElementsByTagName(“div”);根据标签名获取页面 ...
- 原生js操作dom备忘
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- 【JavaScript实用技巧(二)】Js操作DOM(由问题引发的文章改版,新人大佬都可)
[JavaScript实用技巧(二)]Js操作DOM(由问题引发的文章改版,新人大佬都可!) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人 ...
- 使用原生 JavaScript 操作 DOM
原文:https://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/ 微软官方放弃了 IE10-,所以现在可以放心使用 ...
随机推荐
- if else 和 or 的新用法
a = 1b = 2c = a if a > b else b print(c)print(id(c))print(id(b)) 条件为真返回前面的为假返回后面的 a = 0 b = 2 c = ...
- [原创] 项目 watch EMFILE 报错处理过程
目录 事件 处理过程 参考资料 小知识点 单进程文件句柄限制 系统总文件句柄限制 inotify 文件系统事件监控 事件 公司XX游戏 S114服启动失败(使用 pomelo - node.js 框架 ...
- css属性详解和浮动
一.CSS属性组成和作用 属性:属性值 1)每个css样式都必须由两部分组成:选择符和声明 注:声明又包括属性和属性值 2)css属性:属性是指定选择符具有的属性,他是css的核心,css2共有150 ...
- 动态树Link-cut tree(LCT)总结
动态树是个好玩的东西 LCT题集 预备知识 Splay 树链剖分(好像关系并不大) 动态树(Link-cut tree) 先搬dalao博客 什么是LCT? 动态树是一类要求维护森林的连通性的题的总称 ...
- css实现视觉差的滚动
之前在逛知乎的时候,发现知乎app首页中偶尔掺杂的广告图片,都是做的视觉差的效果,广告图片的向上速度明显比外面页面的上拉速度慢了很多,看起来很炫酷,然后在网上看了下,发现有很多js插件可以实现这种效果 ...
- (转)Shell分析服务器日志
一.目录 转载链接:https://mp.weixin.qq.com/s/W1ekSiHgbGInqQ9HmZaJDA 自己的小网站跑在阿里云的ECS上面,偶尔也去分析分析自己网站服务器日志,看看网站 ...
- PL/SQL 游标
本随笔不是原创,只是学习笔记,用于加深记忆,原创地址PL/SQL --> 游标 一.游标的相关概念和特性 1.定义: 映射到结果集中的某一行的特定位置,类似与C语言中的指针.即通过游标方式定位到 ...
- 关于重绘and重排
在研究CSS3动画性能的时候,看到了重排两个字. 突然想到自己虽然听说过这么个东东,但一直也没深入研究之. 趁着当下正好有研究的劲头,所以一不做二不休,把这个point也给学习了. 同样是一番查找资料 ...
- Linux 线程实现机制分析--转
http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 一.基础知识:线程和进程 按照教科书上的定义,进程是资源管理的最小单位,线程是程 ...
- C#基本语法 - .Net 4.0 之 Dynamic 动态类型
一..net4.0主要新特性 .Net4.0在.Net3.5基础上新增的主要特性有:可选参数.命名参数和Dynamic.具体请阅生鱼片的这篇博文.这里我们着重讲解C#4.0的Dynamic特性,对 ...