見它在這裏的行動:https://jsfiddle.net/7dhyue0p/1/
我已在整個代碼中添加了註釋,以便您可以看到發生的每一步都發生了什麼。如果有什麼你感到困惑或不確定,請不要猶豫,我很樂意提供幫助。
注:我強烈建議學習至少有任何圖書館合作(如jQuery)之前的JavaScript的基礎知識
function calculate(event) {
// Get the container size
var containerSize = parseFloat(document.getElementById("containersize").value);
// Get the dilution
var dilution = parseFloat(document.getElementById("dilution").value);
// Calculate the concentrate result
var concentrateResult = containerSize/((dilution) + (1));
// Calculate the water result
var waterResult = concentrateResult * dilution;
// Get an array of all of the radio elements in "inlineRadioOptions"
var radios = document.getElementsByName("inlineRadioOptions");
// Declare the variable "unit" to hold the name of the unit
var unit;
// Loop through the radio buttons
for (var i = 0; i < radios.length; i++) {
// If this radio button is checked
if (radios[i].checked) {
// Assign the value of the radio button to the variable "unit"
unit = radios[i].value;
}
}
// Find the value of the element that was clicked - if the value is "oz"...
if (event.target.value === "oz") {
// Update your elements
document.getElementById("containersize").value = (containerSize/(29.5735)).toFixed(1) + unit;
document.getElementById("concentrateresults").innerHTML = (concentrateResult/(29.5735)).toFixed(1) + unit;
document.getElementById("waterresults").innerHTML = (waterResult/(29.5735)).toFixed(1) + unit;
} else if (event.target.value === "ml") { // Repeat for "ml"
document.getElementById("containersize").value = (containerSize * (29.5735)).toFixed(1) + unit;
document.getElementById("concentrateresults").innerHTML = (concentrateResult * (29.5735)).toFixed(1) + unit;
document.getElementById("waterresults").innerHTML = (waterResult * (29.5735)).toFixed(1) + unit;
} else { // Otherwise, if this function wasn't triggered by changing the radio button...
document.getElementById("containersize").value = containerSize.toFixed(1) + unit;
document.getElementById("concentrateresults").innerHTML = concentrateResult.toFixed(1) + unit;
document.getElementById("waterresults").innerHTML = waterResult.toFixed(1) + unit;
}
};
// Event Listener to make everything automatic
// Get an array of every input
var inputs = document.getElementsByTagName("input");
// Loop through the inputs
for (var i = 0; i < inputs.length; i++) {
// Add an event handler for each input
inputs[i].addEventListener("change", function (event) {
// Capture the event and pass it into the calculate() function
calculate(event);
});
}
我改變了很多,你有在那裏的代碼。
我把所有東西都組合到了calculate()
函數中,使其具有可重複性。
首先 - 在JavaScript中編碼時 - 命名變量,以便了解它們是什麼。使用任意字母作爲變量不是一個好主意。你應該能夠閱讀代碼並理解發生了什麼。
其次 - 我在頁面上的所有輸入上添加了一個事件監聽器,並捕獲該事件以傳入calculate()
函數。
var inputs = document.getElementsByTagName("input");
for (var i = 0; i < inputs.length; i++) {
inputs[i].addEventListener("change", function (event) {
calculate(event);
});
}
其原因傳入事件偵聽器是這樣我們就可以元件被單擊的(對於盎司和毫升之間變化)的一個函數中確定
if (event.target.value === "oz") {
document.getElementById("containersize").value = (containerSize/(29.5735)).toFixed(1) + unit;
document.getElementById("concentrateresults").innerHTML = (concentrateResult/(29.5735)).toFixed(1) + unit;
document.getElementById("waterresults").innerHTML = (waterResult/(29.5735)).toFixed(1) + unit;
} else if (event.target.value === "ml") {
document.getElementById("containersize").value = (containerSize * (29.5735)).toFixed(1) + unit;
document.getElementById("concentrateresults").innerHTML = (concentrateResult * (29.5735)).toFixed(1) + unit;
document.getElementById("waterresults").innerHTML = (waterResult * (29.5735)).toFixed(1) + unit;
} else {
document.getElementById("containersize").value = containerSize.toFixed(1) + unit;
document.getElementById("concentrateresults").innerHTML = concentrateResult.toFixed(1) + unit;
document.getElementById("waterresults").innerHTML = waterResult.toFixed(1) + unit;
}
此功能也消除了您的NaN錯誤並且還根據要求添加「oz」或「ml」。
每評論EDITED
您可以添加多個事件偵聽器相同的元素,即使它調用這樣相同的功能:
var inputs = document.getElementsByTagName("input");
for (var i = 0; i < inputs.length; i++) {
inputs[i].addEventListener("keyup", function (event) {
calculate(event);
});
inputs[i].addEventListener("change", function (event) {
calculate(event);
});
}
在這裏,我添加了「 keyup「事件,因此它將在文本框中更改數字時重新計算。我保留了「更改」事件處理程序,以便在單選按鈕上按預期工作。
非常感謝你,看着你想出的東西,真的讓我看到了我試圖做出的多麼複雜。我的變量命名很糟糕,我必須改進。評論實際上使這非常簡單。 我的下一個問題是,如果改變事件監聽器有一個好的方法,以避免必須擊中輸入或點擊空格讓它被觸發?我意識到,將其設置爲關鍵幀會削弱收音機盒。 這是一個打破事件監聽者的情況嗎?一個用於鍵入文本輸入和一個用於無線電? – Shane 2015-04-01 21:53:36
完全沒問題:-)。就事件而言,您可以將相同的功能分配給鍵入事件和更改事件以涵蓋所有輸入。稍後我會將其添加到我的示例中,以向您展示它是如何完成的。另外,如果它適合您,請不要忘記註冊並接受我的答案。謝謝! – 2015-04-02 01:19:36
@Shane - 我編輯了我的答案以包含附加的事件處理程序。讓我知道是否還有其他需要幫助的東西:-)。如果它適合你,請不要忘記投票並接受這個答案。謝謝! – 2015-04-02 01:55:16