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 (”).