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.