0

我找到了以下关于创建选择器引擎的教程。 http://blog.insicdesigns.com/2010/04/creating-your-own-selector-engine/

在javascript中,我们有类似的功能

  • getElementById()
  • getElementsByTageName()
  • getElementsByName()

等等,.....但是对于相同的功能,在他们的选择器引擎中,他们正在做类似的检查

 this.nodes[i].tagName == nm.toUpperCase() 

而不是 getElementsByTagName。这种方法的优点是什么?...

另外将所有节点分配给变量的用途是什么

 e.getElementsByTagName('*');
4

3 回答 3

1

this.nodes[i].tagName == nm.toUpperCase()是按标签名称过滤节点列表的方法的一部分......所以与“通过标签名称获取元素”无关

最后一点不是一个真正的问题..您想知道“为什么要选择所有节点”的原因?好吧,您正在编写扇区引擎....

于 2012-04-27T15:21:15.047 回答
1

以下行

this.nodes[i].tagName == nm.toUpperCase() 

是函数内ofTag。它正在过滤一组节点,以查找具有给定名称的节点。

下一行

e.getElementsByTagName('*');

检索节点下的所有子/后代,以便您以后可以像下面这样过滤它

new DOMNodes(Selector.getAll(document)).ofTag('p').hasClass('note');  
于 2012-04-27T15:21:19.103 回答
1

tagName获取元素的属性时存在不一致。一些浏览器返回大写,而另一些则返回小写。要规范化值的输出,您必须在继续进一步操作之前执行其中一项操作。

至于e.getElementsByTagName('*');我最近回答了一个问题,其中 OP 想要查找包含具有前缀的属性名称mce_的所有元素。获取此类元素的唯一方法是获取 DOM 中的所有元素,并检查它们的属性名称。

这也有一个很好的应用,getElementsByTagName('*')那就是确定元素的直接子元素。例如,在一个非常深的 DOM 中。如果我要根据属性查找某些父元素并获取它的子元素,通常您会从主体向下进行递归搜索以找到父元素。这将需要大量的递归操作。之后,你确定他们的孩子。

另一种方法是获取所有标签,确定它们的父节点,如果它们具有具有属性的父节点,则它们是直接子节点。此方法不需要递归,只需要getElementsByTagName('*')循环nodeList返回。

于 2012-04-27T15:23:25.800 回答