1

我看过类似标题的问题,但它们并不完全相同。

首先,我使用 YUI(3.2.0 与 Liferay 6.0 兼容)。

我已经有Node参考了。我的目标是获得Node与给定 CSS 选择器匹配的第一个孩子。起初,我是这样做的:

...
parse: function(node) {
    var title = node.one('>span, >div, >a, >h1');
    ...
},
...

这适用于 Firefox、Chrome 和 IE 9+。但是,我们必须支持 IE 8。所以我深入研究并找到 w3c 参考说明:

子选择器由两个或多个以“>”分隔的选择器组成

这似乎表明,根据规范,父母是必需的,尽管在实践中似乎并非如此。所以我再搜索了一下,发现 jQuery 实际上提到了这个特定的情况正在被弃用:

注意:$("> elem", context) 选择器将在未来的版本中被弃用。因此不鼓励使用它来代替使用替代选择器。

我在 YUI 文档中找不到明确提及这种情况,但我仍然认为使用它并不安全(无论如何 IE8 都不支持它)。我尝试了很多东西,包括使用*>span, *>div, ..., *:first-child+span, ...,但它们没有用。所以我剩下的是:

var title = node.get('children').filter('>span, >div, >a, >h1').item(0);

但这似乎不优雅且效率低下,因为它背后的代码会有很多循环(因为过滤器不会短路,我想要的只是第一次匹配)。有人有更好的建议吗?

4

1 回答 1

2

在这种情况下,也许退后一步是有意义的。目前,您的要求是“匹配此 CSS 选择器”。您能否将其框定为“获取此节点的第一个子节点,它是跨度、div、锚点或 h1”(或类似的东西?)

如果是这样,请放弃选择器引擎。相反,调用 node.get('children') 然后遍历生成的 NodeList - 您的迭代器函数可以简单地检查节点名称是否具有正确的值,如果是,则短路。这应该给你可靠的性能,并且应该是相当可读的。

于 2012-12-17T23:25:26.010 回答