Pelo que entendi, a especificação HTML5 permite que você use IDs que são números como este.
<div id="1"></div>
<div id="2"></div>
Posso acessá-los usando, getElementById
mas não com querySelector
. Se eu tentar fazer o seguinte, obtenho SyntaxError: DOM Exception 12 no console.
document.querySelector("#1")
Estou curioso para saber por que usar números como IDs não funciona querySelector
quando a especificação do HTML5 diz que eles são válidos. Tentei vários navegadores.
javascript
html
css-selectors
selectors-api
Berry Blue
fonte
fonte
Respostas:
É válido, mas requer algum tratamento especial. A partir daqui: http://mathiasbynens.be/notes/css-escapes
Portanto, seu código acabaria como (CSS primeiro, JS depois):
fonte
#\\31 0
- você pode se referir a mothereffingcssescapes.comPorque, embora sejam válidos na especificação HTML5, não são válidos em CSS, que é o que significa " seletor de consulta ".
Em vez disso, você teria que fazer isso
document.querySelector("[id='1']")
:, o que é muito prolixo, considerando que você poderia dar a ele um ID significativo comomessage1
ou algo assim;)fonte
Eu precisava de uma abordagem automatizada. Uma mudança recente significa que os valores de id usados não são mais caracteres alfabéticos simples e incluem números e caracteres especiais.
Acabei usando
CSS.escape
: https://developer.mozilla.org/en-US/docs/Web/API/CSS/escapePrimeiro, este é o caso de falha:
E agora usando
CSS.escape
:Veja como muda corretamente para mostrar
After
, demonstrando que o seletor funcionou!fonte
Da documentação do W3C Sintaxe dos seletores de atributos
Portanto, dígitos ou cadeias alfanuméricas com dígito inicial não se qualificam como identificadores válidos.
Se você estiver usando um utilitário gerador de ID para gerar um identificador, pode acabar com ids alfanuméricos com dígitos iniciais.
Uma solução rápida seria omitir dígitos do SEED do gerador (se ele puder ser modificado) ou sempre anexar uma string ao id gerado.
fonte
Aqui está uma função que fiz agora para lidar com IDs de números iniciais em seletores CSS, e é segura para o IE, o que não é CSS.escape.
Passe o seletor por esta função cleanSelector antes de usá-lo:
fonte