走进javascript——被忽视的DOM方法和属性
isEqualNode()
isEqualNode方法可以用来判断两个DOM节点是否相同,给我的第一感觉是没用,因为两个DOM的比较很容易让人想成是字符串的比较,心想直接用两个等号不就可以了吗,但马上感觉不对,因为DOM是对象!两个不同的对象是不可能相等的,比如这段
var obj = {};
var obj2 = {};
console.log(obj==obj2);//false
可以看到两个对象是不等的,就算是长得一模一样,那么DOM是不是对象呢?我们打印一下
<div id="div1">11111</div>
<div id="div2">22222</div>
<script>
var div1 = document.getElementById("div1");
console.log(typeof div1); //object
</script>
也就是说DOM确实是对象,因此是不能直接比较两个DOM是否相同的,下面用isEqualNode函数来比较一下
<div>11111</div>
<div>11111</div>
<script>
var divs = document.getElementsByTagName("div");
console.log(divs[0].isEqualNode(divs[1])); //true
</script>
这个函数和一般的比较还有所不同,它比较智能,元素的属性顺序可以不同,如下
<div data-a="a" data-b="b">11111</div>
<div data-b="b" data-a="a">11111</div>
<script>
var divs = document.getElementsByTagName("div");
console.log(divs[0].isEqualNode(divs[1])); //true
</script>
尽管元素的属性位置不一样,但isEqualNode函数依然返回true
要说这个isEqualNode没用呢,还真有用的地方,我们知道DOM渲染是比较消耗性能的,如果我们用这个属性事先判断一下这两个DOM是否相同,如果相同就不更新DOM,代码如下
<input type="text" id="text">
<div>111</div>
<script>
var oDiv = document.getElementsByTagName("div");
var text = document.getElementById("text");
text.addEventListener("blur",function(){
var div = document.createElement("div");
div.innerHTML = this.value;
if(!(oDiv[0].isEqualNode(div))){
document.body.appendChild(div);
}
},false);
</script>

React中的虚拟DOM,就可以用这个函数来判断,通过这个函数,我们可以做到只更新需要更新的DOM,而不必去把所有的DOM都给更新。
matches()
matches方法可以用来判断当前元素是否能被指定的css选择器查找到,也就是我们写的css选择器是否能够找到当前这个元素,举个例子
<div id="box">
<p>
<em></em>
</p>
</div>
<script>
var em = document.querySelector("em");
console.log(em.matches("#box p > em")); //true;
console.log(em.matches("#box div em")); //false;
</script>
在事件委托中,我们经常需要去过滤某些元素,而这时这个方法就可以派上用场,比如下面这个例子
<div id="box">
<div class="left">left</div>
<div class="right">right</div>
</div>
<script>
var box = document.querySelector("#box");
box.addEventListener("click",function(event){
if(event.target.matches("#box .left")){
console.log(event.target);
}
});
</script>
虽然通过判断标签名,class等等也可以实现同样的效果,但有了这个方法,实现起来就简单的多了,如果你觉得这个例子不感冒,那么下面这段代码,你应该用过吧?
$(document).on("click","#box a",function(){
});
其中第二个参数就是用来过滤元素的,如果要实现这个方法,我们就可以用matches。
normalize()
normalize() 方法移除空的文本节点,并连接相邻的文本节点。
这个方法将遍历当前节点的所有子孙节点,通过删除空的 Text 节点,已经合并所有相邻的 Text 节点来规范化文档。该方法在进行节点的插入或删除操作后,对于简化文档树的结构很有用。
lastModified
document.lastModified可以返回文档最后修改的日期,不过你很快会发现它并不准,因为对于动态网站来说,这个属性返回的是当前时间,也正是因为这个原因,我们可以用它来判断一个页面是静态的还是动态的,以下是在本地页面测试的结果

而如果是一个动态的网站,则会出现下面这种情况

