HTML5

与类相关的扩充

1、getElementsByClassName()方法

改方法接受一个参数,即一个包含一或多个类名的字符串,返回带有指定类的所有元素的NodeList。传入多个类型时,先后顺序不重要。

  1. //取得所有类中包含"username"和"current"的元素,类名的先后顺序不重要
  2. var allCurrentUsername = document.getElementsByClassName('username current');
  3. //取得ID为'myDiv'的元素中都带有类名"selected"的所有元素
  4. var selected = document.getElementById('myDiv').getElementsByClassName('selected');

调用这个方法时,只有位于调用元素子树中的元素才会返回。

2、classList属性

在操作类名时,需要通过className属性添加,删除和替换类名。因为className中是一个字符串,所以即使只修改字符串的一部分,也必须每次都设置整个字符串。HTML5新增加了一种操作类名的方式,那就是为所有元素都添加classList属性。这个classList属性是新集合类型DOMTiokenList的实例。与其他DOM集合类似,DOMTokenList有一个表示自己包含多少元素的length属性,而要取得每个元素可以使用item()方法,也可以使用方括号语法。此外,这个新类型还定义如下方法:

//Alt + 41406、Alt + 41407
【1】add(value):将给定的字符串添加到列表中,如果以存在就不在添加;
【2】contains(value):表示列表中是否存在给定的值,如果存在就返回true,反之返回false;
【3】remove(value):从列表中删除给定的字符串;
【4】toggle(value):如果列表中存在给定的值,删除它,如果列表中没有给定的值,添加它;

  1. //添加"currrent"类
  2. div.classList.add('current');
  3. //切换"user"类
  4. div.classList.toggle('user');

焦点管理

document.activeElement属性,这个属性始终会引用DOM中当前获得了焦点的元素。元素获得焦点的方法通常有页面加载,用户输入和在代码中调用focus()方法。

  1. var button = document.getElementById('myButton');
  2. button.focus();
  3. console.log(document.activeElement === button); //true

默认情况下,文档刚刚加载完成时,document.activeElement的值为document.body,当文档加载时document.activeElement的值为null;

document.hasFocus()方法,这个方法用于确定文档是否获得了焦点;

  1. var button = document.getElementById('myButton');
  2. button.focus();
  3. console.log(documet.hasFocus()); //true

HTMLDocument的变化

HTML5扩展了HTMLDocument,增加了新的功能
1、readyState属性

它有两个可能的值
【1】loading,正在加载文档。
【2】complete,已经加载完文档。

使用document.readyState的最恰当方式,就是通过它来实现一个指示文档已经加载完成的指示器

2、兼容模式

在标准模式下,document.compatMode的值等于"CSS1Compat",而在混杂模式下,document.compatMode的值等于"BackCompat"。

3、head属性

作为对document.body引用文档的<body>元素的补充,HTML5新增了document.head属性,引用文档的<head>元素,要引用文档的<head>元素,可以结合使用这个属性和另一种后备方法。

  1. var head = document.head || document.getElementsByTagName('head')[0];

字符集属性

HTML5新增了几个与文档字符集有关的属性,其中,charset属性表示文档中实际使用的字符集,也可以用来指定新字符集。默认情况下,这个属性的值为"UTF-16";

  1. console.log(document.charset); //"UTF-16"
  2. document.charset = "UTF-8";

另一个属性是defaultCharset,表示根据默认浏览器及操作系统的设置,当前文档默认的字符集应该是什么。如果文档没有默认的字符集,那charset和defaultCharset属性的值可能会不一样,例如:

  1. if(document.charset != document.defaultCharset){
  2. console.log("Custom character set being used.");
  3. }

自定义数据属性

HTML5规定可以为元素添加非标准的属性,但要添加前缀data-,目的是为元素提供与渲染无关的信息,或者提供语义信息。这些属性可以任意添加、随便命名,只要以data-开头即可

  1. <div id="myDiv" data-appid="12345" data-myname="Nicholas"></div>

添加了自定义属性后,可以通过dataset属性来访问自定义属性的值,只不过属性名没有data-前缀

  1. var div = document.getElementById('myDiv');
  2.  
  3. //取得自定义属性的值
  4. var appid = div.dataset.appid;
  5. var myName = div.dataset.myName;
  6.  
  7. //设置值
  8. div.dataset.appid = 23456;
  9. div.dataset.myName = "Michael";

如果需要给元素添加一些不可见的数据以便进行其他处理,那就要用到自定义数据属性

插入标记

在读模式下,innerHTML属性会返回与调用元素的所有子节点(包括元素、注释和文本节点)对应的HTML标记;在写模式下,innerHTML会根据指定的值创建新的DOM树,然后用这个DOM树完全替换调用元素原先的所有子节点;下面是一个例子

  1. <div>
  2. <p>This is a <strong>paragraph</strong>with a list following it.</p>
  3. <ul>
  4. <li>Item 1</li>
  5. <li>Item 2</li>
  6. <li>Item 3</li>
  7. </ul>
  8. </div>

