2017-08-09 162 views
0

我想使用JavaScript(無JQuery)添加複選框和下拉菜單中的值。添加複選框和下拉列表中的值選擇選項

我的第一個問題是如何最好地做到這一點......我的代碼是波紋管。

第二個問題是使用匿名函數來做到這一點有缺點嗎?

謝謝!

https://jsfiddle.net/Buleria28/4ysvgkz8/

HTML

<label class="checkbox" for="Checkbox1"> 
     <input value="50" type="checkbox" class="sum" > box 1 
</label> 
<label class="checkbox"> 
     <input value="50" type="checkbox" class="sum" > box 2 
    </label> 
    <label class="checkbox"> 
     <input value="50" type="checkbox" class="sum" > box 3 
    </label> 

    <br/><br/> 

    <select id="select" name ="select"> 
     <option class="sum"></option> 
     <option value="1" class="sum">option 1</option> 
     <option value="2" class="sum">option 2</option> 
     <option value="5" class="sum">option 3</option> 
    </select> 
    <br/><br/> 

    Total: $<span id="payment-total">0</span> 

的JavaScript

/*To get checkbox values*/ 

var inputs = document.getElementsByClassName('sum'), 
total = document.getElementById('payment-total'); 

for (var i=0; i < inputs.length; i++) { 
    inputs[i].onchange = function() { 
     var checkAdd = this.value * (this.checked ? 1 : -1); 
     total.innerHTML = parseFloat(total.innerHTML) + checkAdd; 
    } 
} 

/*To get select values*/ 
var dropdown= document.getElementById("select"); 

for(j=0; j<dropdown.options.length;j++){ 

    dropdown[j].onchange = function() { 
     if (dropdown[i].options.checked){ 
     var selectAdd = dropdown.options[dropdown.selectedIndex].value; 
     total.innerHTML = parseFloat(total.innerHTML) + selectAdd; 
     } 
    } 
} 

回答

0

有些事情,我想指出:

  • 使用addEventListener到Bing的事件處理程序

  • 您可以使用匿名函數,但是當你聲明它,並給它一個有意義的名字它更清晰

  • 不要在HTML元素中保留總和。將其保存在變量中,然後將其插入到HTML中。

我會做這樣的:

var checkboxes = document.querySelectorAll('.sum') 
 
var select = document.querySelector('#select') 
 
var total = document.querySelector('#payment-total') 
 
var checkboxesTotal = 0 
 
var selectTotal = 0 
 

 
checkboxes.forEach(function(input) { 
 
    input.addEventListener('change', onCheckboxSelect) 
 
}) 
 

 
select.addEventListener('change', onSelectChange) 
 

 
function onCheckboxSelect(e) { 
 
    var sign = e.target.checked ? 1 : -1 
 
    checkboxesTotal += sign * parseInt(e.target.value, 10) 
 
    renderTotal() 
 
} 
 

 
function onSelectChange(e) { 
 
    var value = parseInt(e.target.value, 10) 
 
    if (!isNaN(value)) { 
 
    selectTotal = value 
 
    renderTotal() 
 
    } 
 
} 
 

 
function renderTotal() { 
 
    total.innerHTML = checkboxesTotal + selectTotal 
 
}
<label class="checkbox" for="Checkbox1"> 
 
    <input value="50" type="checkbox" class="sum"> box 1 
 
    </label> 
 
<label class="checkbox"> 
 
    <input value="50" type="checkbox" class="sum"> box 2 
 
    </label> 
 
<label class="checkbox"> 
 
    <input value="50" type="checkbox" class="sum"> box 3 
 
    </label> 
 

 

 
<br/> 
 
<br/> 
 

 
<select id="select" name="select"> 
 
    <option class="sum"></option> 
 
    <option value="1" class="sum">option 1</option> 
 
    <option value="2" class="sum">option 2</option> 
 
    <option value="5" class="sum">option 3</option> 
 
    </select> 
 

 
<br/> 
 
<br/> Total: $<span id="payment-total">0</span>

0

這裏是JS的修正關於select元,我加了行內註釋,請他們澄清:

/*To get select values*/ 
var dropdown = document.getElementById("select"); 
dropdown.onchange = function() { 
    var value = parseInt(this.value); // gets the selected value from "select" and tries to convert it to int 
    if(!isNaN(value)) { // if conversion is OK, i.e. it was a number 
    total.innerHTML = parseFloat(total.innerHTML) + value; // this line is copied from your previous code 
    } 
} 
相關問題