js提取指定网站内容(解析JavaScript中querySelector与getElementById方法的区别的相关内容吗)

优采云 发布时间: 2021-10-28 13:22

  js提取指定网站内容(解析JavaScript中querySelector与getElementById方法的区别的相关内容吗)

  想知道解析JavaScript中querySelector和getElementById方法区别的相关内容吗?明天我会努力给大家讲解js中querySelector和getElementById方法的相关知识以及一些代码示例。欢迎阅读和纠正我。重点:js、querySelector、js、getElementById、methods,一起来学习吧。

  1. 概览

  看代码的时候发现querySelector()和querySelectorAll()基本上都是用来获取元素的,不知道为什么不使用getElementById()。

  可能是因为我没用过这两个,所以我不知道为什么。

  1.1 querySelector() 和 querySelectorAll() 的用法

  querySelector() 方法

  定义:querySelector()方法返回文档中匹配指定CSS选择器的元素;

  注意:querySelector() 方法只返回与指定选择器匹配的第一个元素。如果需要返回所有元素,请改用 querySelectorAll() 方法;

  语法:document.querySelector(CSS selectors);

  参数值:字符串 必需。为匹配元素指定一个或多个 CSS 选择器。使用它们的id、class、type、attribute、attribute value等来选择元素。

  对于多个选择器,用逗号分隔它们并返回匹配的元素。

  返回值:匹配指定 CSS 选择器的第一个元素。如果未找到,则返回 null。如果指定了非法选择器,则会抛出 SYNTAX_ERR 异常。

  querySelectorAll() 方法

  定义:querySelectorAll()方法返回文档中所有匹配指定CSS选择器的元素,并返回一个NodeList对象;

  NodeList 对象表示节点的集合。可以通过索引访问,索引值从0开始;

  提示:可以通过NodeList对象的length属性获取与选择器匹配的元素属性,然后遍历所有元素,得到你想要的信息;

  语法:elementList = document.querySelectorAll(selectors);

  elementList 是一个静态的 NodeList 类型对象;

  selectors 是一个字符串,收录一个或多个用逗号连接的 CSS 选择器;

  参数值:字符串 必需。指定一个或多个与 CSS 选择器匹配的元素。可以使用id、class、type、attribute、attribute value等作为选择器来获取元素。

  多个选择器之间用逗号 (,) 分隔。

  返回值:一个 NodeList 对象,表示文档中与指定 CSS 选择器匹配的所有元素。

  NodeList 是一个静态的 NodeList 类型对象。如果指定的选择器不合法,则会抛出 SYNTAX_ERR 异常。

  1.2 getElement(s)Byxxxx的用法

  getElementById() 方法

  定义:getElementById() 方法可以返回对具有指定 ID 的第一个对象的引用。

  如果没有指定ID的元素,则返回null;

  如果有多个指定ID的元素,则返回第一个;

  如果需要查找那些没有ID的元素,可以考虑使用querySelector();通过 CSS 选择器;

  语法:document.getElementById(elementID);

  参数值:字符串必须。元素 ID 属性值。

  返回值:指定元素对象ID的元素

  getElementsByTagName() 方法

  定义:getElementsByTagName()方法可以返回指定标签名的对象集合;

  提醒:参数值“*”返回文档的所有元素;

  语法:document.getElementsByTagName(tagname)

  参数:String 必须获取元素的标签名称;

  返回值:NodeList对象指定标签名的元素集合

  getElementsByClassName() 方法

  定义:getElementsByClassName() 方法将文档中具有指定类名的所有元素的集合作为 NodeList 对象返回。

  NodeList 对象表示节点的有序列表。 NodeList对象可以通过节点列表中的节点索引号(索引号从0开始)访问表中的节点。

  Tips:可以通过NodeList对象的length属性来判断指定类名的元素个数,循环遍历每个元素得到自己需要的元素。

  语法:document.getElementsByClassName(classname)

  参数:String 必须是要获取的元素类的名称。使用空格分隔多个类名,如“test demo”;

  返回值:NodeList 对象,表示指定类名的元素集合。集合中元素的顺序按它们在代码中出现的顺序排序。

  2. 区别 2.1 getElement(s)Byxxxx 获取动态集合,querySelector 获取静态集合

  动态是指被选中的元素会随着文档的变化而变化,静态的不会被取出,与文档的变化无关。

  示例 1:

  

