资讯专栏INFORMATION COLUMN

获取文档元素

moven_j / 2716人阅读

摘要:提供了很多方式获取文档元素可以很方便的查询文档中一个或者多个元素一组元素集合有以下几种方式通过指定的元素属性通过指定的属性通过指定的标签名通过指定的名通过匹配的选择器检查对应的元素是否于参数选择器匹配一些特殊集合通过属性获取元素

DOM提供了很多方式获取文档元素, 可以很方便的查询文档中一个或者多个元素[一组元素集合], 有以下几种方式:

通过指定的元素id属性(attribute) - [getElementById]

通过指定的name属性 - [getElementsByName]

通过指定的标签名 - [getElementsByTagName]

通过指定的CSS Class名 - [getElementsByClassName]

通过匹配的CSS选择器 - [querySelector/querySelectorAll]

检查对应的HTML元素是否于参数选择器匹配 - [matchesSelector]

一些特殊集合

通过id属性获取元素
任何HTML元素都可以定义id属性, 但是通常它在文档中是唯一的. 因而我们通常使用id获取到的只是一个独立的唯一的元素对象. 我们可以使用Document对象的getElementById()方法获取指定的id的元素对象.

document.getElementById("id");
如果在匹配的过程中不存在参数中传递的相应的id元素, 则getElementById()方法返回null. id参数的匹配过程中区分大小写, 但是在IE8之前的版本中getElementById()方法并不区分ID的大小写, 并且如果页面中存在多个同名的ID元素, 这个方法只会返回匹配第一个元素对象.

使用getElementById()方法获取到的是一个元素对象, 因而这个对象也有属性和方法. 便可以使用结果对象的相关属性和方法进行其他操作. 如:

var dom = document.getElementById("id");
dom.style.backgroundColor = "#FFF";
注意: 在IE8之前的版本中, getElementById()方法会匹配name属性与id同名的表单元素. 因而如果需要确保不会获取到表单元素, 需要在页面中保证不会出现name值与id名相同的表单元素.

通过name属性获取元素
getElementsByName()方法是只有HTMLDocument类型才有的方法, 因而它只对HTML文档可用. 它用于返回具有指定name特性的所有元素, 即一个NodeList对象(相当于一个包含一组Element对象的只读数组). 注意这里name属性不一定是单个的元素, 可能是一组元素的集合(HTMLCollection). 例如具有相同name属性值的一组表单元素(单选或者复选框).

document.getElementsByName("name");
getElementsByName()方法返回的NodeList对象也有很多属性和方法, 同样可以利用它的属性和方法进行其他操作.

注意: 在某些版本的IE中getElmentsByName()方法会匹配具有同名id属性值的元素. 因而需要小心的避免.

通过HTML标签名获取元素
Document对象有一个getElementsByTagName()方法, 它接受一个HTML标签名作为参数, 并取得匹配所有的匹配的标签名的元素, 它也返回一个NodeList对象. 返回的元素集合按照这些元素在文档中的顺序排列.

document.getElementsByTagName("div"); // 获取文档中的所有div元素
document.getElementsByTagName("p"); // 获取文档中的所有p元素
document.getElementsByTagName("*"); // 获取文档中的所有元素

getElementsByTagName()不仅可用于Document对象, 它还可以基于现有的Element对象, 获取其后代元素.

var firstDiv = document.getElementsByTagName("div")[0];
var spans = firstDiv.getElementsByTagName("span"); // 获取文档中第一个div中的所有span元素

同样的, 使用getElementsByTagName()方法获取的NodeList也有很多属性和方法, 可以利用相关的属性和方法进行其他操作. 下面展示了几个常见的属性和方法.

var div = document.getElementsByTagName("div");
div.length; // 获取文档中div的数量
div[0].id; // 获取文档中第一个div的id属性值, 如果它存在
div.item(0).id; // 通过NodeList的item方法获取文档中第一个div的id属性值

var images = document.getElementsByTagName("img");
images.nameItem("name"); // 获取images集合中具有name属性值的元素

注意:

getElememtsByTagName();不区分HTML标签的大小写.

在早期版本的IE中, 由于注释被实现为元素, 因而document.getElementsByTagName("*");也会返回所有的注释节点.

通过ClassName获取元素
HTML5中添加了一个getElementsByClassName()方法用于获取指定className(class在JavaScript中是关键字, 因而在DOM操作中使用className替代)值的元素. 这个方法可以通过Document对象或者现有的元素对象调用. 它接受一个或多个[空格分割]className值(顺序无关), 返回匹配的NodeList对象(它返回的是后代元素).

var items = document.getElementsByClassName("item"); // 获取文档中所有className为"item"的元素
var doms = document.getElementsByClassName("a b"); // 获取文档中所有同时具有className为a和b的元素

var users = document.getElementById("list").getElementsByClassName("user"); // 获取文档中id为list的元素下所有className为user的元素

