使用反斜杠查询数据属性

Querying for data attributes with backslashes

我有一个 HTML 数据属性,其值中有一个反斜杠。对该元素的简单查询失败;我必须在查询中使用双反斜杠。

考虑以下测试:

var file = "foo\bar"; // That's a single backslash, to be clear.
document.getElementById('d2').dataset.file = file;

var singleBackslash = '*[data-file="'+file+'"]';
var doubleBackslash = '*[data-file="'+file.replace(/\/g,'\\')+'"]';

var singleCount = document.querySelectorAll(singleBackslash).length;
var doubleCount = document.querySelectorAll(doubleBackslash).length;

var out = document.querySelector('textarea');
out.value  = "There are "+singleCount+" elements matching "+singleBackslash+"\n";
out.value += "There are "+doubleCount+" elements matching "+doubleBackslash;
<div data-file="foo\bar"></div>
<div id="d2"></div>
<textarea cols="60"></textarea>

在 Chrome v48.0.2564.109m on Win7x64 结果是:

There are 0 elements matching *[data-file="foo\bar"]
There are 2 elements matching *[data-file="foo\bar"]

我找不到任何需要此行为的 HTML 规范。所有浏览器都需要双反斜杠吗?什么规范对此进行了描述?

Selectors API Level 1 规范声明 querySelectorAll 接受一个 "selector string",即:

…a list of one or more group of selectors

它链接到的 Selectors Level 3 规范说:

Characters in Selectors can be escaped with a backslash according to the same escaping rules as CSS.

最后,它链接到的 CSS2.1 规范描述了反斜杠可用于转义内容的三种方式。

因此,querySelectorAll——与 JavaScript 内的任何用法分开——对反斜杠应用特殊含义。