2010-08-03 5 views
6

Ich bin noch ziemlich neu bei jQuery und versuche, Möglichkeiten zu finden, um meinen Code zu optimieren. Ich arbeite gerade an einer Anwendung, in der ich jedes Mal, wenn jemand ein Feld verlässt (.blur), einige Berechnungsmethoden anrufe. Ich möchte diese Methoden nur aufrufen, wenn bestimmte Kriterien erfüllt sind (zB Wert! = 0). Ich habe 9 Felder, in denen ich gerade kalkuliere und überprüfe.Wie kondensiere ich mehrere jQuery-Funktionen in einem?

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

Ich weiß, es ist möglich, diese Funktionen nach unten in eine allgemeinere ein (mit einer CSS-Klasse als Selektor anstelle einer ID) zu kondensieren, aber ich kann es einfach nicht scheinen, um herauszufinden, wie ich bin immer noch Neu bei jQuery/Javascript im Allgemeinen. Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

+2

Sie können den 'currentValue' als Objekt instanziieren ('var currentValue = {} ') und einfach' var currentValue; ' –

+1

Danke für die Klarstellung dort. Ich werde die zusätzliche Instanziierung sicher entfernen. – Delebrin

Antwort

4

Zuerst müssen Sie nicht den Wert zwischen Fokus und Unschärfe cachen. Sie können change() verwenden.

Wenn Sie eine Klasse auf alle Ihre Textfelder asign waren Sie wollen Kontrolle ... zB:

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

dann können Sie eine Klasse jQuery-Selektor:

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

Oder allgemeiner, Sie könnten auf jedes Textfeld im Dokument mit folgenden Werten anwenden:

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

+1 für die Beantwortung der zugrunde liegenden Frage, die das OP wahrscheinlich * benötigt * zu stellen. – DMA57361

+0

Danke.Ich kann nicht glauben, dass es hier 5 andere Antworten gibt und niemand hat bemerkt, dass das ganze "Fokus" und "Unschärfe" Ding nicht benötigt wird. Geht einfach um zu zeigen, dass Sie Rat aus dem Internet nicht vertrauen können :) – fearofawhackplanet

+0

In der Tat. Unglücklicherweise ist es ein Nebeneffekt der [schnellsten Waffe im Westproblem] (http://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem), und in diesem Fall passiere ich zufällig schuldig sein. – DMA57361

5

Sie können Sie id-Selektoren wie folgt kombiniert werden:

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

Oder Sie können eine CSS-Selektor wie diese verwenden (nur die Klasse auf den entsprechenden HTML-Elemente, wie Sie festlegen jede andere Klasse):

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

Und innerhalb die Unschärfe-Funktion können Sie sich auf $(this) beziehen, anstatt die Auswahl aufzurufen.

Endergebnis.

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

Danke für die Antwort. Ich wusste, dass ich Selektoren zu einer Anweisung kombinieren konnte, aber die Referenzierung mit $ (this) .val() ist, wo ich etwas verwirrt war (da ich technisch das Feld verlassen hatte, dachte ich, dass es nicht richtig funktionieren würde). – Delebrin

0

Geben Sie Ihre Elemente eine Klasse wie textValues und dann können Sie dies tun:

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

Sie es so für beide Eingänge Refactoring könnte:

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

Sie ähnliche Dinge konsolidieren wie folgt:

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

Ich weiß nicht, ob Sie das suchen?

Verwandte Themen