根据我的理解,HTML5规范使您可以使用ID这样的数字。
<div id="1"></div>
<div id="2"></div>
我可以使用,getElementById
但不能使用querySelector
。如果尝试执行以下操作,则会在控制台中收到SyntaxError:DOM异常12。
document.querySelector("#1")
我很好奇,querySelector
当HTML5规范说数字有效时,为什么不能将数字用作ID起作用。我尝试了多种浏览器。
根据我的理解,HTML5规范使您可以使用ID这样的数字。
<div id="1"></div>
<div id="2"></div>
我可以使用,getElementById
但不能使用querySelector
。如果尝试执行以下操作,则会在控制台中收到SyntaxError:DOM异常12。
document.querySelector("#1")
我很好奇,querySelector
当HTML5规范说数字有效时,为什么不能将数字用作ID起作用。我尝试了多种浏览器。
Answers:
它是有效的,但是需要一些特殊的处理。从这里: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 ');
#\\31 0
-您可以参考mothereffingcssescapes.com
我需要一种自动化的方法。最近的更改意味着所使用的id值不再是简单的字母字符,而是包含数字和特殊字符。
我最终使用了CSS.escape
:https : //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
,表明选择器有效!
这是我刚才为处理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 );