2016-11-09 4 views
1

Ich versuche, einen JavaScript-Preisrechner, der Werte aus einem Formular, das keine Textfelder, sondern nur Radio-Buttons und Kontrollkästchen enthält. Hier ist mein JavaScript:Eine bestimmte Bedingung wird in JavaScript übersprungen

service = 0; 

var setPoint = function (elem) { 
    var $e = $(elem); 
    var points = $e.attr("data-points"); 
    switch ($e.attr("name")) { 
     case 'group1': 
      group1 = parseFloat(points); 
     case 'group2': 
      group2 = parseFloat(points); 
     case 'group4': 
      group4 = parseFloat(points); 
     case 'group5': 
      group5 = parseFloat(points); 
     case 'services': 
      if ($(elem).attr('checked1') == 'true') { 
       $(elem).attr("checked1", "false"); 
       service = parseFloat(service) - parseFloat(points); 
      } else { 
       $(elem).attr("checked1", "true"); 
       service = parseFloat(service) + parseFloat(points); 
      } 
    } 
} 

var calculatePoints = function() {  
    var total;  
    var values = [group1, group2, group4, group5, service]; 

    values.map(function (value) { 
     if (value == "" || value == undefined || value == NaN) { 
      value = 0; 
      return value; 
     } 
    }); 

    if (service == 0) { 
     window.alert("At least one service needs to be selected!"); 
     console.log("Service = 0"); 
    } else if (service <= 20) { 
     total = group1 + group2 + group4 + group5 + service; 
    } else if (service > 20 && service <= 40) { 
     total = group1 + group2 + group4 + group5 + (service * 0.8); 
    } else total = group1 + group2 + group4 + group5 + (service * 0.7); 

    console.log(total * 1000); 

    return false; 
} 

Aber irgendwie die bedingte Anweisung if (service==0) ist gar nicht funktioniert!

Ich rufe die SetPoints-Funktion mit Onclick-Methode in meinem HTML bei jedem Klick auf ein Formularfeld und CalculatePoints-Funktion mit onsubmit. Ich habe sichergestellt, dass die Seite bei der Verwendung von onsubmit nicht aktualisiert wird.

Ich weiß nicht, was ist falsch mit meinem Code und warum es passiert, so eine Erklärung zusammen mit Ihren Lösungen wäre mir sehr hilfreich. Sie finden hier einen Codepen mit komplettem Code: http://codepen.io/anshap1719/pen/pNjepV

+0

Sie haben nicht wirklich genug Informationen gegeben, damit jemand Ihnen helfen kann. Wenn Sie jedoch 'setPoint()' zuerst aufrufen und das 'services' Element übergeben, dann wird' service' nicht '0' sein. Sie müssen dies selbst debuggen und den Wert von 'service' in jeder Phase des Logikflusses prüfen. –

+0

@RoryMcCrossan Tut mir leid, ich habe gerade die Bearbeitung gemacht, um zu erklären, wie ich meine Funktionen anrufe. –

+0

@RoryMcCrossan Ich weiß, dass der Wert nicht 0 sein wird, aber ich kann nicht verstehen, warum ... –

Antwort

2

Versuchen Sie, jeden Fall mit einer Break-Anweisung in den Schalterkasten zu beenden.

switch ($e.attr("name")) { 
    case 'group1': 
     group1 = parseFloat(points); 
     break; 
    case 'group2': 
     group2 = parseFloat(points); 
     break; 
    case 'group4': 
     group4 = parseFloat(points); 
     break; 
    case 'group5': 
     group5 = parseFloat(points); 
     break; 
    case 'services': 
     if ($(elem).attr('checked1') == 'true') { 
      $(elem).attr("checked1", "false"); 
      service = parseFloat(service) - parseFloat(points); 
     } else { 
      $(elem).attr("checked1", "true"); 
      service = parseFloat(service) + parseFloat(points); 
     } 
     break; 
} 
+0

Arbeitete !! Erklärung bitte ... –

+0

Ohne eine Pause funktioniert Ihr Schalterfall nicht, es wird zum letzten Fall springen oder es wird überhaupt nicht funktionieren, ist auf diese Weise durch Design @AnshulSanghi – Sycraw

+0

Ok. Danke für die Hilfe. –

0

Sie müssen nur group1 ... group5 mit Nullen Ihre Variablen auch initialisieren, wie Sie mit service so tat, wenn eine der Auswahlknöpfe nicht chosed, nicht bekommen Sie Fehler zu trösten, zu sein, wie folgen:

service = group1 = group2 = group3 = group4 = group5 = 0; 
+0

Eigentlich möchte ich keine anderen Felder als Dienstleistungen validieren. Nur Services-Feld ist erforderlich, deshalb habe ich das nicht getan. Wenn ich jede Variable initialisiere, wird der Wert nur innerhalb der Funktion und außerhalb der setPoints-Funktion geändert, dort war der Wert immer noch 0. –

+0

Sie erhalten also einen Konsolenfehler, wie zum Beispiel 'Gruppe1 ist nicht definiert' und die fehlende' Pause ' 's nach jedem Fall als @Sycraw erwähnt. –

+0

Kann mir nicht helfen. Coz der Wert wird außerhalb nicht geändert, wenn ich sie initialisiere. Kennen Sie einen Workaround dafür? –

0

es auf Fehler

if ($(elem).attr('checked1') === 'true') { 
    // Code here, use triple === for conditional equality check 
} 
+0

Danke, aber das hat das Problem nicht gelöst! –

+0

Ich denke, es gab ein separates Problem, das die vorherige Antwort scheint gelöst zu haben. Bedingte Gleichheitsprüfungen in js sollten === sein. Einen schönen Tag noch! – Liam

+0

Nur die Änderung vorgenommen. Vielen Dank! –

0

prüfen Konsole sein sollte, wie ich t sagt, dass group1 nicht definiert ist. Sie haben die Variablen, die Sie in switch verwendet haben, nicht definiert.

var service = 0, group1=0.0, group2=0.0, group4=0.0, group5=0.0; 

Dies gibt Ihnen die erforderliche Ausgabe.

+0

Wenn ich jede Variable initialisiere, wird der Wert nur innerhalb der Funktion und außerhalb der setPoints-Funktion geändert, ihr Wert ist immer noch 0. Ich will das nicht.Kennen Sie eine Workaround dafür? –

Verwandte Themen