jQuery mismo evento de clic para múltiples elementos


436

¿Hay alguna forma de ejecutar el mismo código para diferentes elementos en la página?

$('.class1').click(function() {
   some_function();
});

$('.class2').click(function() {
   some_function();
});

en lugar de hacer algo como:

$('.class1').$('.class2').click(function() {
   some_function();
});

Gracias

Respuestas:


867
$('.class1, .class2').on('click', some_function);

O:

$('.class1').add('.class2').on('click', some_function);

Esto también funciona con objetos existentes:

const $class1 = $('.class1');
const $class2 = $('.class2');
$class1.add($class2).on('click', some_function);

11
Para ayudar a los desarrolladores a recordar esto, incluso si es un poco más extendido usando más clases de psuedo, es el mismo formato que aplicar un selector CSS al definir estilos
Brett Weber

8
¿Qué pasaría si la clase 2 se hubiera almacenado en caché como esta var class2 = $ (". Class2")?
Vivek S

18
@NeverBackDown también .add()funciona con objetos jquery
Eevee

2
Tenga en cuenta que esto aún adjuntará eventos a los objetos jquery que existen, incluso si uno de los selectores devuelve indefinido.
Ben Sewards

3
¿Alguien puede explicar cuál es la verdadera diferencia entre $('.class1, .class2')y $('.class1').add('.class2')? en que caso debemos usar .add()?
Taufik Nur Rahmanda

108

Normalmente uso en onlugar de click. Me permite agregar más oyentes de eventos a una función específica.

$(document).on("click touchend", ".class1, .class2, .class3", function () {
     //do stuff
});

¡Espero eso ayude!


1
Me gusta más así. Pero, ¿puede apuntar a un elemento por clase y uno por ID en la misma declaración? Por ejemplo, $ (document) .on ("click touchend", ".class1, # id1, .class3", function () {// do stuff});
Gaurav Ojha

3
un año después: sí, puedes! @GauravOjha
Obed Marquez Parlapiano

3
Esta técnica, crear un controlador delegado, en lugar de un controlador directo, también ofrece la ventaja única de manejar eventos activados por elementos coincidentes creados después de registrar el controlador. Ver: api.jquery.com/on
Jonathan Lidbeck

39
$('.class1, .class2').click(some_function);

Asegúrese de poner un espacio como $ ('. Class1, space here.class2') o de lo contrario no funcionará.


17

Simplemente use $('.myclass1, .myclass2, .myclass3')para múltiples selectores. Además, no necesita funciones lambda para vincular una función existente al evento click.


77
necesitas un espacio después de las comas
Maurizio En Dinamarca

10

Otra alternativa, suponiendo que sus elementos se almacenan como variables (que a menudo es una buena idea si accede a ellos varias veces en un cuerpo de función):

function disableMinHeight() {
    var $html = $("html");
    var $body = $("body");
    var $slideout = $("#slideout");

    $html.add($body).add($slideout).css("min-height", 0);
};

Aprovecha el encadenamiento de jQuery y le permite usar referencias.


4

Si tiene o desea mantener sus elementos como variables (objetos jQuery), también puede recorrerlos:

var $class1 = $('.class1');
var $class2 = $('.class2');

$([$class1,$class2]).each(function() {
    $(this).on('click', function(e) {
        some_function();
    });
});

3

Agregue una lista de clases separadas por comas como esta:

jQuery(document).ready(function($) {

$('.class, .id').click(function() { 

//  Your code

    }

});

2

Podemos codificar como el siguiente también, he usado el evento de desenfoque aquí.

$("#proprice, #proqty").blur(function(){
      var price=$("#proprice").val();
      var qty=$("#proqty").val();
      if(price != '' || qty != '')
      {
          $("#totalprice").val(qty*price);
      }
  });

1

Tengo un enlace a un objeto que contiene muchos campos de entrada, lo que requiere ser manejado por el mismo evento. Así que simplemente uso find () para obtener todos los objetos internos, que necesitan tener el evento

var form = $('<form></form>');
// ... apending several input fields

form.find('input').on('change', onInputChange);

En caso de que sus objetos estén un nivel abajo, se puede usar el enlace children () en su lugar find () .


1

Además de los excelentes ejemplos y respuestas anteriores, también puede hacer un "hallazgo" para dos elementos diferentes utilizando sus clases. Por ejemplo:

<div class="parent">
<div class="child1">Hello</div>
<div class="child2">World</div>
</div>

<script>
var x = jQuery('.parent').find('.child1, .child2').text();
console.log(x);
</script>

Esto debería generar "HelloWorld".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.