Sovrascrivere la funzione jQuery .val ()?

C’è un modo per sovrascrivere facilmente la funzione val() di jQuery?

Il motivo per cui voglio sovrascriverlo è che voglio aggiungere qualche elaborazione ogni volta che viene impostato un valore per un elemento. E non voglio creare un altro valore personalizzato, come myVal() .

È ansible memorizzare un riferimento alla funzione val originale, quindi sovrascriverla ed eseguire l’elaborazione, e in seguito richiamarla con la call , per utilizzare il contesto corretto:

 (function ($) { var originalVal = $.fn.val; $.fn.val = function(value) { if (typeof value != 'undefined') { // setter invoked, do processing } return originalVal.call(this, value); }; })(jQuery); 

Nota che puoi distinguere tra una chiamata getter $(selector).val(); e una chiamata setter $(selector).val('new value'); solo controllando se l’argomento value undefined è undefined o no.

So che è un argomento vecchio ma è prima nella ricerca su google e la risposta non è completamente giusta …

Ad esempio, se provi nella console $('#myinput').val() dovresti ottenere il valore di #myinput.

Ma se fai $('#myinput').val(undefined) dovresti impostare il valore di #myinput! (Con la risposta corrente e i suoi commenti, non imposterai il valore di #myinput)

Ecco una risposta aggiornata che utilizza arguments .

 (function ($) { var originalVal = $.fn.val; $.fn.val = function(value) { if (arguments.length >= 1) { // setter invoked, do processing return originalVal.call(this, value); } //getter invoked do processing return originalVal.call(this); }; })(jQuery); 

se vuoi passare tutti gli argomenti puoi anche usare apply

 (function ($) { var originalVal = $.fn.val; $.fn.val = function(value) { if (arguments.length >= 1) { // setter invoked, do processing } else { //getter invoked do processing } return originalVal.apply(this, arguments); }; })(jQuery); 

Spero che aiuti!

So che il problema è vecchio ma solo per dare una soluzione completa. Per far sì che jQuery.val () e jQuery.val (valore) funzionino dopo l’override, è necessario sovrascriverlo correttamente e separatamente. Perché quando si chiama jQuery.val () then originalVal.call (this, value); non funzionerà correttamente.

Per farlo in modo corretto è necessario fare qualcosa del genere quando si ottiene il valore: originalVal.call (this);

Ecco un sito dove tutto è spiegato: http://extremedev.blogspot.com/2012/01/override-jqueryval-and-jqueryvalvalue.html

Cordiali saluti, Roman

Se ti sto capendo bene, qualcosa del genere dovrebbe fare bene il trucco:

 jQuery.fn.val = function (new_val) { alert("You set a val! How wonderful!"); this.value = new_val; }; 

Assicurati di includere la funzionalità regolare: ottenere i valori dei selettori e così via. Basta inserire quel codice dopo la normale libreria jQuery.

Ho qualcosa da aggiungere alla risposta CMS, la mia implementazione sarebbe diversa e sarebbe così:

 (function ($) { var fnVal = $.fn.val; $.fn.val = function(value) { if (typeof value == 'undefined') { return fnVal.call(this); } var result = fnVal.call(this, value); $.fn.change.call(this); // here you can add some more implementation return result; }; })(jQuery); 

osserva $ .fn.change.call (this); verrà chiamato prima di uscire dalla funzione val (”) che attiverà anche il .change () su ogni assegnazione val (”).