对于上面的<div>来说,他的innerHTMl属性会返回如下字符串。

  1. <p>This is a <strong>paragraph</strong>with a list following it.</p>
  2. <ul>
  3. <li>Item 1</li>
  4. <li>Item 2</li>
  5. <li>Item 3</li>
  6. </ul>

不要指望所有浏览器返回的innerHTML值完全相同,使用innerHTML属性也有一些限制。比如,在大多数浏览器中,通过innerHTML插入<script>元素并不会执行其中的脚本。但IE8除外,但是也有要求:
【1】必须为<script>元素指定defer属性
【2】<script>元素必须位于"有作用域的元素"之后(<script>元素被认为是"无作用域的元素",也就是在页面中看不到,与<style>或注释类似)

下面的代码达不到目的:

  1. div.innerHTML = "<script defer>alert('hi')<\/script>";

要想达到目的就要在前面添加一个"有作用域的元素",可以使一个文本节点,也可以是一个没有结束标签的元素例如<input>,下面的代码都能执行;

  1. div.innerHTML = "_<script defer>alert('hi')<\/script>";
  2. div.innerHTML = "<div>&nbsp;</div><script defer>alert('hi')<\/script>";
  3. div.innerHTML = "<input111<script defer>alert('hi')<\/script>";

2、outerHTML属性

在读模式下,outerHTML返回调用它的元素及所有子节点的HTML标签。在写模式下,outerHTML会根据指定的HTML字符串创建新的DOM子树,然后用这个DOM子树完全替换调用元素

  1. <div>
  2. <p>This is a <strong>paragraph</strong>with a list following it.</p>
  3. <ul>
  4. <li>Item 1</li>
  5. <li>Item 2</li>
  6. <li>Item 3</li>
  7. </ul>
  8. </div>

如果在div上调用outerHTML,会返回上述所有代码,包括div;不过,由于浏览器解析和解释HTML标记的不同,结果也可能有所不同;(这里的不同于使用innerHTML属性时存在的差异是一样的)

  1. div.outerHTML = "<p>This is a paragraph.</p>";

这行代码完成的操作与下列代码是一样的

  1. var p = document.createElement('p');
  2. p.appendChild(documetn.createTextNode("This is a paragraph"));
  3. div.parentNode.replaceChild(p,div);

结果,就是新创建的<p>元素会取代DOM树中的<div>元素

3、insertAdjacentHTML()方法

它接受两个参数:插入位置和要插入的HTML文本;第一个参数必须是下列值之一:

beforebegin:在当前元素前插入一个同辈元素;
afterbegin:在当前元素之下插入一个新的子元素或在第一个子元素之前再插入新的子元素
beforeend:在当前元素之下插入一个新的子元素或在最后一个子元素之前再插入新的子元素
afterend:在当前元素之后插入一个同辈元素;

  1. //作为第一个子元素插入
  2. element.insertAdjacentHTML("afterbegin","<p>Hello world!</p>");

scrollIntoView()方法

scrollIntoView()方法可以再所有HTML元素上调用,通过滚动浏览器窗口或某个容器元素,调用元素就可以出现在视口中。如果给这个方法传入true或者不传入任何参数,那么窗口滚动之后会让调用元素的顶部和视口顶部尽可能齐平。如果传入false作为参数,调用元素会尽可能全部出现在视口中

  1. //让元素可见
  2. document.forms[0].scrollIntoView();

专有扩展

children属性

children属性是HTMLCollection的实例,只包含元素中同样还是元素的子节点。除此之外children属性与childNodes没有什么区别。

contains()方法

这个方法接受一个参数,即要检测的后代节点。如果被检测的节点是后代节点,该方法返回true;否则返回false。调用contains()方法的应该是祖先节点。

  1. console.log(document.documentElement.contains(document.body)); //true

使用DOM Level 3 compareDocumentPosition()也能够确定节点间的关系,它会返回一个表示该关系的位掩码

1:无关
2:居前
4:居后
8:包含
16:被包含

 

插入文本

1、innerText属性

innerText读取值时,它会按照由浅入深的顺序,将子文档树中的所有文本拼接起来。在通过innerText写入值时,结果会删除元素的所有子节点,插入包含相应文本值的文本节点,如下:

  1. <div>
  2. <p>This is a <strong>paragraph</strong>with a list following it.</p>
  3. <ul>
  4. <li>Item 1</li>
  5. <li>Item 2</li>
  6. <li>Item 3</li>
  7. </ul>
  8. </div>

对于div而言,它的innerText属性会返回下列字符串

This is a paragraph
Item 1
Item 2
Item 3

不同的浏览器处理空白符的方式不同,可能输出的文本可能不会包含原始HTML代码中的缩进

  1. div.innerText = "Hello world";

执行这段代码后,页面就会变成如下所示:

  1. <div id="content">Hello world!</div>

注意:Firefox虽然不支持innerText,但支持作用类似的textContent属性

2、outerText属性

