jQuery to samo zdarzenie kliknięcia dla wielu elementów


435

Czy jest jakiś sposób na wykonanie tego samego kodu dla różnych elementów na stronie?

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

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

zamiast tego zrobić coś takiego:

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

Dzięki

Odpowiedzi:


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

Lub:

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

Działa to również z istniejącymi obiektami:

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

11
Aby pomóc programistom zapamiętać to, nawet jeśli jest nieco bardziej rozbudowany przy użyciu większej liczby klas psuedo, jest to ten sam format, co zastosowanie selektora css podczas definiowania stylów
Brett Weber

8
Co by było, gdyby klasa 2 była buforowana w ten sposób var class2 = $ (". Class2")?
Vivek S

18
@NeverBackDown .add()działa również z obiektami jquery
Eevee

2
Zauważ, że nadal będzie to dołączało zdarzenia do istniejących obiektów jquery, nawet jeśli jeden z selektorów zwróci niezdefiniowany.
Ben Sewards,

3
czy ktoś może wyjaśnić, jaka jest prawdziwa różnica między $('.class1, .class2')i $('.class1').add('.class2')? w jakim przypadku powinniśmy użyć .add()?
Taufik Nur Rahmanda

108

Zwykle używam onzamiast click. Pozwala mi dodawać więcej detektorów zdarzeń do określonej funkcji.

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

Mam nadzieję, że to pomoże!


1
Lubię to w ten sposób. Ale czy możesz kierować jeden element według klasy i jeden według identyfikatora w tej samej deklaracji? Na przykład $ (document) .on („click touchend”, „.class1, # id1, .class3”, function () {// do stuff});
Gaurav Ojha

3
rok później: tak, możesz! @GauravOjha
Obed Marquez Parlapiano

3
Ta technika - tworzenie delegowanej, a nie bezpośredniej procedury obsługi - oferuje także wyjątkową zaletę obsługi zdarzeń wyzwalanych przez dopasowanie elementów utworzonych po zarejestrowaniu procedury obsługi. Zobacz: api.jquery.com/on
Jonathan Lidbeck

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

Upewnij się, że wstawiłeś spację jak $ ('. Class1, space here.class2'), bo inaczej to nie zadziała.


17

Po prostu użyj $('.myclass1, .myclass2, .myclass3')dla wielu selektorów. Ponadto nie potrzebujesz funkcji lambda, aby powiązać istniejącą funkcję ze zdarzeniem click.


7
potrzebujesz spacji po przecinkach
Maurizio W Danii

10

Inna alternatywa, zakładając, że twoje elementy są przechowywane jako zmienne (co często jest dobrym pomysłem, jeśli korzystasz z nich wielokrotnie w ciele funkcji):

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

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

Korzysta z łączenia łańcuchów jQuery i pozwala korzystać z referencji.


4

Jeśli masz lub chcesz zachować swoje elementy jako zmienne (obiekty jQuery), możesz również nad nimi zapętlić:

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

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

3

Dodaj listę klas oddzielonych przecinkami:

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

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

//  Your code

    }

});

2

Możemy kodować w następujący sposób, użyłem tutaj zdarzenia rozmycia.

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

1

Mam link do obiektu zawierającego wiele pól wejściowych, które wymagają obsługi przez to samo zdarzenie. Więc po prostu używam find (), aby uzyskać wszystkie wewnętrzne obiekty, które muszą mieć zdarzenie

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

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

W przypadku, gdy twoje obiekty znajdują się o jeden poziom niżej, zamiast metody find () można użyć metody link child () .


1

Oprócz doskonałych przykładów i odpowiedzi powyżej możesz także wykonać „znajdź” dla dwóch różnych elementów za pomocą ich klas. Na przykład:

<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>

To powinno wypisać „HelloWorld”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.