JQuery .on () z wieloma programami obsługi zdarzeń do jednego selektora


139

Próbuję dowiedzieć się, jak użyć metody Jquery .on () z określonym selektorem, z którym jest powiązanych wiele zdarzeń. Wcześniej korzystałem z metody .live (), ale nie byłem pewien, jak wykonać to samo zadanie z .on (). Zobacz mój kod poniżej:

$("table.planning_grid td").live({
  mouseenter:function(){
     $(this).parent("tr").find("a.delete").show();
  },
  mouseleave:function(){
     $(this).parent("tr").find("a.delete").hide();        
  },
  click:function(){
    //do something else.
  }
});

Wiem, że mogę przypisać wiele wydarzeń, dzwoniąc pod numer:

 $("table.planning_grid td").on({
    mouseenter:function(){  //see above
    },
    mouseleave:function(){ //see above
    }
    click:function(){ //etc
    }
  });

Ale uważam, że właściwe użycie .on () wyglądałoby tak:

   $("table.planning_grid").on('mouseenter','td',function(){});

Czy istnieje sposób, aby to osiągnąć? Albo jaka jest tutaj najlepsza praktyka? Wypróbowałem poniższy kod, ale bez kości.

$("table.planning_grid").on('td',{
   mouseenter: function(){ /* event1 */ }, 
   mouseleave: function(){ /* event2 */ },
   click: function(){  /* event3 */ }
 });

Z góry dziękuję!

Odpowiedzi:


252

To jest na odwrót . Powinieneś napisać:

$("table.planning_grid").on({
    mouseenter: function() {
        // Handle mouseenter...
    },
    mouseleave: function() {
        // Handle mouseleave...
    },
    click: function() {
        // Handle click...
    }
}, "td");

1
Dlaczego nie jest selektorem $("table.planning_grid td")?
— Muers

11
@Muers, to również by zadziałało, a pytający przyznaje, ale uważa również, że powinien powiązać wydarzenie <table>z każdym pojedynczym <td>elementem, a nie z każdym pojedynczym elementem, co jest rzeczywiście właściwą drogą.
— Frédéric Hamidi

37
Jest dobry powód, aby używać .on w <table>, a nie w <td>, i to jeśli później dynamicznie dodasz <td> s. $ ('table td'). on ... wpłynie tylko na <td>, które są w tabeli w momencie wywołania tej funkcji. $ ('table'). on (..., 'td', function ...) wpłynie na każde <td>, które później dodasz do tej tabeli.
— Raanan

8
@Raanan, rzeczywiście, a ponadto każdy rejestrowany przez nas program obsługi zdarzeń ma koszt, choć niewielki. Kiedy masz do czynienia z tysiącami komórek, zarejestrowanie jednego programu obsługi w module obsługi <table>zamiast jednego na <td>element staje się obowiązkowe, aby uzyskać użyteczną wydajność.
— Frédéric Hamidi

1
Zgoda. Bardzo trudno znaleźć w Google to pytanie, ponieważ „włączone” to takie popularne słowo, a większość wyników dotyczyła .bindi .live. Dobra odpowiedź, właśnie to, czego szukałem: D @ Frédéric - Twój link nie prowadzi już do nagłówka idna stronie dokumentacji jquery. Prawdopodobnie w wyniku zaktualizowanej dokumentacji. Ale nie mogłem znaleźć odpowiedzi na tej stronie.
— nzifnab

186

Ponadto, jeśli masz wiele programów obsługi zdarzeń dołączonych do tego samego selektora wykonującego tę samą funkcję, możesz użyć

$('table.planning_grid').on('mouseenter mouseleave', function() {
    //JS Code
});

5
właśnie tego szukałem
— RozzA

... a następnie uzyskaj rzeczywisty typ wywołanego zdarzenia z e.type (po dodaniu zdarzenia jako parametru, tj. ... function (e) ...
— William T. Mallard

24

Jeśli chcesz używać tej samej funkcji w różnych zdarzeniach, możesz użyć następującego bloku kodu

$('input').on('keyup blur focus', function () {
   //function block
})

11

Dowiedziałem się coś naprawdę przydatnego i fundamentalnej z tutaj .

tworzenie łańcuchów funkcji jest w tym przypadku bardzo przydatne, co działa w przypadku większości funkcji jQuery, w tym również na wyjściu funkcji.

Działa, ponieważ wyjście większości funkcji jQuery to zestawy obiektów wejściowych, dzięki czemu można ich używać od razu i sprawić, by było krótsze i inteligentniejsze

function showPhotos() {
    $(this).find("span").slideToggle();
}

$(".photos")
    .on("mouseenter", "li", showPhotos)
    .on("mouseleave", "li", showPhotos);

7

Możesz łączyć te same zdarzenia / funkcje w ten sposób:

$("table.planning_grid").on({
    mouseenter: function() {
        // Handle mouseenter...
    },
    mouseleave: function() {
        // Handle mouseleave...
    },
    'click blur paste' : function() {
        // Handle click...
    }
}, "input");

1

Spróbuj z następującym kodem:

$("textarea[id^='options_'],input[id^='options_']").on('keyup onmouseout keydown keypress blur change', 
  function() {

  }
);
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.