使用带有数字 ID 的 querySelector

IT技术 javascript html css-selectors selectors-api
2021-01-20 06:20:04

据我了解,HTML5 规范允许您使用像这样的数字 ID。

<div id="1"></div>
<div id="2"></div>

我可以使用getElementById但不能使用querySelector. 如果我尝试执行以下操作,我会在控制台中收到SyntaxError: DOM Exception 12

document.querySelector("#1")

我只是好奇为什么querySelector当 HTML5 规范说这些是有效的时,使用数字作为 ID 不起作用我尝试了多个浏览器。

6个回答

它是有效的,但需要一些特殊处理。从这里:http : //mathiasbynens.be/notes/css-escapes

前导数字

如果标识符的第一个字符是数字,则需要根据其 Unicode 代码点对其进行转义。例如,字符 1 的代码点是 U+0031,因此您可以将其转义为 \000031 或 \31 。

基本上,要转义任何数字字符,只需在它前面加上 \3 并附加一个空格字符 ( )。耶 Unicode!

所以你的代码最终会变成(CSS第一,JS第二):

#\31  {
    background: hotpink;
}

document.getElementById('1');
document.querySelector('#\\31 ');
大于 9 的值的语法是什么?我无法让它与 10 这样的 ID 一起使用。
2021-03-29 06:20:04
感谢您的跟进和链接!
2021-04-10 06:20:04
第一个字符后需要一个空格:#\\31 0- 可以参考mothereffingcssescapes.com
2021-04-12 06:20:04
请注意,仅当转义序列后紧跟一个十六进制数字字符时才需要空格,以便将该字符与转义序列区分开来。有关更多详细信息,请参阅w3.org/TR/CSS21/syndata.html#characters
2021-04-12 06:20:04

因为虽然它们在 HTML5 规范中有效,但它们在 CSS 中无效,这就是“查询选择器”的意思。

相反,您必须这样做: document.querySelector("[id='1']"),考虑到您可以给它一个有意义的ID 之类的message1东西,这是非常冗长的;)

如果您有 ID 列表,则可以使用 document.querySelectorAll(myIds.map(id => `[id="${id}"]`).join(', '))
2021-03-24 06:20:04
非常感谢你!!!我花了很多时间在“CSS 字符转义序列”上。这是简单而优雅的方式。
2021-03-29 06:20:04
您不必“必须” - 有一种方法可以使用带有前导数字的 id 选择器。我同意虽然最好有一个有意义的id。
2021-04-02 06:20:04
UUID 可以以数字开头。
2021-04-02 06:20:04

我需要一种自动化的方法。最近的变化意味着使用的 id 值不再是简单的字母字符,而是包括数字和特殊字符。

我最终使用了CSS.escapehttps : //developer.mozilla.org/en-US/docs/Web/API/CSS/escape

console.log(CSS.escape('1'));

首先,这是失败的情况:

const theId = "1";
document.querySelector(`#${theId}`);
const el = document.querySelector(`#${theId}`);
el.innerHTML = "After";
<div id="1">Before</div>

现在使用CSS.escape

const theId = "1";
const el = document.querySelector(`#${CSS.escape(theId)}`);
el.innerHTML = "After";
<div id="1">Before</div>

查看它如何正确更改为 show After,演示选择器的工作原理

很好的解决方案,在生产中使用它。
2021-03-19 06:20:04
到今天为止,当您需要处理一些您无法控制的奇怪 ID 时,这是最干净的解决方案,也因为所有现代浏览器都支持它。
2021-04-04 06:20:04

这是我刚刚创建的一个函数,用于处理 CSS 选择器中的前导数字 ID,它是 IE 安全的,因为 CSS.escape 不是。

在使用之前通过这个 cleanSelector 函数传递选择器:

var cleanSelector = function(selector){
    (selector.match(/(#[0-9][^\s:,]*)/g) || []).forEach(function(n){
        selector = selector.replace(n, '[id="' + n.replace("#", "") + '"]');
    });
    return selector;
};

var myselector = ".dog #980sada_as div span#aside:hover div.apple#05crab:nth-of-type(2), .ginger #2_green_div, div.cupcake #darwin p#23434-346365-53453";

var clean_myselector = cleanSelector(myselector);

// print to show difference
console.log(myselector);
console.log(clean_myselector);

//use the new selector like normal
var elems = document.querySelectorAll( clean_myselector ); 


来自 W3C 文档属性选择器语法

属性值必须是有效的 CSS 标识符或字符串。

因此,带有前导数字的数字或字母数字字符串不能作为有效标识符。

如果您使用 ID 生成器实用程序来生成标识符,则最终可能会得到带有前导数字的字母数字 ID。

一个快速的解决方法是从生成器的 SEED 中省略数字(如果它可以被修改)或者总是将一个字符串附加到生成的 id 中。

“......总是追加一个字符串生成的ID”你的意思“......总是预先小彭一个字母串生成的ID”?
2021-03-30 06:20:04