DOM扩展

DOM标准扩展最开始都是来自各个浏览器的自定义扩展DOM的功能,后被收录为标准的DOM相关API。

本笔记只记录被各大浏览器支持的标准扩展,对于特定浏览器的专有扩展不讨论。

选择符API

我们知道,在JS获取一个元素时一般通过id查找(使用getElementById方法),或者通过标签查找(使用getelementsByTagName方法),在实际使用中,我们更希望可以通过类似CSS选择器的方式来查找到需要的元素,JS的选择符API就可以满足我们的需求。

querySelector

该方法接收一个CSS选择符,返回匹配该模式的第一个匹配项,如果没有匹配项则返回null。

 //获取body元素
var body = document.querySelector("body");
//获取ID为"myDiv"的元素
var r = document.querySelector("#myDiv");
//获取类为"myClass"的元素
var r = document.querySelector(".myClass");
//获取类为"button"的第一个Img元素
var r = document.querySelector("img.button");

需要注意的是如果传递了不支持的选择符,方法会报错。

querySelectorAll

和上面的方法功能类似,不一样的是会返回匹配的所有项目数组,如果没有则返回一个空数组。

 //获取myDiv中所有em元素
var ems = document.getElementById("myDiv").querySelectorAll("em");
//获取类为myClass的所有元素
var r = document.querySelectorAll(".myClass");
//获取所有p元素中的div元素
var r = document.querySelectorAll("p div");

得到的数据通过遍历即可处理单个元素。

matchesSelector

判断指定元素是否和CSS选择器匹配,如果匹配返回true,否则返回false。

 if (document.body.matchsSelector(".myClass")) {
//...
}

可以在实际获取元素之前进行匹配判断。

元素遍历

当我们需要对子元素进行遍历的时候,可以使用下面的API:

  • childElementCount:获取子元素数量,忽略文本节点和注释。
  • firstElementChild:第一个子元素,firstChild的元素版本。
  • lastElementChild:最后一个子元素,lastChild的元素版本。
  • previousElementChild:同级的上一个元素,previousSibling的元素版本。
  • nextElementChild:同级的下一个元素,nextSibling的元素版本。

需要注意的是,这些方法在老浏览器中并不支持,如IE8,Firefox3.5以下等。

我们先看看可以跨老版本浏览器的写法:

 var child = element.firstChild;
do {
if (child.nodeType == 1) {
processChild(child);
}
child = child.nextSibiling;
} while (child != element.lastChild);

下面是新的元素遍历写法:

 var child = element.firstElementChild;
do {
processChild(child);
child = child.nextElementSibiling;
} while (child != element.lastElementChild);

实际上可以省略掉是否为元素的判断。

样式相关扩充

在HTML5中新增了许多API来简化对文档的操作,曾经需要第三方类库才能实现的功能得到了更高效的原生实现。

getElementsByClassName

根据CSS类名获取所有元素,可以传递多个类名,用空格分隔。

使用该方法可以方便的为指定的一种类型的所有元素统一进行处理,不需要使用id或者子元素遍历的方法了。

焦点管理

通过调用元素的focus方法可以使该元素获得焦点。

document.activeElement可以得到当前获取了焦点的元素。

document.hasFocus方法可以判断指定元素是否获得焦点。

文档模式

在IE中,存在两种文档模式,CSS1Compat表示标准模式,而BackCompat表示混合模式。

通过document.compatMode可以判断当前属于那种模式下,不同的模式下获取浏览器网页客户区的宽高、滚动条宽高、滚动条Left和Top的代码是有差异的,通用的处理函数如下:

 if (document.compatMode == "BackCompat") {
cWidth = document.body.clientWidth;
cHeight = document.body.clientHeight;
sWidth = document.body.scrollWidth;
sHeight = document.body.scrollHeight;
sLeft = document.body.scrollLeft;
sTop = document.body.scrollTop;
} else { //document.compatMode == "CSS1Compat"
cWidth = document.documentElement.clientWidth;
cHeight = document.documentElement.clientHeight;
sWidth = document.documentElement.scrollWidth;
sHeight = document.documentElement.scrollHeight;
sLeft = document.documentElement.scrollLeft == 0 ? document.body.scrollLeft : document.documentElement.scrollLeft;
sTop = document.documentElement.scrollTop == 0 ? document.body.scrollTop : document.documentElement.scrollTop;
}

现在文档模式也被纳入到HTML5的标准中了。

字符集处理

HTML5中新增了对当前页面进行字符集处理的函数。

现在设定页面的字符集有以下3个方式:

  • HTTP响应头部设置,一般用在后端语言中设定;
  • 页面嵌入如下标签:<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>;
  • 通过JS设定document.charset = "UTF-8";

另外添加了document.defaultCharset属性,可以获取浏览器默认的字符集。

自定义属性

在标签中,我们可以定义自己的属性,该方法兼容所有浏览器:

 <p id="myP" customData="this is data!">Hello H5!</p>
<script>
var myP = document.getElementById("myP"); // 标准写法
console.log(myP.hasAttribute("customData")); // true
console.log(myP.getAttribute("customData")); // this is data!
myP.setAttribute("customData", 100);
console.log(myP.getAttribute("customData")); // 100 // IE
alert("customData" in myP);
alert(myP.customData);
myP.customData = "this is data!";
alert(myP.customData);
</script>

