2013-09-27 10 views
5

Sto scrivendo un plugin jquery personalizzato che sostanzialmente replica la funzionalità di un input. Potrei spiegare perché, ma sinceramente la spiegazione è abbastanza lunga e credo che sia irrilevante per la domanda.Estendi il metodo jQuery's .val() agli elementi non di input

Il problema si presenta quando provo ad estendere il metodo jQuery .val() al mio plugin jquery personalizzato. Ecco cosa ho provato:

$.fn.custom_text_input = function(options){ 
    return this.each(function(){ 
     var custom_text_input = new CustomTextInput(options, this) 

     $(this)[0].val = function(){ 
      alert('something useful') 
     } 
    }) 
} 

Ive ha provato alcune altre varianti di questo, tutto inutilmente. Se qualcuno ha qualche idea che funzionerà, apprezzerei molto la saggezza!

Grazie!

+0

Non dovrebbe la definizione della funzione andare nella definizione CustomTextInput? –

+0

Voglio essere in grado di chiamarlo da qualsiasi luogo utilizzando un selettore jquery. esempio: $ ('# div'). custom_text_input() e poi da qualche altra parte nel mio codice $ ('# div'). val() –

+1

BTW, '$ (questo) [0]' è uguale a 'questo' . Quando si crea un oggetto jQuery, esiste una matrice di indici zero di elementi DOM in quell'oggetto jQuery. Quindi quando accedi al primo indice (zero) ottieni il primo elemento. – Jasper

risposta

4

Per sovrascrivere il metodo $.val() è necessario eseguire operazioni come $.fn.val = function() {...}. Ecco una demo: http://jsfiddle.net/CRRP5. Raccomanderei di salvare il vecchio metodo .val() in una variabile in modo da poterlo utilizzare quando .val() viene chiamato su un normale modulo di input.

+1

Non sovrascriverà l'originale .val() per tutti gli elementi? Sto cercando di evitarlo, a meno che non ci sia un altro modo. Forse c'è un modo per chiamare il metodo .val() di jquery all'interno del mio metodo personalizzato .val() se l'elemento non fa parte del mio plugin? –

+2

@FredGarbutt Questo è quello che intendevo con l'ultima frase nella mia risposta. Salva la vecchia funzione '.val()' su una variabile e chiamala quando la funzione '.val()' è chiamata su un input di form. Dovrai controllare il tipo di elemento HTML, e se è un input di form, restituire la risposta dalla funzione originale '.val()', altrimenti restituire la risposta da quella personalizzata. E sì, questo sovrascrive lo standard jQuery '.val()'. – Jasper

+1

@FredGarbutt Un'alternativa potrebbe essere quella di restituire un oggetto jQuery dal metodo 'custom_text_input' con un metodo' .val() 'aggiornato. In questo modo si sovrascriverebbe solo il metodo '.val()' per quel singolo oggetto jQuery. Questo sarebbe qualcosa come "var $ this = $ (this); $ this.val = function() {...} '. Dovresti salvare l'oggetto jQuery restituito come variabile in modo che sia accessibile in futuro, poiché ricreando un oggetto jQuery selezionando il nodo DOM verrà utilizzato il metodo globale '.val()' che non hai aggiornato. Questo non è stato verificato, mi è appena venuto in mente. – Jasper

2

L'unico modo per farlo funzionare è estendere il risultato del metodo val() di jQuery.

$(function(){ 
    $.fn.oldVal = $.fn.val 
    $.fn.val = function(value){ 
    //I'm assuming here that you're setting/getting a data value 
    //on the object to keep track of it's "custom value" 
    if(value && $(this).data('custom-input-value')){ 
     return $(this).data('custom-input-value', value); 
    } 
    else if(value = $(this).data('custom-input-value')){ 
     return value; 
    }else{ 
     return value ? $(this).oldVal(value) : $(this).oldVal(); 
    } 
    } 


}) 

che potrebbero funzionare per voi: p

Ecco un jsfiddle con tale organizzazione: http://jsfiddle.net/Z4c6d/

+0

questo è esattamente ciò di cui avevo bisogno! è anche quello che Jasper mi stava già dicendo di fare prima però. Tecnicamente entrambi state dicendo la stessa cosa. grazie per le risposte chiare! –

+0

Ho aggiornato il codice per funzionare correttamente ... e ho incluso un jsfiddle funzionante. – nzifnab

+0

Ho trovato un problema con il codice nel jsfiddle se si tenta di impostare il valore di entrambi gli ingressi - i cortocircuiti del codice quando si imposta tramite oldVal. Ho fatto un aggiornamento che si comporta correttamente in questo caso: http://jsfiddle.net/Z4c6d/1/ –

Problemi correlati