使用getElementsByClassName()不在局限于使用id或者标签名的方式获取元素. 但注意它返回的是NodeList对象, 一个只读形式的类数组对象. 在使用过程需要避免直接对NodeList进行操作.

注意: 在"怪异模式中"getElementsByClassName()方法在匹配className时不区分大小写.

由于IE9之前的版本并不支持这个方法, 因而需要基于现有的技术模拟实现. 下面提供一个<>作者实现的版本:

function getElementsByClass(searchClass,node,tag) {
    var classElements = new Array();
    if ( node == null ){
        node = document;
    }
    if ( tag == null ){
        tag = "*";
    }

    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|s)"+searchClass+"(s|$)");

    for (i = 0, j = 0; i < elsLen; i++) {
        if ( pattern.test(els[i].className) ) {
            classElements[j] = els[i];
                j++;
        }
    }

    return classElements;

}

扩展阅读: document.getElementsByClassName理想实现

querySelector()方法
W3C标准的Selector API Level1中提供了两个核心的方法querySelector()和querySelectorAll(), 可以通过Document对象或者基于现有的元素, 以及在文档片段(DocumentFragment)中调用这两个方法获取匹配的元素.

querySelector()方法接受一个CSS选择符字符串, 返回与这个选择符模式匹配的第一个元素. 如果没有匹配则返回null.

var body = document.querySelector("body"); // 获取body元素
var firstLi = document.querySelector("#list li:first-child"); // 获取id为list的元素中第一个li元素

var dom = document.getElementById("id");
var lastLi = dom.querySelector("li:last-child");
// 获取文档中id为id的元素下最后一个li元素, 通过现有的元素调用querySelector方法获取

注意:

规范中并没有规定要求querySelector()支持CSS3选择器

querySelector()方法并不能应用于类似:first-line/:visited等匹配文本节点的伪元素或者匹配元素状态的伪类中.

兼容性:

Chrome FireFox Safari Opera IE
1 3.5 3.2 10 8

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78042.html

相关文章

  • JavaScript DOM 2 - 获取文档元素

    摘要:在低于浏览器中,也返回匹配属性的元素。例如通过匹配元素的的值来获取元素。结果返回对象其实很类似于的选择元素的方法,而也是解决获取页面元素的终极方法。 1: 获取文档元素的方法有7个 1: getElementById(id) [通过id获取] 2: getElementsByName(name) [通过元素的name属性获取] 3: getElementsByTagName(tag...

    sydMobile 评论0 收藏0
  • js获取文档元素的坐标

    摘要:例如我想知道写文章的这个页面中定时发布的按钮的尺寸和位置获取宽度,高度的另一种方式对于内联元素调用,返回的是边界矩形,因为内联元素可能跨了多行,所以可能是由多个矩形组成的。对于分为两行的内联元素,边界矩形就包含了两行的宽度。 这两天在写瀑布流的实现,使用了一些关于获取文档坐标、元素位置的函数,刚好看到犀牛书上关于这部分的介绍,特写此文章进行总结,方便日后查找使用。 文档坐标和视口坐标 ...

    wanglu1209 评论0 收藏0
  • js获取文档元素的坐标

    摘要:例如我想知道写文章的这个页面中定时发布的按钮的尺寸和位置获取宽度,高度的另一种方式对于内联元素调用,返回的是边界矩形,因为内联元素可能跨了多行,所以可能是由多个矩形组成的。对于分为两行的内联元素,边界矩形就包含了两行的宽度。 这两天在写瀑布流的实现,使用了一些关于获取文档坐标、元素位置的函数,刚好看到犀牛书上关于这部分的介绍,特写此文章进行总结,方便日后查找使用。 文档坐标和视口坐标 ...

    MSchumi 评论0 收藏0
  • Javascript学习总结 - JS基础系列 二

    摘要:假如对应的为一组对象,则返回该组对象中的第一个。方法返回带有指定标签名的节点对象的集合。语法说明是标签的名称,如等标签名。是一个人的身份证号码,是唯一的。注意把指定的属性设置为指定的值。表示文档所在窗口的当前宽度。 简述 本系列将持续更新Javascript基础部分的知识,谁都想掌握高端大气的技术,但是我觉得没有一个扎实的基础,我认为一切高阶技术对我来讲都是过眼云烟,要成为一名及格的前...

    pcChao 评论0 收藏0
  • XML就是这么简单

    什么是XML? XML:extensiable markup language 被称作可扩展标记语言 XML简单的历史介绍: gml->sgml->html->xml gml(通用标记语言)–在不同的机器进行通信的数据规范 sgml(标准通用标记语言) html(超文本标记语言) 为什么我们需要使用XML呢? ①我们没有XML这种语言之前,我们使用的是String作为两个程序之间的通讯!现在问...

    pf_miles 评论0 收藏0

发表评论

0条评论

moven_j

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<