测试1

测试2

测试3

//获取到ul,为了之后动态的添加li

var ul = document.getElementById('box');

//获取到现有ul里面的li

var list = ul.getElementsByTagName('li');

for(var i =0; i < list.length; i++){

ul.appendChild(document.createElement('li')); //动态追加li

}

  上面的代码会陷入死循环,i

  因为第一次拿到里面的3个li后,每次ul中加入一个新元素,list都会更新它的值,取回ul中的所有li。

  即getElement(s)Byxxxx获取的是一个动态集合,它会随着dom结构的变化而变化。

  也就是每次调用list都会重新查询文档,导致死循环。

  示例1修改:

  修改for循环条件为i

  

测试1

测试2

测试3

var ul = document.getElementById('box');

var list = ul.getElementsByTagName('li');

for(var i = 0; i < 4; i++){

ul.appendChild(document.createElement('li'));

}

console.log('list.length:',list.length);

  

  示例 2:

  下面代码的静态集合体现在.querySelectorAll(‘li’)中,获取ul中的所有li后,无论后面动态添加多少li,都不会影响其参数。

  

测试1

测试2

测试3

var ul = document.querySelector('ul');

var list = ul.querySelectorAll('li');

for(var i = 0; i < list.length; i++){

ul.appendChild(document.createElement('li'));

}

console.log('list.length:',list.length); //输出的结果仍然是 3,不是此时 li 的数量 6

  

  为什么要这样设计?

  W3C 规范中明确定义了 querySelectorAll 方法:

  querySelectorAll() 方法返回的 NodeList 对象必须是静态的([DOM], section 8).

  我们来看看Chrome上的情况:

  document.querySelectorAll('a').toString(); // 返回“[对象节点列表]”

  document.getElementsByTagName('a').toString(); // 返回“[object HTML采集]”

  W3C中HTML采集的定义如下:

  HTML采集 是一个节点列表。可以通过序数索引或节点的名称或 id 属性访问单个节点。注意:HTML DOM 中的集合被假定为活动的,这意味着它们会在底层文档更改时自动更新。

  其实HTML采集和NodeList很相似,都是动态的元素集合,每次访问都需要查询文档。

  区别:HTML采集属于文档对象模型HTML规范,NodeList属于文档对象模型核心规范。

  这有点难理解,但看下面的例子会更容易:

  

var ul = document.getElementsByTagName('ul')[0],

lis1 = ul.childNodes,

lis2 = ul.children;

console.log(lis1.toString(), lis1.length); // "[object NodeList]" 11

console.log(lis2.toString(), lis2.length); // "[object HTMLCollection]" 4

  NodeList 对象将收录文档中的所有节点,例如 Element、Text、Comment 等;

  HTML采集 对象将只收录文档中的 Element 节点;

  另外,HTML采集对象比NodeList对象提供了更多的namedItem方法;

  所以在浏览器中,querySelectorAll的返回值是一个静态的NodeList对象,而getElementsBy系列的返回值实际上是一个HTML采集对象。

  2.2 接收到的参数不同

  querySelectorAll方法接收到的参数是一个CSS选择器;

  getElementsBy系列接收到的参数只能是一个className、tagName和name;

  

var c1 = document.querySelectorAll('.b1 .c');

var c2 = document.getElementsByClassName('c');

var c3 = document.getElementsByClassName('b2')[0].getElementsByClassName('c');

  注意:querySelectorAll接收的参数必须严格遵守CSS选择器规范

  下面的写法会抛出异常(CSS选择器中的元素名、类和ID不能以数字开头)。

  

try {

var e1 = document.getElementsByClassName('1a2b3c');

var e2 = document.querySelectorAll('.1a2b3c');

} catch (e) {

console.error(e.message);

}

console.log(e1 && e1[0].className);

console.log(e2 && e2[0].className);

  2.3 浏览器兼容性不同

  querySelectorAll 已被 IE 8+、FF 3.5+、Safari 3.1+、Chrome 和 Opera 10+ 支持;

  getElementsBy系列,以最新添加规范中的getElementsByClassName为例,IE 9+、FF 3+​​、Safari 3.1+、Chrome、Opera 9+均支持;

  2.4 querySelector属于W3C的Selectors API规范,getElementsBy系列属于W3C的DOM规范

  参考文章(入侵与删除)

  相关文章

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线