“querySelectorAll ()” con múltiples condiciones en JavaScript

6 minutos de lectura

Avatar de usuario de Alan Coromano
alan coromano

¿Es posible hacer una búsqueda por querySelectorAll() usando múltiples condiciones no relacionadas? Si es así, ¿cómo? Y, ¿cómo especificar si esos son criterios AND u OR?

Por ejemplo:

como encontrar todo formas, pagarena leyendas con un solo querySelectorAll() ¿llamar? ¿Posible?

Avatar de usuario de TJ Crowder
TJ Crowder

¿Es posible hacer una búsqueda por querySelectorAll usando múltiples condiciones no relacionadas?

Sí porque querySelectorAll acepta selectores CSS completos, y CSS tiene el concepto de grupos selectores, que le permite especificar más de un selector no relacionado. Por ejemplo:

var list = document.querySelectorAll("form, p, legend");

…devolverá una lista que contiene cualquier elemento que sea un form o p o legend.

CSS también tiene el otro concepto: Restricción basada en más criterios. Simplemente combina múltiples aspectos de un selector. Por ejemplo:

var list = document.querySelectorAll("div.foo");

…devolverá una lista de todos div elementos que también (y) tener la clase fooignorando a los demás div elementos.

Por supuesto, puedes combinarlos:

var list = document.querySelectorAll("div.foo, p.bar, div legend");

