2009-08-03 4 views
0

Ok, wenn man bedenkt, dass die regulären Ausdrücke nicht richtig funktionieren und es keine Fehler gibt, werde ich versuchen, die Geldmaske zu verwenden.Using maskMoney Eingabe-Plugin - noch etwas Hilfe brauchen

Das Ziel besteht immer noch darin, nur numerische Zeichen und eine Dezimalzahl zuzulassen. Mit maskeMoney erledigt das die Arbeit für Sie.

Auch muss ich in der Lage sein, jede Zelle erfolgreich zu berechnen.

Im Moment funktionieren die Masken gut, aber ich kann nicht mehr rechnen. Dies ist, wo ich beunruhigt bin.

JQuery und JavaScript-Code:


<script type="text/javascript" language="javascript"> 
    $(document).ready(function(){ 
    $('.date').mask("99/99/9999"); 
    $('.account').mask("99-9-999999-9999"); 
    /*calcuating the vertical and horizontal inputs*/ 

    $('.R26').attr("disabled", "disabled"); 

$('.calc').maskMoney({symbol: ""}); 
$('.R25').unmaskMoney(); 
$('.R18').unmaskMoney(); 

$('input.description').focus(function(){ 
    if($(this).val()=="Enter text here"){ 
    $(this).val(" "); 
    } 

    else{ 
    $(this).val($(this).val()); 
    } 
}); 
$('input.description').blur(function(){ 
    if($(this).val()==" "){ 
    $(this).val("Enter text here"); 
    }  
}); 

$('.calc').keyup(function(){ 
var classArray = $(this).attr('class').split(' '); 
//Personal gas expense 
$('.gasamount').sum("change", "#totals4"); 
var num = $(this).attr("id").replace(/[A-Za-z$,-]/g, ""); 
$('#gasmoney'+num).val(<cfoutput>#mileage#</cfoutput> * $(this).val()); 
$('.gasmoney').sum("change", "#totals5"); 
////////////////////// 

//Sum of each cell 
$.each(classArray, function(){ 
    $('.'+this).sum("change", ".ttl"+this); 
}); 
//Finding the grandtotal 
var grandTotal = $('.row26').parent().children('td:last').children('input'); 
var sum = $('.row25').parent().children('td').children('.calc').sum(); 
grandTotal.val(Number(sum).toFixed(2)); 
}); 

Coldfusion und HTML-Code:

#labels [r] #

<cfloop from="1" to="7" index="i"> 

<td id="Day#i#" class="row#r# col#i#"> 
    <cfif r EQ 1>#Left(DayOfWeekAsString(i),3)#<cfelse><cfif r EQ 2> 
    <input type="text" class="date-mask" /><cfelse> 
    <input type="text" 
    <cfif labels[r] EQ "Personal Car: Mileage ##"> id="gasamount#i#" <cfelseif labels[r] EQ "Personal Car: Mileage $">id="gasmoney#i#" </cfif><cfif labels[r] EQ "Daily Totals">id="dailytotals#i#"</cfif> 
    class="<cfif labels[r] EQ "Personal Car: Mileage ##">gasamount<cfelse><cfif labels[r] NEQ "Daily Totals">C#i#</cfif></cfif> 
    <cfif labels[r] EQ "Personal Car: Mileage $">gasmoney<cfelse>calc R#r#</cfif> 
    <cfif labels[r] EQ "Daily Totals">ttlC#i#</cfif>" 
    <cfif labels[r] EQ "Daily Totals" OR labels[r] EQ "Personal Car: Mileage $">readonly="readonly"</cfif> 
    /></cfif> 
    </cfif> 
</td> 


</cfloop> 

<td class="totals"><cfif r EQ 1>Total<cfelse><input type="text" id="totals" class="ttlR#r#" readonly="readonly" /></cfif></td> 

Ich hatte ähnliche Fragen mit der gleichen Anwendung, aber das ist in der Tat kein Duplikat (falls Sie denken, es ist.).

Das '.' + Dies ist ein Objekt, das vom Array erstellt wurde. Ich habe mit cfloops eine große Tabelle erstellt und mehrere Klassen hinzugefügt. Musste die mehreren Klassen in ein Array aufteilen und konnte dann jede Klasse als ihre eigene auswählen.

+0

Ich habe meine Antwort aktualisiert, um den anderen Fehler zu behandeln, den Sie bei meinem ersten Versuch hatten. HTH, lassen Sie mich einen Kommentar auf die Antwort, wenn es nicht funktioniert/etwas ist nicht klar. – Sean

Antwort

0

Ok. Also habe ich es selbst herausgefunden.

Mit dem maskMoney() kann ich kontrollieren, welche Zeichen eingegeben werden und trotzdem die Tabelle korrekt berechnen können.

Alles, was ich um die Berechnungen zu beheben tun musste, war die .gasamount demaskieren:

   $('.gasamount').unmaskMoney(); 

Dies ist, was die Berechnung Probleme behoben. ^^ Die Maske verursachte Probleme für die Summe der 2 Zeilen und diese 2 Zeilen verursachten den Bruch der Berechnungen.


   $('.calc').maskMoney({symbol: ""}); 
       $('.R25').unmaskMoney(); 
       $('.R18').unmaskMoney(); 

      $('.calc').keyup(function(){ 
       var classArray = $(this).attr('class').split(' '); 
       //Personal gas expense 
       $('.gasamount').sum("change", "#totals4"); 
       var num = $(this).attr("id").replace(/[A-Za-z$,-]/g, ""); 
       $('#gasmoney'+num).val(<cfoutput>#mileage#</cfoutput> * $(this).val()); 
       $('.gasmoney').sum("change", "#totals5"); 
       ////////////////////// 

       //Sum of each cell 
       $.each(classArray, function(){ 
        $('.'+this).sum("change", ".ttl"+this); 
       }); 
       //Finding the grandtotal 
       var grandTotal = $('.row26').parent().children('td:last').children('input'); 
       var sum = $('.row25').parent().children('td').children('.calc').sum(); 
       grandTotal.val(Number(sum).toFixed(2)); 
      }); 

Jeder, der versucht zu helfen, ich danke Ihnen für die Zeit nehmen!

Wenn jemand dieses Beispiel oder den Code für zukünftige Anwendungen verwenden möchte, zögern Sie nicht zu kommentieren und lassen Sie mich wissen, und ich kann eine andere Seite mit einem Beispiel und Anweisungen und der Quelle einrichten.

+0

Hallo Michel! Ich empfehle Ihnen, auf die letzte Version des Plugins zu aktualisieren, die einen besseren Code hat und außerdem mehr mit dem maskierten Eingabe-Plugin kompatibel ist, das Sie verwenden https://github.com/plentz/jquery-maskmoney –

-2

Dollar ($) wird verwendet, um das Ende einer Regex-Suche zu markieren. /[A-Za-z$-,]/ funktioniert möglicherweise nicht gut. Entkomme dem Dollar mit einem Backslash (\$).

+0

Danke für den kleinen Tipp, aber ich benutze den gleichen auf anderen Anwendungen und es funktioniert wie ein Charme! Ich habe das hinzugefügt und funktioniert trotzdem. Wahrscheinlich der bessere Ansatz! –

+1

Das ist einfach falsch. Das '$' hat in einer Zeichenklasse keine besondere Bedeutung, daher wird es nichts verändern, wenn man es entzieht. – Tomalak

0

EDIT: Meine ursprüngliche Antwort war teilweise richtig, in dem es den Wert änderte, aber es hat nicht einen ernsteren Fehler behoben, den ich jetzt erklären werde.

Der Grund, dass meine ursprüngliche Korrektur bewirkt, dass Zelle den gleichen Wert hat, liegt daran, dass die Methode jQuery $ jedes Element zurückgibt, das mit dem angegebenen Selektor übereinstimmt. Wenn Sie val() aufrufen, erhalten Sie nur den Wert des ersten übereinstimmenden Elements, aber wenn Sie den Wert durch Aufrufen von val (value) festlegen, wird der Wert für jedes übereinstimmende Element festgelegt.

Die Lösung ist die Ersetzung über die einzelnen(), die dann nur ein einzelnes Element (die this) desinfizieren wird. Wenn Sie auch die Summenzellen bereinigen möchten, dann tun Sie , dass in jedem() und verwenden ".ttl" + this als Selektor anstelle von this.

$('.calc').keyup(function(){ 
    var classArray = $(this).attr('class').split(' '); 

    //Sanitize out here, so we only affect one element. 
    var singleCellVal = $(this).val() 
    singleCellVal.replace(/[A-Za-z$-,]/g, ""); 
    $(this).val(singleCellVal); 

    $.each(classArray, function(){ 
     var totalsum = $('.'+this).sum(); 
     $('.ttl'+this).val(Number(totalsum).toFixed(2)); 
    }); 

    //Finding the grandtotal 
    var grandTotal = $('.row26').parent(). 
     children('td:last').children('input'); 
    var sum = $('.row25').parent().children('td').children('.calc').sum(); 
    grandTotal.val(Number(sum).toFixed(2)); 
}); 

Was Sie wollen, ist

var value = $('.'+this).val(); 
value.replace(/[A-Za-z$-,]/g, ""); 
$('.' + this).val(value); 

Die $ in der Zeichenklasse ist in Ordnung, die meisten Metazeichen in regex sind keine besonderen innerhalb von Zeichenklassen. "$-," wird jedoch alle Zeichen übereinstimmen, die "zwischen" $ und , sind.Ich nehme an, das ist, was Sie wollen, aber wenn Sie nur $ und , und - übereinstimmen möchten, dann sollten Sie diesen Teil zu "$,-" (d. H. /[A-Za-z$,-]/g) ändern. Eine - am Ende einer Zeichenklasse entspricht der -, irgendwo anders wird als ein Bereich gesehen, es sei denn, Sie entkommen es (\-).

+0

Hallo Sean. Ich habe tatsächlich genau die gleiche Methode wie du benutzt und das ist es, was ich zurückgegeben habe. http://mercury.hamilton.edu/devmpstone/forms-pdf/employeen-expense-report.cfm Es ist ziemlich interessant, noch nie zuvor gesehen. Hoffe, du hast eine Idee, ich nicht im Moment! –

+0

Ich habe Ihre bearbeitete Version ausprobiert, und dieses Mal gebe ich nichts zurück. Danke, dass du versucht hast zu helfen. Wenn ich eine Lösung finde, werde ich sie sicher hier veröffentlichen. –

3

Es ist sehr wahrscheinlich, dass Sie

.replace(/[A-Za-z$,-]/g, "") 

statt

.replace(/[A-Za-z$-,]/g, "") 

Dieser Ausdruck soll matches:

  • alle Zeichen von "A" auf "Z"
  • alle Zeichen von "a „auf“ z
  • alle Zeichen von“ $ „auf“ , "(es ein solcher Bereich ist, aber ich bin nicht sicher, ob das Ihre eigentliche Absicht ist)

Der ehemalige Ausdruck (Anmerkung die verschobene Bindestrich) übereinstimmt:

  • alle Zeichen von "A" auf "Z"
  • alle Zeichen von "a" auf "z"
  • das Zeichen "$"
  • das Zeichen ","
  • das Zeichen "-"

Der Bindestrich eine besondere Bedeutung in Zeichenklassen hat, definiert sie eine Reihe. Wenn Sie einen Literalstrich abgleichen möchten, verschieben Sie ihn an das Ende (oder den Anfang) der Zeichenklasse.

EDIT: Abgesehen davon scheinen Sie Set der Wert zu sein. Einstellen durch val() Werke von dem neuen Wert in die Funktion übergeben:

$dotThis = $('.' + this); 
$dotThis.val($dotThis.val().replace(/[A-Za-z$-,]/g, "")); 

Diese Aussage:

$('.'+this).val().replace(/[A-Za-z$-,]/g, ""); 

erstellt ein ersetzt String und sofort wirft sie weg.

+0

Hallo Tom, ich habe versucht, mit Ihrem Fix, und immer noch kein Ergebnis. Ich denke, es könnte eine Frage sein, wo ich den Ersatz in die Veranstaltung stelle. Vielleicht außerhalb der Veranstaltung. Hmm. –

+0

Siehe meine aktualisierte Antwort. – Tomalak

+0

Hier ist ich verwirrt. Ich bekomme immer diesen Punkt und dann passiert das. Schau mal. Ich habe den Ereignis-Listener in keyup geändert, so dass es mehr offensichtlich ist. –

1

Könnte ein bisschen zu einfach sein, aber warum nicht die Negation verwenden? Perl Syntax: Nicht sicher über Javascript.

Warum nicht: m/([^ 0-9] +) // g

Spiele zwischen null und neun

+0

Das habe ich schon ausprobiert und ich bekomme das gleiche Ergebnis. Verwenden von JS, nicht Perl. –