因此我们可以用这个属性来判断一个网站是静态的还是动态的,但这个属性获取到的值也并不是特别准确,如果要求不是特别高的话,可以用这个方法试试。
scrollIntoView()
Element.scrollIntoView()方法让当前的元素滚动到浏览器窗口的可视区域内,使用请看MDN上的教程
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollIntoView
走进javascript——被忽视的DOM方法和属性的更多相关文章
- javascript中数组常用的方法和属性
前言 在javascript中,数组是一种非常重要的数据类型,我们时常会和它打交道,最近在开发项目中频繁的使用到数组,但是自己对数组的众多方法已经是非常模糊了,为了方便自己以后能够更好的使用数组中的属 ...
- JavaScript面向对象:类、方法、属性
JavaScript是一种基于对象的语言,与传统面向对象语言(C#.C++)相比,JavaScript中没有类的概念,其继承有两种基本形式:基于对象的继承和基于类型的继承(原型链继承).无论哪种形式的 ...
- javascript学习 真正理解DOM脚本编程技术背后的思路和原则
本文学习来源于<javascriptDOM编程艺术>仅作笔记 学会怎样才能利用DOM脚本编程技术以一种既方便自己更体贴用户的方式去充实和完善你们的网页. 循序渐进:从最核心的内容开始,逐步 ...
- 走进javascript——DOM事件
DOM事件模型 在0级DOM事件模型中,它只是简单的执行你为它绑定的事件,比如你为某个元素添加了一个onclick事件,当事件触发时,它只是去调用我们绑定的那个方法,不再做其他的操作. 在2级DOM事 ...
- javascript插入before(),after()新DOM方法
随着web的技术突飞猛进的发展.HTML5 ES6等新技术的发展,与此同时DOM等标准也在悄悄的进步,各大浏览器也在悄悄的发展适配新的属性和方法,今天我们来看看Javascript新的DOM的方法 二 ...
- JavaScript之旅(DOM)
JavaScript之旅(DOM) [TOC] 一.认识DOM 什么是 DOM? DOM 是 Document Object Model(文档对象模型)的缩写. DOM 是 W3C(万维网联盟)的标准 ...
- DOM – (w3school)1.DOM 方法 + 2.DOM属性 + 3.DOM 元素
1.DOM 方法 一些 DOM 对象方法 这里提供一些您将在本教程中学到的常用方法: 方法 描述 getElementById() 返回带有指定 ID 的元素. getElementsByTa ...
- Jquery中$(document).ready()与传统JavaScript中的window.onload方法的区别(2016/8/3)
Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 ...
- JavaScript中事件绑定的方法总结
最近收集了一些关于JavaScript绑定事件的方法,汇总了一下,不全面,但是,希望便于以后自己查看. JavaScript中绑定事件的方法主要有三种: 1 在DOM元素中直接绑定 2 JavaScr ...
随机推荐
- Chapter15 Principles of Metabolic Regulation
15.1 调节代谢的通路 (1)细胞和有机体维持着动态稳定 调节作用的基因多 2500个 12% 激酶占比多 300个 一个通路受到多方调节 (2)酶的数量和催化活性 可以被调节 反应物的调控 糖酵解 ...
- 20145232 韩文浩 《Java程序设计》第1周学习总结
教材学习内容总结 看到已经有人学到了第四章,真是_(:з」∠)_ 于是我也开始了我的Java之旅. 首先学习了几常见的dos命令行方式 dir: 列出当前目录下所有文件及文件夹 md :创建目录 rd ...
- eclipse/sublime 等宽字体设置
转载请注明出处:http://www.cnblogs.com/wubdut/p/4621889.html 使用ubuntu14.04会产生很多想日犬的地方.大家一般习惯于使用 eclipse 进行 j ...
- 关于QT应用在XP系统上兼容运行的问题
修改兼容XP: 1. 项目属性->配置属性->平台工具集:Visual Studio 2013 - Windows XP (v120_xp) 2. C/C++ 属性-> 代码生成-& ...
- Hadoop读写流程
写流程 读流程 HDFS写数据流程 HDFS读数据流程 网络拓扑-节点距离计算 节点距离:两个节点到达最近的共同祖先的距离总和
- bootstrap增删改查
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- 创建Pods私有库
Pods私有库创建步骤 创建私有 Spec Repo 创建Pod项目工程文件 创建podspec文件 本地测试podsspec文件 向Spec Repo提交podspec Pod库使用 更新维护pos ...
- Apache中 RewriteCond 规则参数介绍
RewriteCond指令定义了规则生效的条件,即在一个RewriteRule指令之前可以有一个或多个RewriteCond指令.条件之后的重写规则仅在当前URI与Pattern匹配并且满足此处的条件 ...
- linecache
linecache是专门支持读取大文件,而且支持行式读取的函数库. linecache 预先把文件读入缓存起来,后面如果你访问该文件的话就不再从硬盘读取.对于大文件的读取效率还不错 Help on m ...
- Facebook内部报告:争取青少年用户的鸡贼小技巧
翻译:吴祺深 欢迎访问网易云社区,了解更多网易技术产品运营经验. 去年十月,Facebook收购了TBH,最后却关闭了这款APP,不过一则内部报告透露了,通过这款流行的投票APP,这家公司学会了如何去 ...