…que significa “Incluye cualquier div elemento que también tiene la foo clase, cualquiera p elemento que también tiene la bar clase y cualquier legend elemento que también está dentro de un div.”

  • ¿Existe la posibilidad de usar una sola clase de document.querySelectorAll? Por ejemplo, tengo var hotspots = document.querySelectorAll(“.clickMapItem.text , .clickMapItem.multiImageText”); var yo; for (i = 0; i

    – Milla Mijatović

    5 de noviembre de 2016 a las 9:18

  • @MileMijatovic: Las preguntas deben publicarse como preguntas y no como comentarios. Pero vea: stackoverflow.com/questions/25238153/…

    –TJ Crowder

    5 de noviembre de 2016 a las 9:22

  • Ok, pero en general, ¿es posible hacer lo que pedí? El enlace no ayudó

    – Milla Mijatović

    5 de noviembre de 2016 a las 10:04

  • El concepto de selector de grupos me funcionó todavía en 2018… gracias por compartir

    – Eric Hepperle – CodeSlayer2010

    18 oct 2018 a las 15:16

  • Año tras año, sigo usando document.querySelectorAll("div.foo", "div.bar") y nunca funcionó. Code UX es el próximo UX 😉

    – Gabriel Glenn

    12 de febrero de 2021 a las 13:54


avatar de usuario de mikus
mikus

De acuerdo con la documentación, al igual que con cualquier selector css, puede especificar tantas condiciones como desee, y se tratan como ‘O’ lógicos.

Este ejemplo devuelve una lista de todos los elementos div dentro del documento con una clase de “nota” o “alerta”:

var matches = document.querySelectorAll("div.note, div.alert");

fuente: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll

Mientras tanto, para obtener la funcionalidad ‘Y’, puede, por ejemplo, simplemente usar un selector de atributos múltiples, como dice jquery:

https://api.jquery.com/multiple-attribute-selector/

ex. "input[id][name$='man']" especifica tanto el id como el nombre del elemento y se deben cumplir ambas condiciones. Para las clases es tan obvio como “.class1.class2” para requerir objeto de 2 clases.

Todas las combinaciones posibles de ambos son válidas, por lo que puede obtener fácilmente expresiones equivalentes a ‘OR’ y ‘AND’ más sofisticadas.

  • Si bien el método en sí es correcto, no es necesario hacer referencia a jQuery para explicar CSS (especialmente porque la pregunta del OP se limita a JavaScript).

    – Chaya Cooper

    18 de diciembre de 2019 a las 19:58

  • supongo que no duele 🙂 una forma rápida de descubrir más opciones para aquellos que no trabajan con CSS a diario

    – mikus

    5 de julio de 2022 a las 10:34

Avatar de usuario de Alejandro DV
alejandro dv

Con JavaScript puro puedes hacer esto (como SQL) y cualquier cosa que necesites, básicamente:

<html>

<body>

<input type="button" value="F3" class="c2" id="btn_1">
<input type="button" value="F3" class="c3" id="btn_2">
<input type="button" value="F1" class="c2" id="btn_3">

<input type="submit" value="F2" class="c1" id="btn_4">
<input type="submit" value="F1" class="c3" id="btn_5">
<input type="submit" value="F2" class="c1" id="btn_6">

<br/>
<br/>

<button onclick="myFunction()">Try it</button>

<script>
    function myFunction() 
    {
        var arrFiltered = document.querySelectorAll('input[value=F2][type=submit][class=c1]');

            arrFiltered.forEach(function (el)
            {                
                var node = document.createElement("p");
                
                node.innerHTML = el.getAttribute('id');

                window.document.body.appendChild(node);
            });
        }
    </script>

</body>

</html>

  • esto realmente no responde la pregunta, específicamente la how to specify whether those are AND or OR criteria parte, ver respuesta aceptada

    –Meidan Alon

    21 de marzo de 2019 a las 20:36

Sí, querySelectorAll toma un grupo de selectores:

form, p, legend

Usando solo document.querySelectorAll('selector1, selector2, selector3') no funcionó para mí, tuve que usar forEach() junto con el método para lograr el resultado deseado.

document.querySelectorAll('selector1, selector2, selector3').forEach(item => {
        item.//code
    })
document.querySelectorAll('#id1, #id2, #id3').style="background-color: red";
document.querySelectorAll('#id4, #id5, #id6').forEach(item => {
    item.style="background-color: red";
})
<div id="id1">id1</div>
<div id="id2">id2</div>
<div id="id3">id3</div>
<div id="id4">id4</div>
<div id="id5">id5</div>
<div id="id6">id6</div>

Super Kai - Avatar de usuario de Kazuya Ito
Súper Kai – Kazuya Ito

Con consultaSelectorAll():

  • AND lógico (&&) se puede archivar especificando elementos y atributos sin comas.
  • O lógico (||) se puede archivar especificando elementos y atributos con comas.

Por ejemplo, hay 2 formularios como se muestra a continuación:

<form class="form1" method="post">
  <input type="text" id="input1" name="fruits" value="Apple">
  <p id="p1">Orange</p>
</form>
<form class="form2" method="post">
  <input type="text" id="input2" name="fruits" value="Banana">
  <p id="p2">Kiwi</p>
</form>

Luego, puede seleccionar de manzana <input> y de plátano <input> con [name="fruits"] Como se muestra abajo:

document.querySelectorAll('[name="fruits"]');
// Apple's <input> and Banana's <input>

Ahora, al especificar elementos y atributos sin comas, puede seleccionar solo de manzana <input> Como se muestra abajo:

                        // ↓ ↓ ↓ ↓ ↓  ↓ ↓ ↓               ↓ ↓ ↓ ↓ ↓ ↓ ↓     
document.querySelectorAll('form.form1 input[name="fruits"][id="input1"]');
// Apple's <input>

Además, puede reemplazar .form1 con [class="form1"] y [id="input1"] con #input1 Como se muestra abajo:

                        //         .form1                       [id="input1"]
                        //     ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓                     ↓ ↓ ↓ ↓
document.querySelectorAll('form[class="form1"] input[name="fruits"]#input1');
// Apple's <input>

A continuación, puede seleccionar de manzana <input> con #input1 Como se muestra abajo:

document.querySelectorAll('#input1');
// Apple's <input>

Ahora, al especificar elementos y atributos con comas, puede seleccionar de manzana <input>, de naranja <p>, de plátano <input> y de kiwi <p> Como se muestra abajo:

                        //          ↓ ↓ ↓ ↓  ↓     
document.querySelectorAll('#input1, #input2, p');
                        //        ↑        ↑
// Apple's <input>, Orange's <p>, Banana's <input> and Kiwi's <p>

y

Además, por supuesto, puedes usar ambos Y lógico y O lógico juntos como se muestra a continuación:

document.querySelectorAll('entrada#entrada1, entrada#entrada2, p#p1')[
// Apple's <input>, Orange's <p> and Banana's <input> 

¿Ha sido útil esta solución?