Я угадываю ваш HTML, также я предполагаю, что у вас специально есть старая версия jQuery
$(document).ready(function() {
$(".selfmark").on("input", calculateSum).trigger("input"); });
function calculateSum() {
var sum = 0;
$(".selfmark").each(function() { // or map/reduce
var val = this.value, max = +$(this).attr("max"), bg = "#FEFFB0";
if (isNaN(val) || val.length == 0 || val>max) {
bg= "red";
}
else {
sum += parseFloat(val);
}
$(this).css("background-color", bg);
});
$("input#total_selfmark").val(sum.toFixed(2));
}
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
0-10: <input type="number" min="0", max="10" class="selfmark" value="5" /><br/>
0-20: <input type="number" min="0", max="20" class="selfmark" value="0" /><br/>
0-30: <input type="number" min="0", max="30" class="selfmark" value="0"/><br/>
<input type="text" readonly id="total_selfmark" />
Альтернатива - не короче, а с использованием fn.map и уменьшением
$(document).ready(function() {
$(".selfmark").on("input", calculateSum).trigger("input");
});
function calculateSum() {
var sum = $(".selfmark").map(function(idx, ele) {
var val = this.value, max = +$(this).attr("max"), bg = "#FEFFB0";
if (isNaN(val) || val.length == 0 || val > max) {
bg = "red";
val = 0;
}
else val = +val;
$(this).css("background-color", bg);
return val;
}).get().reduce(function(a, b) { return a + b; }, 0); // sum the array
$("input#total_selfmark").val(sum.toFixed(2));
}
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
0-10: <input type="number" min="0", max="10" class="selfmark" value="5" /><br/>
0-20: <input type="number" min="0", max="20" class="selfmark" value="0" /><br/>
0-30: <input type="number" min="0", max="30" class="selfmark" value="0"/><br/>
<input type="text" readonly id="total_selfmark" />