javascript - qué - ¿Obtiene elementos por atributo cuando querySelectorAll no está disponible sin usar bibliotecas?
verbo copulativo (9)
<p data-foo="bar">
¿Cómo puedes hacer el equivalente a
document.querySelectorAll(''[data-foo]'')
donde querySelectorAll no está disponible ?
Necesito una solución nativa que funcione al menos en IE7. No me importa IE6.
No usar en el navegador
En el navegador, use document.querySelect(''[attribute-name]'')
.
Pero si está realizando pruebas unitarias y su dominio falso tiene una implementación de querySelector escasa, esto hará el truco.
Esta es la respuesta de @ kevinfahy, simplemente recortada para que sea un poco con las funciones de flecha de grasa de ES6 y convirtiendo la colección de Html en una matriz a costa de la legibilidad.
Por lo tanto, solo funcionará con un transpondedor ES6. Además, no estoy seguro de qué tan eficiente será con muchos elementos.
function getElementsWithAttribute(attribute) {
return [].slice.call(document.getElementsByTagName(''*''))
.filter(elem => elem.getAttribute(attribute) !== null);
}
Y aquí hay una variante que obtendrá un atributo con un valor específico
function getElementsWithAttributeValue(attribute, value) {
return [].slice.call(document.getElementsByTagName(''*''))
.filter(elem => elem.getAttribute(attribute) === value);
}
Eso también funciona:
document.querySelector([attribute="value"]);
Asi que:
document.querySelector([data-foo="bar"]);
Esta es la forma más sencilla de obtener valor de atributo para mí
<p id="something" data-foo="your value">
<script type="text/javascript">
alert(document.getElementById(''something'').getAttribute(''data-foo''));
</script>
Respuesta tardía de dos años con la esperanza de ayudar al futuro seguidor.
Jugué un poco y terminé con esta solución cruda:
function getElementsByAttribute(attribute, context) {
var nodeList = (context || document).getElementsByTagName(''*'');
var nodeArray = [];
var iterator = 0;
var node = null;
while (node = nodeList[iterator++]) {
if (node.hasAttribute(attribute)) nodeArray.push(node);
}
return nodeArray;
}
El uso es bastante simple, y funciona incluso en IE8:
getElementsByAttribute(''data-foo'');
// or with parentNode
getElementsByAttribute(''data-foo'', document);
http://fiddle.jshell.net/9xaxf6jr/
Pero recomiendo usar querySelector
/ All
para esto (y para admitir que los navegadores más antiguos usen un polyfill ):
document.querySelectorAll(''[data-foo]'');
Prueba esto funciona
document.querySelector (''[attribute = "value"]'')
ejemplo:
document.querySelector(''[role="button"]'')
Prueba esto: cambié ligeramente las respuestas anteriores:
var getAttributes = function(attribute) {
var allElements = document.getElementsByTagName(''*''),
allElementsLen = allElements.length,
curElement,
i,
results = [];
for(i = 0; i < allElementsLen; i += 1) {
curElement = allElements[i];
if(curElement.getAttribute(attribute)) {
results.push(curElement);
}
}
return results;
};
Entonces,
getAttributes(''data-foo'');
Puede escribir una función que ejecute getElementsByTagName (''*'') y devuelva solo aquellos elementos con un atributo "data-foo":
function getAllElementsWithAttribute(attribute)
{
var matchingElements = [];
var allElements = document.getElementsByTagName(''*'');
for (var i = 0, n = allElements.length; i < n; i++)
{
if (allElements[i].getAttribute(attribute) !== null)
{
// Element exists with attribute. Add to array.
matchingElements.push(allElements[i]);
}
}
return matchingElements;
}
Entonces,
getAllElementsWithAttribute(''data-foo'');
Una pequeña modificación en la answer @kevinfahy, para permitir obtener el atributo por valor si es necesario:
function getElementsByAttributeValue(attribute, value){
var matchingElements = [];
var allElements = document.getElementsByTagName(''*'');
for (var i = 0, n = allElements.length; i < n; i++) {
if (allElements[i].getAttribute(attribute) !== null) {
if (!value || allElements[i].getAttribute(attribute) == value)
matchingElements.push(allElements[i]);
}
}
return matchingElements;
}
Utilizar
//find first element with "someAttr" attribute
document.querySelector(''[someAttr]'')
o
//find all elements with "someAttr" attribute
document.querySelectorAll(''[someAttr]'')
para encontrar elementos por atributo. Ahora es compatible con todos los navegadores relevantes (incluso IE8): http://caniuse.com/#search=queryselector