Búsqueda de sitios web

javascript - Usando querySelector con IDs que son números


Por lo que entiendo, la especificación de HTML5 te permite usar IDs que son números así.

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

Puedo acceder a estos bien usando getElementById pero no con querySelector. Si intento hacer lo siguiente, obtengo SyntaxError: DOM Exception 12 en la consola.

document.querySelector("#1")

Solo tengo curiosidad de por qué usar números como IDs no funciona con querySelector cuando la especificación de HTML5 dice que son válidos. He probado en varios navegadores.

Respuesta #1

Es válido, pero requiere un manejo especial. Desde aquí: http://mathiasbynens.be/notes/css-escapes

Dígitos iniciales

Si el primer carácter de un identificador es numérico, necesitarás escaparlo según su punto de código Unicode. Por ejemplo, el punto de código para el carácter 1 es U+0031, por lo que lo escaparías como \000031 o \31.

Básicamente, para escapar cualquier carácter numérico, solo prefíjalo con \3 y agregue un espacio ( ). ¡Yay Unicode!

Entonces tu código terminaría así (CSS primero, JS segundo):

#\31  {
    background: hotpink;
}

document.getElementById('1');
document.querySelector('#\\31 ');

Respuesta #2

Porque aunque son válidos en la especificación de HTML5, no son válidos en CSS, que es lo que significa "query selector".

En su lugar, tendrías que hacer esto: document.querySelector("[id='1']"), lo cual es muy largo considerando que podrías darle un ID significativo como message1 o algo ;)

Respuesta #3

Necesitaba un enfoque que fuera automatizado. Un cambio reciente significaba que los valores de id utilizados ya no eran simples caracteres alfabéticos e incluían números y caracteres especiales.

Terminé usando CSS.escape: https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape

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

Primero, este es el caso fallido:

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

Y ahora usando CSS.escape:

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

Mira cómo cambia correctamente para mostrar After, ¡demostrando que el selector funcionó!

Artículos relacionados