【问题标题】:Javascript - calculating the remaining between two related fieldsJavascript - 计算两个相关字段之间的剩余部分
【发布时间】:2014-07-06 00:08:01
【问题描述】:

首先,我想计算一个表单中两个字段之间的剩余QTY(数量);换句话说,我将 actual QTY 输入文本字段作为只读字段,其值是从 mysql 表中获取的,并且 user QTY 输入文本字段取自用户输入。我想要的只是根据用户在用户数量中输入的内容减少实际数量

我的代码如下:

$query2 = "SELECT * from store_00";
$result2 = mysql_query($query2);
$n = array();
while($row2 = mysql_fetch_assoc($result2)){
echo "<td align=center>".$row2['item_no']."</td><td align=center>";
?>
<input type="text" id="fname" value="<?php echo $row2['qty'] ?>" readonly="readonly"/>
<?php
echo "</td>";

for($i=0;$i<$num;$i++){
echo "<td align=center>"; ?><input autofocus="autofocus" onchange="myFunction(this.value);" type="text" name="n[]" value=""/><?php echo "</td>";
}
echo "</tr>";
}

还有 Javascript 代码:

function myFunction(v)
{
var x=document.getElementById("fname");
x.value = x.value - v;
}

上面将第一次正确输出 actual QTY,但是当用户将值更改回 0 时,它将从新的 actual QTY 值减少这给出了一个错误的剩余......所以必须有一种方法可以在某处保存一个临时的 actual QTY 值。

无论如何我知道代码看起来很糟糕,我还是 JS 新手,不知道如何在两个字段之间创建一个简单的关系和剩余计算。

【问题讨论】:

  • $num 来自哪里?
  • @Burak 别担心!已经在$query2之前声明了
  • 1 - 你有重复的 ids -> id="fname",因为它在循环中 while($row2 = mysql_fetch_assoc($result2)){}。因此,您拥有的行越多,id="fname" 您将拥有的越多。 2 - 你可以检查值是否已经是0 -> if(x.value != 0) {x.value = x.value - v;} else{ //set x.value to something else }

标签: javascript php mysql function input


【解决方案1】:

由于您不使用 jQuery 并且您的问题是关于 javascript 的,我已经更改了一些内容以轻松完成您想做的事情。此外,id 应该是唯一的,而类不需要是唯一的。正如您所说,由于您的 id 具有相同的值会产生问题,因此您不会存储原始值,这是您的主要问题。有很多方法可以解决这个问题,但我更喜欢这个,因为我猜它很容易理解。

$n = array();
echo "<table>";
while($row2 = mysql_fetch_assoc($result2)){
    echo "<tr class='inputs'>";
    echo "<td align=center> ".$row2['item_no']." </td><td align=center>";
    echo "<input class='original' type='text' id='c".$row2['item_no']."' value='".$row2['qty']."' readonly='readonly'/>";
    echo "</td>";
    for($i=0;$i<$num;$i++){
        echo "<td align=center>";
        echo "<input class='d".$row2['item_no']."'  data-goto='c".$row2['item_no']."' data-original = '".$row2['qty']."' autofocus='autofocus' onchange='myFunction(this);' type='text' name='n[]' value='0'/>";
        echo "</td>";
    }
    echo "</tr>";
}
echo "</table>";

使用 html5,您可以定义带有 data- 前缀的自定义标签,您可以使用该对象的 getAttribute 方法来访问它们。

<script>  
    function myFunction(v){
        var minus = 0;
        var mutualInputs = document.getElementsByClassName(v.className);
        for (var i = 0; i < mutualInputs.length; ++i) {
            var item = mutualInputs[i];  
            minus = minus + parseInt(item.value);
        }
        var original = v.getAttribute('data-original');
        var x = document.getElementById(v.getAttribute('data-goto'));
        x.value = original - minus;
    }
</script>

ps:您的item_no 在此示例中必须是唯一的。

【讨论】:

  • 感谢 Burak,您的代码运行良好,但如果输入超过 1 个怎么办。我怎样才能对所有输入求和,然后从实际数量中减去..请帮助!
  • 我已经编辑了我的答案,请检查一下。我在 php 部分更改了这一行:echo "&lt;input class='d".$row2['item_no']."' data-goto='c".$row2['item_no']."' data-original = '".$row2['qty']."' autofocus='autofocus' onchange='myFunction(this);' type='text' name='n[]' value='0'/&gt;"; 添加了一个类,对于同一行中的那些将是相同的,在 javascript 部分,所有具有相同类名的节点将用于计算,也给出初始 0值,因为如果没有,可能会出现 NaN 问题。你可以在 javascript 部分看到这些东西是如何工作的。
  • 再次感谢您!根据需要完美运行!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多