2010-08-03 10 views
6

Sono abbastanza nuovo per jQuery ancora e sto cercando di raccogliere modi per aiutare a ottimizzare il mio codice. Attualmente sto lavorando a un'applicazione in cui sto chiamando alcuni metodi di calcolo ogni volta che qualcuno lascia un campo (.blur). Voglio solo chiamare questi metodi quando vengono soddisfatti determinati criteri (come valore! = 0). Ho 9 campi dove sto calcolando e controllando attualmente.Come si condensano più funzioni jQuery in una?

$(document).ready(function() { 
var currentValue = {}; 

$("#txtValue1").focus(function() { 
    currentValue = $(this).val(); 
} 
).blur(function() { 
    $("#txtValue1").valid(); 
    if (currentValue != $("#txtValue1").val() && $("#txtValue1").val() != "") { 
     CallCalculations(); 
    } 
}); 

$("#txtValue2").focus(function() { 
    currentValue = $(this).val(); 
} 
).blur(function() { 
    $("#txtValue2").valid(); 
    if (currentValue != $("#txtValue2").val() && $("#txtValue2").val() != "") { 
     CallCalculations(); 
    } 
}); 
}); 

function CallCalculations() { 
    // Do Stuff 
}; 

so che è possibile condensare queste funzioni verso il basso in un più generico (utilizzando una classe CSS come selettore invece di un ID), ma io proprio non riesco a capirlo, come io sono ancora nuovo in jQuery/Javascript in generale. Qualsiasi aiuto sarebbe molto apprezzato. Grazie!

+2

È possibile saltare istanziare 'currentValue' come un oggetto (' var CurrentValue = {} ') e solo fare' var CurrentValue; ' –

+1

Grazie per il chiarimento lì. Rimuoverò certamente l'istanziazione in più. – Delebrin

risposta

4

In primo luogo, non è necessario fare il caching valore messa a fuoco e sfocatura. È possibile utilizzare change().

Se si dovesse assegnare dei una classe a tutti i tuoi caselle di testo che si desidera controllare ... per esempio:

<input type="text" class="calculateOnChange" /> 

quindi è possibile utilizzare una classe selettore jQuery:

$('.calculateOnChange').change(function() { 
    if($(this).val() != '') { 
     CallCalculations(this); 
    } 
}); 

o più in generale, si potrebbe applicare ad ogni casella di testo nel documento con:

$(':input[type=text]').change(/* ...etc */)); 
+1

+1 per rispondere alla domanda di fondo che l'OP probabilmente * aveva * bisogno di chiedere. – DMA57361

+0

Grazie.Non posso credere che ci siano altre 5 risposte qui e nessuno ha notato che l'intera cosa 'focus' e' blur' non è richiesta. Basta mostrare che non ti puoi fidare dei consigli da internet :) – fearofawhackplanet

+0

Infatti. Sfortunatamente è un effetto collaterale della [pistola più veloce nel problema ovest] (http://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem), e in questo caso mi capita di sii colpevole pure. – DMA57361

5

È possibile combinare voi selettori id come questo:

$("#txtValue1, #txtValue2").focus(//etc... 

Oppure si può utilizzare un selettore CSS come questo (è sufficiente impostare la classe sugli elementi rilevanti HTML come si farebbe con qualsiasi altra classe):

$(".txtValue").focus(//etc... 

E all'interno di la funzione sfocatura è possibile fare riferimento a $(this) anziché richiamare la selezione.

risultato finale.

$(".txtValue").focus(function() {  
    currentValue = $(this).val();  
}  
).blur(function() {  
    $(this).valid();  
    if (currentValue != $(this).val() && $(this).val() != "") {  
     CallCalculations();  
    }  
}); 
+1

Grazie per la risposta. Sapevo di poter combinare i selettori in un'unica istruzione, ma il riferimento usando $ (this) .val() è dove mi sono leggermente confuso (dato che tecnicamente ero uscito dal campo continuavo a pensare che non avrebbe funzionato correttamente). – Delebrin

0

Lascia la tua elementi una classe come textValues e quindi si può fare questo:

$(document).ready(function() { 
var currentValue = {}; 

$(".textValues").focus(function() { 
    currentValue = $(this).val(); 
}).blur(function() { 
    var that = $(this); 
    that.valid(); 
    if (currentValue != that.val() && that.val() != "") { 
     CallCalculations(); 
    } 
}); 
}); 

function CallCalculations() { 
    // Do Stuff 
}; 
0

Si potrebbe refactoring come questo per entrambi gli ingressi:

$("#txtValue1, #txtValue2").focus(function() { 
    currentValue = $(this).val(); 
} 
).blur(function() { 
    $(this).valid(); 
    if (currentValue != $(this).val() && $(this).val() != "") { 
     CallCalculations(); 
    } 
}); 
0

è possibile consolidare cose simili in questo modo:

$(document).ready(function() { 
    var currentValue = {}; 

    $("#txtValue1, #txtValue2, #txtValue3, #txtValue4").focus(function() { 
    currentValue = $(this).val(); 
    }).blur(function() { 
    $(this).valid(); 
    if (currentValue != $(this).val() && $(this).val() != "") { 
     // DO STUFF?? 
    } 
    }); 
}); 

Non so se questo è quello che stai cercando?