原生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-,所以现在可以放心使用 ...
随机推荐
- 无法下载APP
最近遇见下面的情况两次,各种搜索过资料,但是都没什么结果,把自己的解决方法分享如下: 实践证明,出现这个问题,应该是出现了下面几方面原因: 第一次遇见上述问题,是年后来到公司接手了新项目,然后不久传来 ...
- C: City----逆向并查集
C: City 时间限制: 1 s 内存限制: 128 MB 题目描述 如果城市A和城市B互通,城市B和城市C互通,那么城市A和城市C也互通,A.B.C三个城市算一个聚集点.先 ...
- Python3.0版本 从听说python可以做爬虫到自己第一成功做出爬虫的经历
前言 我自己是个python小白,工作也不是软件行业,但是日常没事时喜欢捣鼓一些小玩意,自身有点C语言基础. 听说python很火,可以做出爬虫去爬一些数据图片视频之类的东东,我的兴趣一下子就来了.然 ...
- iview modal对话框的一个小知识点
我在做一个项目的一个页面的时候有两个弹窗,发现点击一个弹窗的右上角关闭按钮后,打开另一个弹窗的时候,另一个弹窗里面带有上一个弹窗里的样式内容,说明上一个弹窗并没有被销毁. 后来发现modal源码里的c ...
- es中的date类型
JSON中没有date类型,es中的date可以由下面3种方式表示: ①格式化的date字符串,例如"2018-01-01"或者"2018-01-01 12:00:00& ...
- 微信小程序踩坑
微信小程序自定义属性data-xx使用注意事项 data-xx采用驼峰式命名时,数据传递打印显示(以jxsName与jxsname打印显示对比) data-xx全小写命名时,数据传递打印显示
- redux-thunk, redux-logger 阮一峰 ( react中间件 )
http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_two_async_operations.html Redux 入门教程(二):中 ...
- 使用group by rollup和group by cube后的辅助函数
本文主要介绍,报表在使用group by rollup和group by cube后的辅助函数. CREATE TABLE TEST8 ( "ID" NUMBER, "O ...
- c# 短链接生成
public static string GetShortUrl(string url) { //可以自定义生成MD5加密字符传前的混合KEY string key = DateTime.Now.To ...
- OpenCV文本图像的旋转矫正
用户在使用Android手机拍摄过程中难免会出现文本图像存在旋转角度.这里采用霍夫变换.边缘检测等数字图像处理算法检测图像的旋转角度,并根据计算结果对输入图像进行旋转矫正. 首先定义一个结构元素,再通 ...