Metodo JQuery .on () con più gestori di eventi in un solo selettore


139

Prova di capire come usare il metodo .qu () di Jquery con un selettore specifico a cui sono associati più eventi. In precedenza stavo usando il metodo .live (), ma non ero sicuro di come realizzare la stessa impresa con .on (). Si prega di vedere il mio codice qui sotto:

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

So di poter assegnare più eventi chiamando:

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

Ma credo che l'uso corretto di .on () sarebbe così:

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

C'è un modo per raggiungere questo obiettivo? O qual è la migliore pratica qui? Ho provato il codice qui sotto, ma nessun dado.

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

Grazie in anticipo!

Risposte:


252

È il contrario . Dovresti scrivere:

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

1
Perché il selettore non è $("table.planning_grid td")?
Muers,

11
@Muers, funzionerebbe anche e l'interrogatore lo riconosce, ma ritiene anche che dovrebbe legare l'evento al <table>posto di ogni singolo <td>elemento, che è davvero la strada giusta da percorrere.
Frédéric Hamidi,

37
C'è un buon motivo per usare .on su <table> e non su <td> ed è se si aggiungono dinamicamente <td> s in seguito. $ ('table td'). on ... avrà effetto solo sui <td> presenti nella tabella nel momento in cui chiamate questa funzione. $ ('table'). on (..., 'td', function ...) effettuerà qualsiasi <td> che aggiungerai a questa tabella in seguito.
Raanan,

8
@Raanan, in effetti, e inoltre ogni gestore di eventi che si registra ha un costo, anche se minuscolo. Quando hai a che fare con migliaia di celle, la registrazione di un singolo gestore sull'elemento <table>anziché un gestore per <td>elemento diventa obbligatoria per ottenere prestazioni utilizzabili.
Frédéric Hamidi,

1
Concordato. È molto difficile trovare questa domanda su Google come 'on' è una parola così comune e la maggior parte dei risultati erano correlati a .binde .live. Buona risposta, proprio quello che stavo cercando: D @ Frédéric - Il tuo link non si collega più a un'intestazione idnella pagina dei documenti di jquery. Probabilmente a seguito di documentazione aggiornata. Ma non sono riuscito a trovare questa risposta su quella pagina.
nzifnab,

186

Inoltre, se vi fossero più gestori di eventi collegati allo stesso selettore che esegue la stessa funzione, è possibile utilizzare

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

5
questo è quello che stavo cercando
RozzA

... e quindi ottenere l'attuale tipo di evento generato con e.type (dopo aver aggiunto l'evento come parametro, ovvero ... funzione (e) ...
William T. Mallard

24

Se si desidera utilizzare la stessa funzione su eventi diversi, è possibile utilizzare il seguente blocco di codice

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

11

Ho imparato qualcosa di veramente utile e fondamentale da qui .

concatenamento funzioni è molto utile in questo caso che funziona sulla maggior parte delle funzioni jQuery inclusi in uscita funzione troppo.

Funziona perché l'output della maggior parte delle funzioni jQuery sono i set di oggetti di input in modo da poterli usare immediatamente e renderli più brevi e più intelligenti

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

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

7

E puoi combinare gli stessi eventi / funzioni in questo modo:

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

1

Prova con il seguente codice:

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

  }
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.