欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[].forEach.call

程序员文章站 2022-05-25 17:01:56
...

曾看到过一行非常有意思的代码:

[].forEach.call($$("*"),function(a){
    a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)
})

放到浏览器里执行之后,页面上的所有元素都会加上一个随机颜色的边框。
[].forEach.call
而这行代码的原理便是先选取页面上所有的元素,然后通过继承数组的foreach方法,遍历所有的Dom节点,从而使得每个dom节点都加上了边框。

前几天在项目中刚好遇到了类似的需求,我需要拿到页面中所有的元素,然后通过计算高度,对他们进行分页。由于通过childNodes获取到的NodeList不仅包含Dom,还包含文本注释及其他内容,而list本身并不具备数组的相关方法。
[].forEach.call
所以想要对NodeList进行筛选,就用到了这样的一个函数:

getHtmlNode(html) {
  return [].find.call(html.childNodes, node => node.nodeType === 1);
},

也是通过继承数组的find方法,找寻到第一个我需要的Dom节点。

至于nodeType的类型,可以参考:HTML DOM nodeType 属性

节点类型 描述 子节点
1 Element 代表元素 Element, Text, Comment, ProcessingInstruction, CDATASection, EntityReference
2 Attr 代表属性 Text, EntityReference
3 Text 代表元素或属性中的文本内容。 None
4 CDATASection 代表文档中的 CDATA 部分(不会由解析器解析的文本)。 None
5 EntityReference 代表实体引用。 Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
6 Entity 代表实体。 Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
7 ProcessingInstruction 代表处理指令。 None
8 Comment 代表注释。 None
9 Document 代表整个文档(DOM 树的根节点)。 Element, ProcessingInstruction, Comment, DocumentType
10 DocumentType 向为文档定义的实体提供接口 None
11 DocumentFragment 代表轻量级的 Document 对象,能够容纳文档的某个部分 Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
12 Notation 代表 DTD 中声明的符号。 None
相关标签: [].forEach.call