原文参考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基础-笔记的更多相关文章

  1. 框架操作DOM和原生js操作DOM比较

    问题引出 对于Angular和React操作DOM的速度,和原生js操作DOM的速度进行了一个比较: 一个同学做的demo 代码如下: <!DOCTYPE html> <html n ...

  2. 原生js操作Dom节点:CRUD

    知识点,依然会遗忘.我在思考到底是什么原因.想到研究生考试准备的那段岁月,想到知识体系的建立,知识体系分为正向知识体系和逆向知识体系:正向知识体系可以理解为教科书目录,逆向知识体系可以理解考试真题. ...

  3. 原生js操作dom的方法

    今天学习了原生js的dom节点的操作,就记录下来,仅供自己以后参考. 1)创建节点:除了可以使用createElement创建元素,也可以使用createTextNode创建文本节点. documen ...

  4. 原生Js操作DOM

    查找DOM .querySelectorAll(),它接受包含一个CSS选择器的字符串参数,返回一个表示文档中匹配选择器的所有元素的NodeList元素. .querySelector(),返回第一个 ...

  5. 原生js 操作dom

    1.一些常用的方法 obj.getElementById() 返回带有指定 ID 的元素. obj.getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节 ...

  6. 原生js操作Dom命令总结

    常用的dom方法 document.getElementById(“box”);//通过id获取标签    document.getElementsByTagName(“div”);根据标签名获取页面 ...

  7. 原生js操作dom备忘

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  8. 【JavaScript实用技巧(二)】Js操作DOM(由问题引发的文章改版,新人大佬都可)

    [JavaScript实用技巧(二)]Js操作DOM(由问题引发的文章改版,新人大佬都可!) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人 ...

  9. 使用原生 JavaScript 操作 DOM

    原文:https://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/ 微软官方放弃了 IE10-,所以现在可以放心使用 ...

随机推荐

  1. java中引用

    java中引用分为,强,弱,虚,软 (1)强引用 使用最普遍的引用.如果一个对象具有强引用,它绝对不会被gc回收.如果内存空间不足了,gc宁愿抛出OutOfMemoryError,也不是会回收具有强引 ...

  2. python全栈开发学习_day2_语言种类及变量

    一.编程语言的分类及python相对其他语言的优势 1)三大语言种类及细分 1.机器语言(低级语言):直接用计算能够理解的二进制进行编写,直接控制计算机硬件. 优点:执行效率高. 缺点:开发效率低,跨 ...

  3. Q438 找到字符串中所有字母异位词

    给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...

  4. windows下hla编译环境配置(转)

    原文地址:http://blog.chinaunix.net/uid-20548989-id-1667169.html HLA简介         HLA,英文"High Level Ass ...

  5. 关于锚点定位,ul设置fixed后,div被覆盖一部分的问题

    例如: 问题: 刚开始的时候 .ul是正常显示的,当页面的滚动条滚动到一定的高度是 ,ul就被设置为 position:fixed:那么 点击 li相对应div就会被 固定定位的ul覆盖住一部分. 解 ...

  6. Hive中 使用 Round() 的坑

    有个算法如下: SELECT MEMBERNUMBER, ROUND(SUM(SumPointAmount)) AS VALUE FROM BSUM_CRMPOINT WHERE UPPER(POIN ...

  7. springboot+自定义注解实现灵活的切面配置

    利用aop我们可以实现业务代码与系统级服务例如日志记录.事务及安全相关业务的解耦,使我们的业务代码更加干净整洁. 最近在做数据权限方面的东西,考虑使用切面对用户访问进行拦截,进而确认用户是否对当前数据 ...

  8. Fiddler模拟发送post请求

    fiddler在进行接口测试时,会模拟post请求,发送不同的请求参数,返回不同的结果,今天我们就来分享一下,怎么用Fiddler工具模拟post请求: 打开Fiddler工具,在右侧点击“compo ...

  9. 解决eclipse下tomcat启动超时

  10. Object-c 中的数据类型

    导航:  基本类型  ID 对象类型常见的有 对象类型 -NSLog -NSNumber -NSString和NSMutableString -NSArray和NSMutableArray -NSSe ...