选择(点击)多个input后,获取相应span值并且自动相加显示在另一个span里面,然后把单位(MB)换算为GB?

选择(点击checkbox)多个input后,获取相应span值(文件大小值)并且自动相加每一个文件的大小,最后把总大小显示在另一个span里面,然后把单位MB换算为GB。
下面的代码段,我遇到了些技术问题:
1.相加的数字(大小)只能加整数,无法保留两位;
2.转换那里的(input的 id="c")value值无法实时获取相加的总数;
3.在加一段代码,从32G减去已选择文件的总大小,并显示剩余选择的大小,达到32GB后,不能再继续选择。

我写了这些:

<input style="width:0px;height:0px" type="checkbox" value="0" checked>
{loop $tags $i $m}
<p>
<input type="checkbox" name="type[]" value="{$m[title]}" id="type_{$k}"{if $k<0} checked{/if}/>
{$m[title]}
<span style="float:left;font-size:10px;">{$m[filesize]}</span>
</p>
{/loop}
选择的总大小:<span id="all"></span> MB

你已经选择了,
<input type="text" id="c" value="0" onkeyup="calculate_g(this.value)">MB文件,或者
<input type="text" id="f" value="0" onkeyup="calculate_k(this.value)">GB文件。

<script type="text/javascript">
var allinput=document.getElementsByTagName('input');
var all=document.getElementById("all");

function getNextElement(node){
if(node.nextSibling.nodeType == 1){ //判断下一个节点类型为1则是“元素”节点
return node.nextSibling;
}
if(node.nextSibling.nodeType == 3){ //判断下一个节点类型为3则是“文本”节点 ,回调自身函数
return getNextElement(node.nextSibling);
}
return null;
}
for(var i=0;i<allinput.length;i++)
{
if(allinput[i].checked)
{
console.log(allinput[i]);
all.innerHTML+=allinput[i].value;
}
allinput[i].onclick=function()
{
var _this=this;
if(_this.checked==true)
{
console.log(_this);
all.innerHTML =parseInt(all.innerHTML,10)+parseInt(getNextElement(_this).innerHTML,10);
}
else
{
console.log(_this);
all.innerHTML =parseInt(all.innerHTML,10)-parseInt(getNextElement(_this).innerHTML,10);
}
}
};
</script>

<script type="text/javascript">
var kilo=1024;
function calculate_g(val){
document.getElementById("f").value=Math.round(val/(kilo)*1000000)/1000000;
}
function calculate_k(val){
document.getElementById("c").value=Math.round(val*kilo*1000000)/1000000;
};
</script>

参考GPT和自己的思路:

  1. 要保留两位小数可以使用toFixed()方法,如:变量名.toFixed(2);
  2. 要实时获取总数可以在相应的函数中添加获取总数的语句,如:var total=document.getElementById("all").innerHTML;
  3. 加入如下代码块可以实现剩余选择大小的功能:
    var MAX_SIZE = 32 * 1024 * 1024; //32GB
    var selectedSize = 0;
    allinput[i].onclick=function() {
    var _this = this;
    if (_this.checked == true) {
     console.log(_this);
     var size = parseInt(getNextElement(_this).innerHTML, 10);
     selectedSize += size;
     all.innerHTML = parseInt(all.innerHTML, 10) + size;
     if (selectedSize > MAX_SIZE) {
       _this.checked=false; //取消选择
       selectedSize-=size;
       all.innerHTML = parseInt(all.innerHTML, 10) - size;
       alert("达到32GB上限!请取消一些已选择的文件。");
     }
    } else {
     console.log(_this);
     selectedSize -= parseInt(getNextElement(_this).innerHTML, 10);
     all.innerHTML = parseInt(all.innerHTML, 10) - parseInt(getNextElement(_this).innerHTML, 10);
    }
    };
    

修改后的完整代码如下:

<input style="width:0px;height:0px" type="checkbox" value="0" checked>
{loop $tags $i $m}
<p>
<input type="checkbox" name="type[]" value="{$m[title]}" id="type\_{$k}"{if $k<0} checked{/if}/>
{$m[title]}
<span style="float:left;font-size:10px;">{$m[filesize]}</span>
</p>
{/loop}
选择的总大小:<span id="all"></span> MB

你已经选择了,
<input type="text" id="c" value="0" onkeyup="calculate\_g(this.value)">MB文件,或者
<input type="text" id="f" value="0" onkeyup="calculate\_k(this.value)">GB文件。

<script type="text/javascript">
var allinput = document.getElementsByTagName('input');
var all = document.getElementById("all");

function getNextElement(node) {
  if (node.nextSibling.nodeType == 1) { //判断下一个节点类型为1则是“元素”节点
    return node.nextSibling;
  }
  if (node.nextSibling.nodeType == 3) { //判断下一个节点类型为3则是“文本”节点 ,回调自身函数
    return getNextElement(node.nextSibling);
  }
  return null;
}

var kilo = 1024;
function calculate_g(val) {
  var total = document.getElementById("all").innerHTML;
  document.getElementById("f").value = (val / kilo).toFixed(2);
  document.getElementById("c").value = Math.round(total / kilo / kilo * 100) / 100;
}

function calculate_k(val) {
  var total = document.getElementById("all").innerHTML;
  document.getElementById("f").value = val;
  document.getElementById("c").value = Math.round(val * kilo * kilo * 100) / 1000000;
}

var MAX_SIZE = 32 * 1024 * 1024; //32GB
var selectedSize = 0;
for (var i = 0; i < allinput.length; i++) {
  if (allinput[i].checked) {
    console.log(allinput[i]);
    all.innerHTML += allinput[i].value;
  }
  allinput[i].onclick = function () {
    var _this = this;
    if (_this.checked == true) {
      console.log(_this);
      var size = parseInt(getNextElement(_this).innerHTML, 10);
      selectedSize += size;
      all.innerHTML = parseInt(all.innerHTML, 10) + size;
      if (selectedSize > MAX_SIZE) {
        _this.checked=false; //取消选择
        selectedSize-=size;
        all.innerHTML = parseInt(all.innerHTML, 10) - size;
        alert("达到32GB上限!请取消一些已选择的文件。");
      }
    } else {
      console.log(_this);
      selectedSize -= parseInt(getNextElement(_this).innerHTML, 10);
      all.innerHTML = parseInt(all.innerHTML, 10) - parseInt(getNextElement(_this).innerHTML, 10);
    }
  };
}
</script>