另外在HTML5中,也提供了自定义的数据属性,需要添加data-前缀,使用元素的dataset属性访问自定义的属性,如下:

 <p id="myP" data-custom="this is data!">Hello H5!</p>
<script>
var myP = document.getElementById("myP"); console.log(myP.dataset.hasOwnProperty("custom")); // true
console.log(myP.dataset.custom); // this is data!
myP.dataset.custom = 100;
console.log(myP.dataset.custom); // 100
</script>

需要注意的是data-自定义属性的方法并不被所有浏览器支持。

插入标记(innerHTML)

虽然DOM为操作节点提供了丰富的API,但是如果纯使用DOM的API来操作节点会显得非常的繁琐,在早期IE就提供了直接使用HTML标签字符串添加DOM的属性innerHTML和outterHTML,现在这两个属性已经成为了HTML5中的标准。

innerHTML

读取或设置指定元素的所有子元素HTML标记字符串,如下:

 <div id="myDiv" onclick="onClick();">
<p>Hello H5!</p>
</div>
<script>
function onClick() {
var myDiv = document.getElementById("myDiv");
console.log(myDiv.innerHTML); // <p>Hello H5!</p>
myDiv.innerHTML = "<h1>This is H1</h1>";
}
</script>

需要注意的是,设定innerHTML相当于替换子元素为设定的元素。

outerHTML

和innerHTML不同,outerHTML会给出自身元素及子元素。

 <div id="myDiv" onclick="onClick();">
<p>Hello H5!</p>
</div>
<script>
function onClick() {
var myDiv = document.getElementById("myDiv");
console.log(myDiv.outerHTML); // <div id="myDiv" onclick="onClick();"><p>Hello H5!</p></div>
myDiv.outerHTML = "<h1>This is H1</h1>";
}
</script>

需要注意的是,当元素存在事件监听时需要提前移除事件监听,再改变内部元素。

insertAdjacentHTML

该方法可以动态的插入一段HTML文本,而不修改已经存在的元素,第一个参数接受下面的值:

  • beforebegin:在当前元素之前插入元素。
  • afterBegin:在第一个子元素之前插入元素。
  • beforeend:在最后一个子元素之后插入元素。
  • afterend:在当前元素之后插入元素。

第二个参数为要插入的HTML文本。

HTML5学习笔记(二十四):DOM扩展的更多相关文章

  1. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  2. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

  3. Java基础学习笔记二十四 MySQL安装图解

    .MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Compl ...

  4. Java学习笔记二十四:Java中的Object类

    Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...

  5. PHP学习笔记二十四【Get Set】

    <?php Class Person{ private $n1; private $n2; private $n3; //使用__set方法来管理所有的属性 public function __ ...

  6. HTML5学习笔记(十四):变量作用域

    在JavaScript中,用var申明的变量实际上是有作用域的. 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量: function foo() { var x ...

  7. angular学习笔记(二十四)-$http(2)-设置http请求头

    1. angular默认的请求头: 其中,Accept 和 X-Requested-With是$http自带的默认配置 Accept:application/json,text/plain       ...

  8. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  9. 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用

    目录 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用 24.1 expect实现无交互登录 24.1.1 安装和使用expect 24.2 正则表达式的使用 24 ...

  10. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

随机推荐

  1. LVM逻辑卷管理测试——逻辑卷扩展、收缩、快照及删除

    一.逻辑卷扩展 [root@lxjtest /]# umount /testLVM/ [root@lxjtest /]# df -h Filesystem Size Used Avail Use% M ...

  2. Arduino从DHT11读取温湿度数据并显示在1602LCD

    硬件清单 Arduino NANO1602LCD + PCF8574T模块YL-47 DHT11模块 连线 1. 连接LCD: PCF8574T模块4pin(Gnd, Vcc, SDA i2c数据, ...

  3. m4, autoconf

    http://www.gnu.org/software/m4/m4.html GNU M4 is an implementation of the traditional Unix macro pro ...

  4. windows下Oracle Tuxedo编译应用前需要配置的相关环境变量

    rem (c) BEA Systems, Inc. All Rights Reserved. rem Copyright (c) BEA Systems, Inc. rem All Rights Re ...

  5. win32获取浏览器当前Tab的URL

    代码都是win10上测试的 1. 获取IE的URL,Enum IE窗口的子句柄,找到className为Edit的句柄,然后用SendMessage WM_GETTEXT消息来获取: 上代码: #in ...

  6. input文本框在div中居中

    {display:block;margin-left:auto;margin-right:auto;}

  7. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  8. ubuntu sublime 破解

    1.去其官方网站http://www.sublimetext.com/ 把linux版下载下来,解开压缩包,放在你希望的路径下. 2.用vim将其打开 . vim sublime_text 3.将文件 ...

  9. 导致线程死锁容易忽略的一点 SendMessage

    假如主线程 某一个按钮 点击的 响应要操作与另一个线程共享的 变量. 在这个点击响应里先lock 之后,假如另一个线程的变量正在 “使用”状态,并且内部又调用了SendMessage试图更新界面的某些 ...

  10. 【RS】Local Low-Rank Matrix Approximation - LLORMA :局部低秩矩阵近似

    [论文标题]Local Low-Rank Matrix Approximation (icml_2013 ) [论文作者]Joonseok Lee,Seungyeon Kim,Guy Lebanon  ...