2010-01-13 17 views
27

C'è un modo per sovrascrivere facilmente la funzione val() di jQuery?Sovrascrivere la funzione jQuery .val()?

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 ad esempio myVal().

+0

Suppongo che l'evento .change() non funzioni per voi qui? –

+0

@Mark: Quando imposto il valore degli elementi facendo $ ('# foo'). Val ('someValue') l'evento .change() non viene attivato. Sembra solo essere attivato quando il valore viene modificato dall'utente sulla GUI/Browser. – 7wp

+0

$ ('# foo'). Val ('someValue'). Trigger ('change'); potrebbe essere utile inserire il trigger qui dentro ... –

risposta

46

È possibile memorizzare un riferimento alla funzione originale val, poi ignorare e fare la vostra elaborazione, e poi richiamare con call, di utilizzare il giusto contesto:

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

noti che è possibile distinguere tra un getter chiama $(selector).val(); e una chiamata setter $(selector).val('new value'); solo controllando se l'argomento value è undefined o no.

+0

Grazie, molto apprezzato. – 7wp

+4

Questo non funzionerà (almeno non in jQuery 1.7). La funzione jQuery originale si basa sul conteggio degli argomenti, quindi considererà il metodo val() originale sempre un setter. Per risolvere questo problema, sostituire "return originalVal.call (this, value);" con "return originalVal.apply (this, arguments);" – dkl

+4

Né l'originale, né la modifica proposta da @dkl funzionano con Chrome. Usando un if..else per verificare se stai ottenendo o le impostazioni funzionano. Di seguito è riportato un override trasparente, modificare se necessario. (function ($) { var originalVal = $ .fn.val; $ .fn.val = function (value) { if (typeof value == 'undefined') { return originalVal.call (this); } else { return originalVal.call (this, value); } }; }) (jQuery); – Martijn

1

Se sto capendo destro, qualcosa di simile dovrebbe fare il trucco bene:

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

Basta fare in modo di includere la funzionalità normale: i valori che ottengono di seleziona e così via. Basta inserire il codice dopo il dopo la normale libreria jQuery.

+0

Non copiare il comportamento originale, basta chiamarlo esplicitamente per garantire compatibilità e compatibilità con altre sostituzioni della funzione val(). – Martijn

+0

@Martijn: Se avessi saputo due anni fa quello che so ora, l'avrei fatto. Ma sfortunatamente è un po 'tardi per quello. – Reid

2

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

saluti, romana

+5

Grazie Roman lo sapevo già, ma tu stai facendo un po 'di auto promozione qui per il tuo sito. Sarebbe più utile se almeno si incollasse anche la risposta completa nello stack overflow. In questo modo se il tuo sito scompare mai da internet, la tua risposta sarebbe ancora intatta su questo sito affinché le persone possano vederla. Sarebbe molto più utile Roman. Grazie comunque per il tuo impegno. – 7wp

+1

@ 7wp +1 bel commento. –

+0

Sarebbe bello se quel codice funzionasse anche! Dove è definito "widgetElementId" prima di provare a risolverlo con jQuery? –

15

Lo so che è un vecchio argomento ma è prima in Ricerca Google e la risposta non è completamente a destra ...

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

Ma se lo fai $('#myinput').val(undefined) è necessario impostare il valore di #myinput! ( Con la risposta attuale e le osservazioni di esso, non sarà possibile impostare il valore di #myinput)

Ecco una risposta aggiornata che utilizzare 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 si desidera passare tutti gli argomenti che si possono anche usare applicare

(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 aiuta!

+0

Ottima risposta! Funziona perfettamente. – Rajesh

0

ho qualcosa da aggiungere al CMS risposta, mia implementazione può essere diverso ed essere simile a questo:

(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); 

osservare il $ .fn.change.chiamare il numero (questo); verrà chiamato prima di uscire dalla funzione val ('') che attiverà anche il .change() su ogni assegnazione val ('').

Problemi correlati