jQuery eventi multipli per attivare la stessa funzione


977

C'è un modo per avere keyup, keypress, blur, e changegli eventi chiamare la stessa funzione in una riga o devo fare separatamente?

Il problema che ho è che devo convalidare alcuni dati con una ricerca db e vorrei assicurarmi che la convalida non venga persa in ogni caso, sia che venga digitata o incollata nella casella.

Risposte:


1794

È possibile utilizzare .on()per associare una funzione a più eventi:

$('#element').on('keyup keypress blur change', function(e) {
    // e.type is the type of event fired
});

O semplicemente passare la funzione come parametro alle normali funzioni di evento:

var myFunction = function() {
   ...
}

$('#element')
    .keyup(myFunction)
    .keypress(myFunction)
    .blur(myFunction)
    .change(myFunction)

3
Con eventi separati da spazi come includere anche la spaziatura dei nomi? .on('keyup.foo keypress.foo blur.foo change.foo', …)o .on('keyup keypress blur change .foo', …)?
— Sukima,

24
Il problema è che myFunction verrà probabilmente chiamato più volte, cosa che potresti voler evitare.
— Esger,

2
Come posso passare i parametri in questa funzione?
— kushalvm,

@Esger Comunque per fare questo? Nel cellulare, ho sempre bisogno di on('click tap', e => {...}). L'ascoltatore può essere attivato due volte, voglio solo attivarlo una volta, come posso programmare nella funzione di ascolto?
— Tomision,

9
@Tomlsion Forse aggiungere un className 'occupato' all'elemento nella funzione chiamata, quindi $('#element:not(.busy)').on('keyup keypress blur change', function(e){…});rimuovere infine className 'occupato'.
— Esger,

60

A partire da jQuery 1.7, il .on()metodo è il metodo preferito per allegare i gestori di eventi a un documento. Per le versioni precedenti, il .bind()metodo viene utilizzato per collegare un gestore eventi direttamente agli elementi.

$(document).on('mouseover mouseout',".brand", function () {
  $(".star").toggleClass("hovered");
})

1
Questo viene fatto per un evento delegato, funzionerà, ma non è il modo più semplice di farlo, né il più efficiente.
— Ben Taliadoros,

1
La delega degli eventi è importante e può (o non può essere) necessaria a seconda del momento in cui lo script viene caricato / eseguito e se gli elementi esistono nel DOM al momento del caricamento / esecuzione dello script.
— random_user_name

45

Stavo cercando un modo per ottenere il tipo di evento quando jQuery ascolta diversi eventi contemporaneamente e Google mi ha messo qui.

Quindi, per chi fosse interessato, event.typeè la mia risposta:

$('#element').on('keyup keypress blur change', function(event) {
    alert(event.type); // keyup OR keypress OR blur OR change
});

Maggiori informazioni nel documento jQuery .


24

È possibile utilizzare il metodo bind per associare la funzione a diversi eventi. Basta passare i nomi degli eventi e la funzione del gestore come in questo codice:

$('#foo').bind('mouseenter mouseleave', function() {
  $(this).toggleClass('entered');
});

Un'altra opzione è quella di utilizzare il supporto per il concatenamento di jquery api.


9
A partire da jQuery 1.7, il metodo .on () è il metodo preferito per associare i gestori di eventi a un documento.
— Dzhuneyt,

18

Se si collega lo stesso gestore di eventi a più eventi, si verifica spesso il problema di più di uno di essi che si attiva contemporaneamente (ad esempio, l'utente preme la scheda dopo la modifica; il keydown, il cambiamento e la sfocatura potrebbero attivarsi tutti).

Sembra che quello che vuoi davvero sia qualcosa del genere:

$('#ValidatedInput').keydown(function(evt) {
  // If enter is pressed
  if (evt.keyCode === 13) {
    evt.preventDefault();

    // If changes have been made to the input's value, 
    //  blur() will result in a change event being fired.
    this.blur();
  }
});

$('#ValidatedInput').change(function(evt) {
  var valueToValidate = this.value;

  // Your validation callback/logic here.
});

14

Questo è come lo faccio.

$("input[name='title']").on({
    "change keyup": function(e) {
        var slug = $(this).val().split(" ").join("-").toLowerCase();
        $("input[name='slug']").val(slug);
    },
});

11

È possibile definire la funzione che si desidera riutilizzare come di seguito:

var foo = function() {...}

E in seguito puoi impostare comunque quanti listener di eventi vuoi sul tuo oggetto per attivare quella funzione usando on ('event') lasciando uno spazio in mezzo come mostrato di seguito:

$('#selector').on('keyup keypress blur change paste cut', foo);

3
Generalmente dovresti spiegare la tua risposta. Semplicemente incollare il codice non fa nulla per aiutare l'OP a capire il suo problema o la tua soluzione.
— leigero,

cosa succede se ho bisogno del primo argomento nella funzione di sottoscrizione dell'evento jquery (evento)? Come usarlo?
— Dr.X

Va bene, puoi semplicemente dichiarare la funzione con il parametro event e quindi accedervi dal metodo. Questi eventi passeranno l'oggetto in se stessi. Spero che questo possa essere d'aiuto. var foo = function (event) {console.log (event); } $ ('# selettore'). on ('keyup keypress sfocatura modifica incolla taglio', pippo);
— Coder Of The Galaxy,

7

La risposta di Tatu è come lo farei intuitivamente, ma ho riscontrato alcuni problemi in Internet Explorer con questo modo di annidare / associare gli eventi, anche se è stato fatto con il .on()metodo.

Non sono stato in grado di individuare esattamente con quali versioni di jQuery questo è il problema. Ma a volte vedo il problema nelle seguenti versioni:

  • 2.0.2
  • 1.10.1
  • 1.6.4
  • Cellulare 1.3.0b1
  • Cellulare 1.4.2
  • Mobile 1.2.0

La mia soluzione è stata innanzitutto definire la funzione,

function myFunction() {
    ...
}

e quindi gestire gli eventi singolarmente

// Call individually due to IE not handling binds properly
$(window).on("scroll", myFunction);
$(window).on("resize", myFunction);

Questa non è la soluzione più carina, ma funziona per me, e ho pensato di metterla lì fuori per aiutare gli altri che potrebbero inciampare in questo problema


5
$("element").on("event1 event2 event..n", function() {
   //execution
});

Questo tutorial riguarda la gestione di più eventi.


4

C'è un modo per avere keyup, keypress, blur, e changegli eventi chiamare la stessa funzione in una linea?

È possibile utilizzare .on(), che accetta la seguente struttura:, .on( events [, selector ] [, data ], handler )quindi è possibile passare più eventi a questo metodo. Nel tuo caso dovrebbe apparire così:

$('#target').on('keyup keypress blur change', function(e) {
    // "e" is an event, you can detect the type of event using "e.type"
});

Ed ecco l'esempio dal vivo:

$('#target').on('keyup keypress blur change', function(e) {
  console.log(`"${e.type.toUpperCase()}" event happened`)
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="target">


2

È semplice implementarlo con i metodi DOM integrati senza una grande libreria come jQuery, se vuoi, richiede solo un po 'più di codice - iterare su una matrice di nomi di eventi e aggiungere un listener per ciascuno:

function validate() {
  // ...
}

const element = document.querySelector('#element');
['keyup', 'keypress', 'blur', 'change'].forEach((eventName) => {
  element.addEventListener(eventName, validate);
});
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.