优秀的编程知识分享平台

网站首页 > 技术文章 正文

类库用久了原生js操作DOM是否忘了呢系列之一DOM获取?

nanyue 2024-09-02 19:06:11 技术文章 9 ℃

最近刚从前一家公司离职,所在公司属于外包公司,一切开发追求速度,类库用的比较多,以至于好多原生js,有些遗忘,也借此机会回顾一下。

废话不多说直接开始吧!

一、DOM操作之节点获取

1.通过节点的ID

document.getElementById(eleId);

该方法通过节点的ID,可以准确获得需要的元素,是比较简单快捷的方法。如果页面上含有多个相同id的节点,那么只返回第一个节点。

2.通过节点的name

document.getElementsByName(eleName);

该方法是通过节点的name获取节点,从名字可以看出,这个方法返回的不是一个节点元素,而是具有同样名称的节点数组。然后,我们可以通过循环判断是否为需要的节点。

3.通过节点的Tag

document.getElementsByTagName(tagName);

该方法是通过节点的Tag获取节点,同样该方法也是返回一个数组,例如:document.getElementsByTagName('A')将会返回页面上所有超链接节点。

4.通过节点的className

document.getElementsByClassName(className);

该方法是通过节点的className获取节点,同样该方法也是返回一个数组,例如:document.getElementsByClassName('red')将会返回页面上所有class属性包含red的节点集合。

5.通过css选择器

document.querySelector("#demo"); //返回ID为demo的节点document.querySelector("input[type='tel']"); //返回type为tel的input表单元素document.querySelector(".contaniner > .headimg"); //返回class含有contaniner下的class含有headimg的元素

该方法更加匹配了我们对css选择器使用的习惯,通过选择器更加精准高效获取指定元素,querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素。如果你需要返回所有的元素,请使用 querySelectorAll() 方法替代。

6.通过element属性

parentObj.firstChild;

该属性返回parentObj的第一个子节点。这个属性是可以递归使用的,也就是支持parentObj.firstChild.firstChild.firstChild...的形式,如此就可以获得更深层次的节点。

parentObj.lastChild;

该属性是返回parentObj的最后一个子节点。与firstChild一样,它也可以递归使用。

parentObj.childNodes;

该属性返回已知节点的子节点数组,然后可以通过循环或者索引找到需要的节点。

element.previousSibling

返回已知节点element的前一个节点,这个属性和前面的firstChild、lastChild一样都可以递归使用的。

element.nextSibling

返回已知节点element的后一个节点,同样支持递归。

childNode.parentNode

获取已知节点的父节点。

二、DOM操作之节点获取注意事项

1.经测试发现,childNodes在IE7上获取的是直接子节点的数组,而在Firefox2.0.0.11上获取的是所有子节点即包括子节点的子节点。

2.IE8及以下浏览器不支持 getElementsByClassName();

3.IE9及以下浏览器只支持在表单元素上使用 getElementsByName() 方法

4.IE9及以下浏览器中使用 getElementsByName() 方法也会返回id属性匹配的元素。因此,不要将 name 和 id 属性设置为相同的值。

5.querySelectorAll() 方法得到的类数组对象是非动态实时的,所以如果要计算长度等的实事值,最好重新获取;当然以前的 getElementById() 之类的就没这个毛病;

6.动态集合不需要将所有的信息放在前面,而.querySelectorAll()会立即收集静态列表中的所有信息,从而使其性能更差。

7. querySelectorAll()我们不能在结果上调用Node方法。

8.querySelectorAll()返回是一个节点列表,而不是一个数组。这意味着普通的数组方法不可直接使用。

三、尝试封装类jquery方法

$("selector")的实现

//类库
function JQ(ele) {
 this.ele = ele;
}
//添加实例方法
JQ.prototype.html = function(){
 ......
}
......//处理获取节点,并返回对象实例
function $(selector){
 if ( selector ) {
 var ele = document.querySelectorAll(selector);
 return new JQ(ele);
 }
 return null;
}

当然以上实现仅仅只是一个逻辑结构上的实现,具体的复杂情况请移步到jquery在github上的init源码

最近发表
标签列表