2012-01-27 4 views
5

Ho un datepicker con un gestore di eventi onSelect. Più tardi nel mio programma, voglio aggiungere altri gestori onSelect. Il problema è che spazzano via il primo. (Fiddle.)Come aggiungere ulteriori gestori di eventi a un'istanza di jquery-ui datepicker?

Come posso aggiungere altri gestori senza farlo?

+1

Sembra che questo è stato chiesto prima: http://stackoverflow.com/q/2241725/1030169 – jmoerdyk

+0

ho pensato che sarebbe stato, ma non ho trovato, grazie. – sprugman

risposta

1

È possibile mantenere le chiamate desiderate in un array;

var firstHandler = function(dateText, inst) { 
    console.log('Original Handler', dateText, inst); 
}; 

var secondHandler = function(dateText, inst) { 
    console.log('Second Handler', dateText, inst); 
}; 

$('#datepicker').datepicker({ 
    onSelect: function() { 
     var sinks = $(this).data("mySelects"); 
     for (var i = 0; i < sinks.length; i++) 
      sinks[i].apply(this, arguments); 
    } 
}).data("mySelects", [firstHandler]); 

$('#addBtn').click(function(event) { 
    $('#datepicker').data('mySelects').push(secondHandler); 
    $('#datepicker').data('mySelects').push(nthHandler); 
}); 
+0

Grazie. Avevo appena finito di scrivere il codice quando ho visto il commento sopra. Penso che la soluzione collegata sia un po 'più elegante. Aggiornamento: in realtà, la tua versione è più elegante della mia. Hmm ... – sprugman

+0

Questa soluzione funziona bene in diverse situazioni (invece la soluzione collegata non funziona se, nel primo gestore, c'è una variabile che proviene dal contesto del primo gestore). Dove posso trovare la documentazione che mi spiega la soluzione? Non riesco a capire, ad esempio, gli argomenti variabili. –

+0

'.apply (this, arguments)' chiama la funzione in 'sinks []' assicurandosi che 'this' sia corretto nel gestore. Passa anche l'oggetto 'arguments' per passare tutti gli argomenti che' onSelect' ha originariamente ricevuto ('dateText' e' inst'). https: // developer.mozilla.org/it/JavaScript/Reference/Functions_and_function_scope/arguments' –