2010-08-03 8 views
6

Todavía soy bastante nuevo en jQuery y estoy tratando de encontrar maneras de ayudar a optimizar mi código. Actualmente estoy trabajando en una aplicación en la que estoy llamando a algunos métodos de cálculo cada vez que alguien deja un campo (.blur). Solo quiero llamar a estos métodos cuando se cumplen ciertos criterios (como value! = 0). Tengo 9 campos donde estoy calculando y comprobando actualmente.¿Cómo puedo condensar varias funciones jQuery en 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 
}; 

sé que es posible condensar estas funciones hacia abajo en una más genérica (usando una clase CSS como un selector en lugar de un ID) pero simplemente parece que no puede deducirlo mientras todavía estoy nuevo en jQuery/Javascript en general. Cualquier ayuda sería muy apreciada. ¡Gracias!

+2

Puede omitir la instancia de 'currentValue' como un objeto (' var currentValue = {} ') y simplemente haga' var currentValue; ' –

+1

Gracias por la aclaración allí. Definitivamente eliminaré la instanciación adicional. – Delebrin

Respuesta

4

En primer lugar, no necesita hacer el almacenamiento en caché de valores en el enfoque y el desenfoque. Puede usar change().

Si se va para asignar una clase a todos sus cuadros de texto que desea comprobar ... ej:

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

entonces se puede utilizar una clase jQuery selector:

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

o, más generalmente, Puede aplicar a cada cuadro de texto en el documento con:

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

+1 para responder a la pregunta subyacente que el OP probablemente * necesitó * preguntar. – DMA57361

+0

Gracias.No puedo creer que haya otras 5 respuestas aquí y nadie ha notado que todo el enfoque 'focus' y' blur' no es obligatorio. Solo sirve para demostrar que no puedes confiar en los consejos de Internet :) – fearofawhackplanet

+0

De hecho. Desafortunadamente es un efecto secundario del [arma más rápida en el problema del oeste] (http://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem), y en este caso me sucede ser culpable también – DMA57361

5

Puede combinar le selectores de ID de esta manera:

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

O puede utilizar un selector CSS como esto (acaba de establecer la clase en los elementos pertinentes HTML como lo haría con cualquier otra clase):

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

Y dentro de la función de desenfoque puede consultar $(this) en lugar de recordar la selección.

Resultado final.

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

Gracias por la respuesta. Sabía que podía combinar selectores en una declaración, pero la referencia usando $ (this) .val() es donde me confundí un poco (ya que técnicamente estaba abandonando el campo, seguía pensando que no funcionaría correctamente). – Delebrin

0

Dé a sus elementos de una clase como textValues y entonces usted puede hacer esto:

$(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

Usted podría refactorizar como esto para ambas entradas:

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

puede consolidar cosas similares como este:

$(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?? 
    } 
    }); 
}); 

No sé si eso es lo que estás buscando?

Cuestiones relacionadas