2016-11-09 7 views
1

テキストフィールドではなくラジオボタンとチェックボックスのみからなるフォームから値を取るJavaScript価格計算機を作ろうとしています。ここに私のJavaScriptのである:JavaScriptで特定の条件がスキップされています

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

しかし、どういうわけか、条件文if (service==0)はまったく機能していません!

フォームフィールドをクリックするたびにHTMLのonclickメソッドを使用してsetPoints関数を呼び出し、onsubmitを使用してcalculatePoints関数を呼び出します。 onsubmitを使用しているときにページが更新されないことを確認しました。

私のコードに何が間違っているのか、なぜそれが起こっているのか分かりませんので、あなたのソリューションと一緒に説明してくれれば助かります。ここで完全なコードを持つコードペインを見つけることができます。http://codepen.io/anshap1719/pen/pNjepV

+0

は、あなたが本当にあなたが呼び出すと仮定すると、しかし..あなたを助けるために、誰のための十分な情報を与えられていませんでした '設定値は、()'まず、 'services'要素を渡し、その後、' service'は '0'ではありません。あなた自身でこれをデバッグし、論理フローの各段階で 'service'の値を確認する必要があります –

+0

@RoryMcCrossan申し訳ありません私は自分の関数をどのように呼び出すのかを説明するために編集しました。 –

+0

@RoryMcCrossan私は値が0になることはないと知っていますが、私は理由を理解できません。 –

答えて

2

ブレイクステートメントで各ケースをスイッチケースに入れてみます。ラジオボタンのいずれかがchosedされていない場合

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

Worked !!説明してください... –

+0

休憩せずにスイッチケースが機能しない場合、最後のケースにジャンプするか、まったく動作しません。このように設計されています@AnshulSanghi – Sycraw

+0

Ok。助けてくれてありがとう。 –

0

はあなただけだけでなく、あなたがserviceと同じように、あなたの変数group1 ... group5ゼロで初期化する必要があるので、あなたがのように、エラーコンソール取得していません従い

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

実際、サービス以外のフィールドは検証したくありません。サービス分野だけが必要なので、私はそれをしませんでした。また、すべての変数を初期化すると、その値は関数内でのみ変更され、setPoints関数の外では値は0になります。 –

+0

このように 'group1 is not defined 'のようなコンソールエラーが発生し、' break @Sycrawが述べたように各ケースの後に 's。 –

+0

それを助けることはできません。私がそれらを初期化する場合、値が外側に変更されていません。あなたはそのための回避策を知っていますか? –

0

それは

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

ありがとうございますが、これで問題は解決しませんでした。 –

+0

私は別の問題があったと思います、前の答えは解決したようです。しかし、jsの条件付き等価チェックは===です。良い一日を! – Liam

+0

ちょうど変更を加えました。ありがとう! –

0

iと、エラーのコンソールをチェックする必要がありますグループ1は定義されていません。 switchで使用した変数は定義していません。

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

これにより、必要な出力が得られます。

+0

すべての変数を初期化すると、関数内で値が変更され、setPoints関数の外では値は0のままです。その必要はありません。あなたはそのための回避策を知っていますか? –

関連する問題