除了作用范围扩大到了包含调用它的节点之外,outerText与innerText基本上没有多大区别。在读取文本值时,outerText与innerText的结果完全一样。但在写模式下,outerText就完全不同了;outerText不只是替换调用它的元素的子节点,而是会替换整个元素。

DOM扩展-HTML5、专有扩展的更多相关文章

  1. DOM扩展之 专有扩展

    11.4.3 contains() 方法 用来确定某个节点是不是另一个节点的后代. 注:a.contains(a) 也是返回true.说明contains方法搜索是从自身开始的. DOM Level ...

  2. PHP7 学习笔记(一)Ubuntu 16.04 编译安装Nginx-1.10.3、 PHP7.0.9、Redis3.0 扩展、Phalcon3.1 扩展、Swoole1.9.8 扩展、ssh2扩展(全程编译安装)

    ==================== PHP 7.0 编译安装================== wget http://cn2.php.net/get/php-7.0.9.tar.bz2/fr ...

  3. 理解水平扩展和垂直扩展 (转载 http://yunjiechao-163-com.iteye.com/blog/2126981)

      当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展.选用哪种策略主要依赖于要解决的问题 以及系统资源的限制.在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点.如果你已经 ...

  4. Web 站点的水平扩展和垂直扩展 (译文)

    当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展.选 用哪种策略主要依赖于要解决的问题以及系统资源的限制.在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点.如果你已经有一 ...

  5. 使用扩展方法(this 扩展类型)

    namespace ConsoleApp_UseExtendWays{ class Program { static void Main(string[] args) { Student s = ne ...

  6. 如何正确看待Linq的DistinctBy扩展和ForEach扩展

    在微软标准的Linq中,并没有DistinctBy扩展和ForEach扩展,但在平时使用工作中却又经常需要使用到这两个功能,照理来说,微软在Linq中应该包含这两个扩展才对,可事实上为什么并没有呢?本 ...

  7. 在 Windows Azure 网站中进行纵向扩展和横向扩展

    编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Byron Tardif 撰写. 当您开始一个新的 Web 项目,或者刚刚开始开发一般的网站和应用程序时,您可能希望从小处着手. ...

  8. AutoCAD中的扩展字典及扩展记录(C#)

    在学习CAD扩展记录的过程中,遇到了一些问题,也积累了一些经验,现在给大家分享一些我的学习心得.在学习扩展字典之前需要读者了解cad的组码,也就是DxfCode.感兴趣的也可以了解一下扩展数据的相关内 ...

  9. Memcache服务器端+Redis服务器端+PHP Memcache扩展+PHP Memcached扩展+PHP Redis扩展+MemAdmin Memcache管理工具+一些概念(更新中)

    Memcache和Redis因为操作简单,是我们常用的服务器数据缓存系统,以下文字仅作备忘记录,部份转载至网络. 一.定义 1.Memcache Memcache是一个高性能的分布式的内存对象缓存系统 ...

随机推荐

  1. BZOJ4455: [Zjoi2016]小星星

    Description 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细 线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这 ...

  2. 如何查看bash shell 帮助信息?

    man bash 查看bash的命令帮助 info bash 查看bash的文档 help 命令显示bash支持的命令: 如果想看某个命令的帮助可以 help 命令.如 help cd 对bash的命 ...

  3. Hibernate中Criteria的完整用法

    1,CriteriaHibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria .2,De ...

  4. JS中检测数据类型的几种方式及优缺点【转】

    1.typeof 用来检测数据类型的运算符 typeof value 返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"."string&quo ...

  5. iOS开发之单元测试

    开始之前 本文侧重讲述如何在iOS程序的开发过程中使用单元测试.使用Xcode自带的OCUnit作为测试框架. 一.单元测试概述 单元测试作为敏捷开发实践的组成之一,其目的是提高软件开发的效率,维持代 ...

  6. Java技术体系图

    Java程序员高级特性              反射.泛型.注释符.自动装箱和拆箱.枚举类.可变              参数.可变返回类型.增强循环.静态导入        核心编程       ...

  7. java分享第十四天(TestNG Assert详解)

     TestNG Assert 详解org.testng.Assert 用来校验接口测试的结果,那么它提供哪些方法呢? 中心为Assert测试类,一级节点为方法例如assertEquals,二级结点为参 ...

  8. mac安装虚拟机

    1. 安装VirtualBox 2. 新建,按照步骤一步步选择 3.安装系统镜像 xp_sp3_74070.iso CN_WIN7_SP1_X64_33in1_V1.2.iso 设置磁盘分区等 4.V ...

  9. vim插件之tabular,代码对齐强迫症必备

    本周整理一批别人写的代码,要处理好所有的注释和缩进. 碰到那种大片的赋值或者注释或者宏定义,但又没对齐的,简直太难看了. 于是手工对了几个,觉得确实不是人干的活,心想这种需求应该有工具自动搞定才对啊, ...

  10. centos中yum安装mysql路径

    1. 使用命令service mysqld stop 停止mysql 查看mysql数据库的默认路径:/var/lib/mysql 使用cp -afir  /var/lib/mysql/*   /us ...