Firefox 3.5 中的 DOM 选择器 API

W3C 发布的选择器 API建议是一个相对较新的尝试,它使 JavaScript 开发人员能够使用 CSS 选择器查找页面上的 DOM 元素。这个单一的 API 简化了遍历和从 DOM 中选择元素的复杂过程,并将其统一在一个简单的统一接口下。

在所有最近来自标准流程的工作中,这是所有浏览器中支持度最好的一项工作之一:今天可以在 Internet Explorer 8、Chrome 和 Safari 中使用,并且即将在 Firefox 3.5 和 Opera 10 中推出。

使用 querySelectorAll

选择器 API 在所有 DOM 文档、元素和片段上提供了两种方法:querySelectorquerySelectorAll。这两种方法的工作方式几乎完全相同,它们都接受一个 CSS 选择器并返回结果 DOM 元素(唯一的区别是 querySelector 只返回第一个元素)。

例如,给定以下 HTML 代码片段

First paragraph.

Second paragraph.

我们可以使用 querySelectorAll 将 ID 为“id”的 div 内的所有段落的背景颜色设置为红色。

var p = document.querySelectorAll("#id p");
for ( var i = 0; i < p.length; i++ ) {
    p[i].style.backgroundColor = "red";
}

或者我们可以找到具有“class”类的 div 的第一个子段落,并为其添加“first”类名。

document.querySelector("div.class > p:first-child")
    .className = "first";

通常,这些类型的遍历在长格式的 JavaScript/DOM 代码中会非常繁琐,需要占用多行和多个查询。

虽然选择器 API 方法的实际使用相对简单(每个方法只接受一个参数),但选择使用哪些 CSS 选择器才是具有挑战性的部分。选择器 API 利用浏览器提供的原生 CSS 选择器,用于使用 CSS 对元素进行样式设置。对于大多数浏览器(Firefox、Safari、Chrome 和 Opera)来说,这意味着您可以使用完整的CSS 3 选择器。Internet Explorer 8 提供了一个更有限的子集,涵盖了CSS 2 选择器(这些选择器仍然非常有用)。

对于大多数选择器 API 的新用户来说,最大的障碍是确定哪些 CSS 选择器适合选择所需的元素,尤其是在大多数编写跨浏览器代码的开发人员只对有限的、完全有效的 CSS 1 选择器子集有丰富的经验的情况下。

虽然CSS 2CSS 3 选择器规范可以作为学习更多可用内容的良好起点,但也存在许多有用的指南供您学习更多。

实际应用

选择器 API 最引人注目的用例不是 Web 开发人员直接使用它,而是由已经提供 DOM CSS 选择器功能的第三方库使用它。今天采用选择器 API 的最棘手的问题是它并非在所有用户开发的浏览器中都可用(包括 IE 6、IE 7 和 Firefox 3)。因此,在这些浏览器不再使用之前,我们必须使用一些中间实用程序来重新创建完整的 DOM CSS 选择器体验。

值得庆幸的是,已经存在许多库提供了与选择器 API 兼容的 API(事实上,选择器 API 的许多灵感都来自这些库的存在)。此外,许多这些实现已经在幕后使用了选择器 API。这意味着您可以在所有支持的浏览器中使用 DOM CSS 选择器,并且无需任何操作即可从原生选择器 API 实现获得更快的性能。

一些优雅地使用新的选择器 API 的现有实现是

必须强调的是,使用这个新 API(与必须使用的传统 DOM 和 JavaScript 组合相比)将获得巨大的性能提升。当您查看 JavaScript 库开始实现新的选择器 API 时发生的改进时,您确实可以看到差异。

当之前运行一些测试时,结果如下:

您可以看到库开始使用原生选择器 API 实现后发生的巨大性能提升,您的应用程序也极有可能发生这种性能提升。

测试套件

为了配合选择器 API 规范的定义,Mozilla 的 John Resig 创建了一个选择器 API 测试套件。这个测试套件可用于确定主要浏览器中各个选择器 API 实现的质量。

支持该 API 的浏览器的当前结果是

  • Firefox 3.5:99.3%
  • Safari 4:99.3%
  • Chrome 2:99.3%
  • Opera 10b1:97.5%
  • Internet Explorer 8:47.4%

如前所述,Internet Explorer 8 缺少大多数 CSS 3 选择器,因此无法通过大多数相关测试。

