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方法和属性的更多相关文章

  1. javascript中数组常用的方法和属性

    前言 在javascript中,数组是一种非常重要的数据类型,我们时常会和它打交道,最近在开发项目中频繁的使用到数组,但是自己对数组的众多方法已经是非常模糊了,为了方便自己以后能够更好的使用数组中的属 ...

  2. JavaScript面向对象:类、方法、属性

    JavaScript是一种基于对象的语言,与传统面向对象语言(C#.C++)相比,JavaScript中没有类的概念,其继承有两种基本形式:基于对象的继承和基于类型的继承(原型链继承).无论哪种形式的 ...

  3. javascript学习 真正理解DOM脚本编程技术背后的思路和原则

    本文学习来源于<javascriptDOM编程艺术>仅作笔记 学会怎样才能利用DOM脚本编程技术以一种既方便自己更体贴用户的方式去充实和完善你们的网页. 循序渐进:从最核心的内容开始,逐步 ...

  4. 走进javascript——DOM事件

    DOM事件模型 在0级DOM事件模型中,它只是简单的执行你为它绑定的事件,比如你为某个元素添加了一个onclick事件,当事件触发时,它只是去调用我们绑定的那个方法,不再做其他的操作. 在2级DOM事 ...

  5. javascript插入before(),after()新DOM方法

    随着web的技术突飞猛进的发展.HTML5 ES6等新技术的发展,与此同时DOM等标准也在悄悄的进步,各大浏览器也在悄悄的发展适配新的属性和方法,今天我们来看看Javascript新的DOM的方法 二 ...

  6. JavaScript之旅(DOM)

    JavaScript之旅(DOM) [TOC] 一.认识DOM 什么是 DOM? DOM 是 Document Object Model(文档对象模型)的缩写. DOM 是 W3C(万维网联盟)的标准 ...

  7. DOM – (w3school)1.DOM 方法 + 2.DOM属性 + 3.DOM 元素

      1.DOM 方法   一些 DOM 对象方法 这里提供一些您将在本教程中学到的常用方法: 方法 描述 getElementById() 返回带有指定 ID 的元素. getElementsByTa ...

  8. Jquery中$(document).ready()与传统JavaScript中的window.onload方法的区别(2016/8/3)

    Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间       ...

  9. JavaScript中事件绑定的方法总结

    最近收集了一些关于JavaScript绑定事件的方法,汇总了一下,不全面,但是,希望便于以后自己查看. JavaScript中绑定事件的方法主要有三种: 1 在DOM元素中直接绑定 2 JavaScr ...

随机推荐

  1. re模块,subprocess模块

    """ RE是什么 正则 表达 式子 就是一些带有特殊含义的符号或者符号的组合 它的作用是对字符串进行过滤 在一堆字符串中找到你所关心的内容 你就需要告诉计算机你的过滤规 ...

  2. java基础-day24

    第01天 java基础加强 今日内容介绍 u Junit单元测试及反射概述 u 反射操作构造方法.成员方法.成员属性 u properties的基本操作 u 综合案例 第1章   Junit单元测试及 ...

  3. Java的String类

    String类 String是引用数据类型:字符串是String类的对象 String类的构造方法 共有13种重载方式,这里只示例常用的几个 String():创建一个空字符串 String(Stri ...

  4. URL中文编码

    /// <summary>        /// GB2312编码        /// </summary>        /// <param name=" ...

  5. hdu 4964 恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4964 给定语句,按照语法翻译html并输出. 就是恶心的模拟,递归搞就行了 处理id和class时,在一个'&g ...

  6. 关于国密算法 SM1,SM2,SM3,SM4 的笔记

    国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位. SM1 为对称加密.其加密强度与AES相当.该算法不公开,调用该算法时,需要通过加密芯片的接 ...

  7. Python自动化开发 - 流程控制

    一.拾遗主题 1.变量 理解变量在计算机内存中的表示 >>> a = "ABC" Python解释器干了两件事情: 在内存中创建了一个'ABC'的字符串: 在内存 ...

  8. [LISP] LISP Collections

    lispbox: https://common-lisp.net/project/lispbox/ SBCL: http://sbcl.org/ <Common Lisp in practica ...

  9. cxGrid 怎样才能让不自动换行 WordWrap:=false

    cxGrid 怎样才能让不自动换行 WordWrap:=false 2014-12-26 02:04:03|  分类: delphi|举报|字号 订阅     下载LOFTER我的照片书  |     ...

  10. redis集群(主从配置)

    市面上太多kv的缓存,最常用的就属memcache了,但是memcache存在单点问题,不过小日本有复制版本,但是使用的人比较少,redis的出现让kv内存存储的想法成为现实.今天主要内容便是redi ...