在这部分代码中,我使用PHP从mysql数据库中提取信息。它在循环中,以便数据库中的所有行都将显示在页面上。每行都有一个价格,我将它们(在循环中)总计并显示为总计。我想添加一些功能,允许需要检查一个复选框,以便将价格添加到总数中,但我无法弄清楚我应该使用哪种技术来实现这一目标。
以下是代码片段:
$sql = "SELECT CourseNum, CourseName, CreditNum, InstructorName, BookName, NewPrice, UsedPrice, Section_Name, BookLink FROM BookInfo"; // echo"<a href='$row["BookLink"].'>$row["BookName"].</a>";
$test = "test";
$result = $conn->query($sql);
echo"<h2>CIT Course requirements <hr></h2>";
echo"<h2><small>Math & Science</small></h2>";
if ($result->num_rows > 0) {
echo "$tableHeaderInfo";
// output data of each row
while($row = $result->fetch_assoc()) {
if($row["Section_Name"] == mth_sci){
echo "<tr><td class='col-xs-.3'><input type='checkbox' ID='checbox123' name='checkbox123' value='1' onClick='apply(this);' /> </td><td class='col-xs-1'>" . $row["CourseNum"]. "</td><td class='col-xs-3'>" . $row["CourseName"]. " </td><td class='col-xs-2'>" . $row["InstructorName"]." </td><td><a href='" . $row["BookLink"] . "'>" . $row["BookName"] . "</a></td><td class='col-xs-1'>$" . money_format('%(#10n', $row["NewPrice"]). " </td><td class='col-xs-1'>$" . money_format('%(#10n', $row["UsedPrice"]). " </td></tr>";
$test = "test";
echo "
<script>
apply = function (obj)
{
if(obj.checked){
obj.parentNode.parentNode.style.backgroundColor='lightgreen'
}
else
obj.parentNode.parentNode.style.backgroundColor=''
}
</script>
";
$sum_total1 += $row["NewPrice"]; //This totals the prices right now
$sum_total2 += $row["UsedPrice"];
}
}
echo "</table>";
} else {
echo "0 results";
}
所以代替$ sum_total2 + = $ row [&#34; UsedPrice&#34;];用于计算价格的总和,在echo&#39; javascript函数中会有一个类似的行,名为&#39; apply&#39;。
这似乎是一个总数的好方法吗?如何从循环中获得添加,以便我可以提取价格变量?
感谢您的帮助:)如果需要,我可以发布整页代码。
编辑:
我的主要目标是在循环内使用总价格,但前提是选中复选框。
例如
if(obj.checked){
obj.parentNode.parentNode.style.backgroundColor='lightgreen'
//does the total here ie total += $NewPrice
}
但是不能像这样工作,因为循环已经在checkbutton事件发生时完成了..
编辑3:
代码片段基本上显示下面的图像(减去一些引导程序)
http://pastie.org/10790551(链接到上图中的代码)
按下该复选框后,将更新总计。看起来我的技术不适用于此,因为我需要在循环内部捕获bookprice变量?
答案 0 :(得分:0)
我不完全确定我理解你的目标,但为什么不让javascript做总结,如果你处理复选框点击javascript呢?您可以在checkbox元素中包含行的价格。无论是作为标签还是传递给应用的变量......
然后你从总和中加/减它(我猜测这总是在某个元素中)。 或者你可以让javascript循环遍历所有复选框元素,如果选中则从标签中获取价格并显示总和。
更新答案:
好的,所以你的复选框看起来像这样:
<input type='checkbox' ID='checbox123' name='checkbox123' value='1' onClick='apply(this);' />
首先,你不应该为多个元素使用相同的id。如果你需要给它一个ID,它应该是&#39;复选框&#39; + [一些独特的ID]。如果是CSS,请使用class。 另一方面,如果名称对所有人都相同(并假设您不使用HTML5),则可以利用该名称,因为这样可以实现此目的:
var checkboxes = document.getElementsByName("checkbox123");
复选框现在是名为checkbox123的所有复选框的集合,您可以遍历它们:)
回答新的更新:
解决此问题的一种方法是确保将总数放入带有ID标记的html元素中。 然后确保给你的复选框提供这样的价格信息:(顺便说一下,我删除了ID标签,因为你真的,真的不应该为几个元素重用相同的ID。你用什么价值? )
<input type='checkbox' style='width:40px; height:40px;' name='checkbox123' value='1' price1='" . [insert new price here] . "' price2=' . [insert used price here] . ' onClick='apply(this);' />
然后你的apply-function看起来像这样:(另外,不要忘记javascript中的分号!)
apply = function (obj)
{
if(obj.checked){
obj.parentNode.parentNode.style.backgroundColor='#99ff99';
}
else {
obj.parentNode.parentNode.style.backgroundColor=''; //what is this for??
}
var checkboxes = document.getElementsByName("checkbox123");
var price1sum = 0;
var price2sum = 0;
for (var i=0; i<checkboxes.length; i++) {
if (checkboxes[i].checked) {
price1sum += checkboxes[i].getAttribute("price1");
price2sum += checkboxes[i].getAttribute("price2");
}
}
/*
display price1sum and price2sum in html elements using something like this:
document.getElementById("ID for total of new price").innerText = price1sum;
*/
}
显然,为每一个复选框点击做一个循环并不是最有效的解决方案,但考虑到你目前的结构,我认为它是最简单的,如果你没有很多行,我不认为你会发现任何事情。