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

butangphp
źródło

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");
Frédéric Hamidi
źródło
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
});
Pirijan
źródło
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
})
thakurdev
źródło
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);
Iman
źródło
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");
angelmedia
źródło
1

Spróbuj z następującym kodem:

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

  }
);
Yogesh
źródło