就目前而言,选择器 API 应该作为一种简单且快速的方式来选择页面上的 DOM 元素。它已经使那些使用提供类似功能的 JavaScript 库的用户受益,因此请随时深入研究并试用该 API。

关于 John Resig

更多 John Resig 的文章……


18 条评论

  1. Maurício

    请查看“使用 querySelectAll”标题下的第 3 个代码块。它不应该是 > 而不是 < 吗?

    2009 年 6 月 13 日 下午 4:42

  2. Elijah Grey

    对于 WP-Syntax,不要忘记在包含语法高亮代码或标记的 <pre/> 标记上添加 escaped="true"

    2009 年 6 月 13 日 下午 5:32

  3. Shawn J. Goff

    看起来代码语法高亮程序弄乱了 Javascript 示例中的字符实体。

    2009 年 6 月 13 日 下午 5:33

  4. Christopher Blizzard

    @Elijah – 这实际上是我刚刚(再次)修复的问题,WP 基于角色删除了某些内容 – 现在应该已修复。对此表示歉意!

    2009 年 6 月 13 日 下午 5:54

  5. Christopher Blizzard

    @Maurício – 是的,你说得对!(我怪 Resig!:D)我已经修复了示例,谢谢!

    2009 年 6 月 13 日 下午 6:02

  6. 蚂蚁,以用户为中心的设计

    Ant 路过

    2009 年 6 月 13 日 下午 7:51

  7. 来自拉各斯的 William

    John,写得很好。

    2009 年 6 月 14 日 上午 12:21

  8. dotnetCarpenter

    嗯..我在 IE8(v. 8.0.6001.18783)中得到 58.5%:1265 个通过,899 个失败,而不是 47.4%。测试是否得到了改进,或者你们使用了 IE8 的另一个版本?

    干杯,Jon

    2009 年 6 月 14 日 下午 4:52

  9. […] 原文地址:DOM selectors API in Firefox 3.5 系列地址:颠覆网络35天 […]

    2009 年 6 月 14 日 下午 10:35

  10. Chris

    IE8,你再次让我失望。很棒的统计数据,速度差异令人震惊!

    2009 年 6 月 15 日 上午 6:30

  11. […] Resig 在 hacks.mozzila.org 上写了一篇关于新的 querySelectorAll.all() api 的好文章。document.querySelectorAll() 使您能够更好地掌握 CSS 选择。例如,如果您想 […]

    2009 年 6 月 15 日 上午 9:18

  12. […] браузъри вече имат html5 благини като <canvas>/<video>/Selector API/Storage/Data […]

    2009 年 6 月 21 日 下午 1:59

  13. […] 下面是 John Resig(jQuery 的作者兼布道者)撰写的文章“Firefox 3.5 中的 DOM 选择器 API”的翻译 […]

    2009 年 7 月 7 日 下午 11:42

  14. […] 原文地址:DOM selectors API in Firefox 3.5 系列地址:颠覆网络35天 […]

    2009 年 7 月 19 日 下午 5:47

  15. […] Mozilla Hacks 博客文章翻译系列中,今天我将翻译 John Resig 撰写的文章“Firefox 3.5 中的 DOM 选择器 API” […]

    2009 年 7 月 28 日 上午 4:36

  16. 女士们,先生们,欢迎……

    语义检查器!

    在我编程了半个晚上之后,我的第二个 Firefox 扩展程序 Semantic Checker 的第一个版本已经完成,并在 Mozilla Firefox 附加组件中发布。

    可以通过单击… 扩展程序…

    2009 年 8 月 8 日 上午 9:51

  17. Eugene Lazutkin

    Dojo 1.0.2 和 Dojo 1.1.1?真的吗?Dojo 1.0.2 于 2008 年 2 月 15 日发布,Dojo 1.1.1 于 2008 年 5 月 12 日发布——一年多以前。为什么不使用自 2009 年 4 月起可供下载的 Dojo 1.3.1?

    2009 年 9 月 17 日 下午 1:32

  18. […] Opera 开发者中心的 API,作者是 Lachlan Hunt,该规范的作者之一。Mozilla Hacks 上的选择器 APIJS 性能大师 Nicholas Zakas 对性能的思考(评论非常值得 […]

    2011 年 9 月 2 日 下午 4:58

本文评论已关闭。