Document: querySelector() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

Document 的方法 querySelector() 返回文档中第一个匹配指定 CSS 选择器或一组 CSS 选择器的 Element。如果没有找到匹配项,则返回 null

匹配通过对文档节点进行深度优先的先序遍历来完成,从文档标记中的第一个元素开始,并按子节点数量的顺序迭代后续节点。

如果指定的选择器匹配的 ID 在文档中被错误地使用了不止一次,则返回具有该 ID 的第一个元素。

CSS 伪元素永远不会返回任何元素。

语法

js
querySelector(selectors)

参数

选择器 (selectors)

一个包含一个或多个要匹配的选择器的字符串。该字符串必须是有效的 CSS 选择器字符串;如果不是,将抛出 SyntaxError 异常。

请注意,HTML 规范不要求属性值是有效的 CSS 标识符。如果 classid 属性值不是有效的 CSS 标识符,那么在使用它作为选择器之前,您必须对其进行转义,可以通过对该值调用 CSS.escape(),或者使用 转义字符 中描述的一种技术。有关示例,请参见 转义属性值

返回值

返回一个 Element 对象,表示文档中第一个匹配指定 CSS 选择器集的元素,如果没有匹配项,则返回 null

如果你需要所有匹配指定选择器的元素的列表,你应该使用 querySelectorAll()

异常

SyntaxError DOMException

如果指定的 selectors 语法无效,则抛出异常。

示例

查找匹配类的第一个元素

在此示例中,返回文档中第一个具有类 myclass 的元素。

js
const el = document.querySelector(".myclass");

复杂选择器

选择器也可以非常强大,如下面的示例所示。此处,返回文档中类为“user-panel main”的 <div> 内部的第一个名为“login”的 <input> 元素(<input name="login"/>)。

js
const el = document.querySelector("div.user-panel.main input[name='login']");

否定

由于所有 CSS 选择器字符串都有效,你也可以否定选择器。

js
const el = document.querySelector(
  "div.user-panel:not(.main) input[name='login']",
);

这将选择一个父级 div 具有 user-panel 类但不具有 main 类的输入。

转义属性值

此示例显示,如果 HTML 文档包含一个不是有效 CSS 标识符id,那么在使用 querySelector() 之前,我们必须对属性值进行转义。

HTML

在以下代码中,一个 <div> 元素的 id"this?element",它不是一个有效的 CSS 标识符,因为 CSS 标识符中不允许使用 "?" 字符。

我们还有三个按钮和一个用于记录错误的 <pre> 元素。

html
<div id="this?element"></div>

<button id="no-escape">No escape</button>
<button id="css-escape">CSS.escape()</button>
<button id="manual-escape">Manual escape</button>

<pre id="log"></pre>

CSS

css
div {
  background-color: blue;
  margin: 1rem 0;
  height: 100px;
  width: 200px;
}

JavaScript

所有三个按钮在点击时都会尝试选择 <div>,然后将其背景颜色设置为随机值。

  • 第一个按钮直接使用 "this?element" 值。
  • 第二个按钮使用 CSS.escape() 来转义该值。
  • 第三个按钮使用反斜杠明确转义 "?" 字符。请注意,我们还必须使用另一个反斜杠来转义反斜杠本身,例如:"\\?"
js
const log = document.querySelector("#log");

function random(number) {
  return Math.floor(Math.random() * number);
}

function setBackgroundColor(id) {
  log.textContent = "";

  try {
    const element = document.querySelector(`#${id}`);
    const randomColor = `rgb(${random(255)} ${random(255)} ${random(255)})`;
    element.style.backgroundColor = randomColor;
  } catch (e) {
    log.textContent = e;
  }
}

document.querySelector("#no-escape").addEventListener("click", () => {
  setBackgroundColor("this?element");
});

document.querySelector("#css-escape").addEventListener("click", () => {
  setBackgroundColor(CSS.escape("this?element"));
});

document.querySelector("#manual-escape").addEventListener("click", () => {
  setBackgroundColor("this\\?element");
});

结果

点击第一个按钮会报错,而第二个和第三个按钮则正常工作。

规范

规范
DOM
# ref-for-dom-parentnode-queryselector①

浏览器兼容性

另见