Document 对象提供了属性和方法实现定位页面元素功能,这也是 DOM 的标准规范中 Document 对象的主要应用之一。javascript
目前 Document 对象提供实现定位页面元素的方法具备以下几种:html
getElementById()方法:经过页面元素的 id 属性值定位元素。java
getElementsByName()方法:经过页面元素的 name 属性值定位元素。segmentfault
getElementsByTagName()方法:经过页面元素的元素名定位元素。数组
getElementsByClassName()方法:经过页面元素的 class 属性值定位元素。浏览器
querySelector()方法:经过 CSS 选择器定位第一个匹配的元素。app
querySelectorAll()方法:经过 CSS 选择器定位全部匹配的元素。学习
接下来,咱们就一一进行学习。测试
HTML 页面元素的 id 属性的特色是惟1、不可重复的,因此经过这种方式定位的 HTML 页面元素也是惟一的。动画
其语法格式以下:
element = document.getElementById(id);
在上述语法中,id 是参数,表示所要定位元素的 id 属性值,是一个大小写敏感的字符串。element 是返回值,表示定位的元素,是一个 Element 对象。
值得注意的是: 若是 HTML 页面中不存在具备该 id 属性值的元素,则返回 null。
下面是使用 getElementById() 方法的示例代码:
var btn = document.getElementById('btn'); // 获取定位元素的 class 属性值 var className = btn.className; // 添加 animate 动画样式 className += ' animate'; // 将新的 class 属性值设置 btn.className = className;
上述代码经过 getElementById() 方法定位 HTML 页面中 id 属性值为 btn 的元素,并为其元素的 class 属性添加 animate 样式。
完整示例代码请点击右边的连接: getElementById()方法完整示例代码
其语法格式以下:
elements = document.getElementsByName(name);
在上述语法中,name 是参数,表示所要定位元素的 name 属性值,是一个大小写敏感的字符串。elements 是返回值,表示定位元素的集合,是一个 NodeList 集合。
下面是使用 getElementsByName() 方法的示例代码:
var elems = document.getElementsByName('btn'); // 循环遍历全部元素 for (var i=0; i<elems.length; i++) { var elem = elems[i]; var className = elem.className; className += ' animate'; elem.className = className; }
上述代码经过 getElementsByName() 方法定位 HTML 页面中 name 属性值为 btn 的元素,并遍历全部获得的元素,为其元素的 class 属性添加 animate 样式。
完整示例代码请点击右边的连接: getElementsByName()方法完整示例代码
其语法格式以下:
elements = document.getElementsByTagName(name);
在上述语法中,name 是参数,表示所要定位元素的元素名,符号”*”表示全部元素。elements 是返回值,表示定位元素的集合,是一个 NodeList 集合。
下面是使用 getElementsByTagName() 方法的示例代码:
var elems = document.getElementsByTagName('button'); // 循环遍历全部元素 for (var i=0; i<elems.length; i++) { var elem = elems[i]; var className = elem.className; className += ' animate'; elem.className = className; }
上述代码经过 getElementsByTagName() 方法定位 HTML 页面中元素名为 button 的元素,并遍历全部获得的元素,为其元素的 class 属性添加 animate 样式。
完整示例代码请点击右边的连接: getElementsByTagName()方法完整示例代码
其语法格式以下:
elements = document.getElementsByClassName(names);
在上述语法中,names 是参数,表示所要定位元素的 class 属性值列表,class 名称经过空格分隔。
值得注意的是: names 参数能够是一个样式属性名称,也能够是多个样式属性名称。
elements 是返回值,表示定位元素的集合,是一个 NodeList 集合。
下面是使用 getElementsByClassName() 方法的示例代码:
var elems = document.getElementsByClassName('btn'); // 循环遍历全部元素 for (var i=0; i<elems.length; i++) { var elem = elems[i]; var className = elem.className; className += ' animate'; elem.className = className; }
上述代码经过 getElementsByClassName() 方法定位 HTML 页面中 class 属性值为 btn 的元素,并遍历全部获得的元素,为其元素的 class 属性添加 animate 样式。
完整示例代码请点击右边的连接: getElementsByClassName()方法完整示例代码
getElementsByClassName() 方法只支持 IE 9 版本及以后版本的浏览器。也就是说,该方法并不支持 IE 8 及以前版本的浏览器。
下图是不一样浏览器的不一样版本对 getElementsByClassName() 方法的支持状况:
因为国内的生产环境中,依旧存在使用 IE 8 及以前版本浏览器的状况。因此,咱们须要自定义 getElementsByClassName() 方法解决浏览器的兼容问题。
function getElementsByClassName(element, names) { }
上述自定义兼容方法接受两个参数,element 参数表示调用 getElementsByClassName() 方法的对象(目前为 Document 对象),names 参数表示所要定位元素的 class 属性值列表。
function getElementsByClassName(element, names) { // 检测 getElementsByClassName() 是否可用 if (element.getElementsByClassName) { // 优先使用 W3C 规范 return element.getElementsByClassName(names); }else { // 人为解决 IE 8 以前版本不兼容问题 } }
这里咱们要优先使用 W3C 规范的方法。因此,须要先判断当前浏览器环境是否存在 getElementsByClassName() 方法。
若是存在,就使用本来的 getElementsByClassName() 方法。若是不存在,就使用自定义代码来实现。
function getElementsByClassName(element, names) { // 检测 getElementsByClassName() 是否可用 if (element.getElementsByClassName) { // 优先使用 W3C 规范 return element.getElementsByClassName(names); }else { // 人为解决 IE 8 以前版本不兼容问题 // 获取全部后代元素节点 var elements = element.getElementsByTagName('*'); // 定义空数组 var result = []; var element, classNameStr, flag; // 将样式名称改成数组类型 names = names.split(' '); // 循环遍历全部元素节点 for (var i=0; element = elements[i]; i++) { // 获取每一个元素节点的样式名称 classNameStr = ' ' + element.className + ' '; // 开启开关 flag = true; // 循环遍历全部的样式名称 for (var j=0, name; name = names[j]; j++) { // 判断当前元素节点的样式名称中是否包含指定的样式名称 if (classNameStr.indexOf(' ' + name + ' ') == -1){ // 若是不包含,则关闭开关,而且结束循环 flag = false; break; } } // 判断当前元素节点是否包含指定样式名称 if (flag) { // 若是包含,则将当前元素节点添加到数组中 result.push(element); } } // 返回数组(全部包含指定样式名称的元素节点) return result; } }
CSS 中的选择器能够很便利地定位 HTML 页面元素,DOM 的标准规范中也提供相似的方法。
querySelector(): 定位匹配选择器的第一个元素。
querySelectorAll(): 定位匹配选择器的全部元素。
其语法格式以下:
element = document.querySelector(selectors);
在上述语法中,selectors 是参数,表示选择器,能够包含一个或多个 CSS 选择器,多个则以逗号分隔。element 是返回值,表示定位元素的集合,匹配的第一个元素。
下面是使用 querySelector() 方法的示例代码:
var btn = document.querySelector(’#btn'); // 获取定位元素的 class 属性值 var className = btn.className; // 添加 animate 动画样式 className += ' animate'; // 将新的 class 属性值设置 btn.className = className;
上述代码经过 querySelector() 方法定位 HTML 页面中 id 属性值为 btn 的元素,并为其元素的 class 属性添加 animate 样式。
完整示例代码请点击右边的连接: querySelector()方法完整示例代码
其语法格式以下:
elements = document.querySelectorAll(selectors);
在上述语法中,selectors 是参数,表示选择器,能够包含一个或多个 CSS 选择器,多个则以逗号分隔。elements 是返回值,表示定位元素的集合,是一个 NodeList 集合。
下面是使用 querySelectorAll() 方法的示例代码:
var elems = document.querySelectorAll('button'); // 循环遍历全部元素 for (var i=0; i<elems.length; i++) { var elem = elems[i]; var className = elem.className; className += ' animate'; elem.className = className; }
上述代码经过 querySelectorAll() 方法定位 HTML 页面中元素名为 button 的元素,并遍历全部获得的元素,为其元素的 class 属性添加 animate 样式。
完整示例代码请点击右边的连接: querySelectorAll()方法完整示例代码
NodeList 是一组元素节点的集合,每一个节点具备相应的索引值(从 0 开始的数字,相似于数组)。
元素节点在 NodeList 集合中存储的顺序与它们在 HTML 页面中的顺序保持一致。
NodeList 的属性 length 表示 NodeList 对象中包含的节点个数。方法 item(index) 表示返回 NodeList 对象中指定索引的节点。若是索引值越界,则返回 null。
NodeList 集合分为两种: 动态 NodeList 和静态 NodeList。
所谓动态的 NodeList 集合,就是若是文档中的节点树发生变化,则已经存在的 NodeList 对象也可能会变化。
如下几种定位 HTML 页面元素的方法返回的都是动态的 NodeList 集合。
getElementsByName()方法:经过页面元素的 name 属性值定位元素。
getElementsByTagName()方法:经过页面元素的元素名定位元素。
getElementsByClassName()方法:经过页面元素的 class 属性值定位元素。
咱们能够经过如下示例代码,体验动态 NodeList 集合的特色:
var elems = document.getElementsByTagName('button'); console.log(elems.length);// 输出 3 // 添加一个新的button按钮 var btn = document.createElement('button'); btn.setAttribute('class','button'); var text = document.createTextNode('New Button'); btn.appendChild(text); var div = document.getElementsByClassName('button-group')[0]; div.appendChild(btn); console.log(elems.length);// 输出 4
上述代码经过 getElementsByTagName() 方法定位 HTML 页面中全部的 button 元素,测试打印 button 元素的个数是 3 个。
而后,咱们建立一个新的 button 元素,而且将其添加到 HTML 页面中,再测试打印 button 元素的个数是 4 个。
值得注意的是: 咱们在第二次测试打印 button 元素的个数时,并无从新定位 HTML 页面中的 button 元素。
完整示例代码请点击右边的连接: 动态 NodeList 集合完整示例代码
所谓静态 NodeList 集合,就是对文档对象模型的任何改动都不会影响集合的内容。
querySelectorAll() 方法定位 HTML 页面元素所返回的 NodeList 集合就是静态 NodeList 集合。
咱们能够经过如下示例代码,体验静态 NodeList 集合的特色:
var elems = document.querySelectorAll('button'); console.log(elems.length);// 输出 3 // 添加一个新的button按钮 var btn = document.createElement('button'); btn.setAttribute('class','button'); var text = document.createTextNode('New Button'); btn.appendChild(text); var div = document.getElementsByClassName('button-group')[0]; div.appendChild(btn); console.log(elems.length);// 输出 3
上述代码经过 querySelectorAll() 方法定位 HTML 页面中全部的 button 元素,测试打印 button 元素的个数是 3 个。
而后,咱们建立一个新的 button 元素,而且将其添加到 HTML 页面中,再测试打印 button 元素的个数依旧是 3 个。
完整示例代码请点击右边的连接: 静态 NodeList 集合完整示例代码
Document 对象也提供了一些属性,来定位 HTML 页面中一些比较特殊的元素。
documentElement:获取 HTML 页面中的 <html>
元素。
head:获取 HTML 页面中的 <head>
元素。
title:获取 HTML 页面中的 <title>
元素。
body:获取 HTML 页面中的 <body>
元素。
links:获取 HTML 页面中的全部 <a>
元素。
images:获取 HTML 页面中的全部 <img>
元素。
咱们能够定义一个包含以上元素的 HTML 页面,而后经过如下示例代码进行测试:
console.log(document.documentElement); console.log(document.head); console.log(document.body); console.log(document.title); console.log(document.links); console.log(document.images);
本教程免费开源,任何人均可以避免费学习、分享,甚至能够进行修改。但须要注明做者及来源,而且不能用于商业。
本教程采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。