[].forEach.call

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

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

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

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

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

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值