Dariusz Morawski tłumacz free-lance
Temat: Potrzebuję pomocy ze skryptem...
Cześć wszystkim!Wiele lat temu miałem nieco pojęcia o JS, ale przez uporczywe nieużywanie wszystko mi się rozlazło i teraz, kiedy potrzebuję rozwiązać prosty wydawałoby się problem, jestem jak dziecko we mgle. Pewne rzeczy udało mi się osiągnąć samodzielnie (szukając na różnych forach programistycznych), ale doszedłem do punktu, z którego samodzielne wyjście kosztowałoby mnie masę czasu i energii - zamiast tego wolę zapytać ludzi, którzy się znają i rozwiążą problem lewą ręką z zamkniętymi oczami... :-)
Mam prosty kalkulator dla 3 produktów (ilość x cena = wartość). Mam również checkboxa, który pokazuje pewną wartość albo nie, zależnie od tego, czy jest zaznaczony. Moim problemem jest to, że nie wiem, jak wyczarować, żeby zmiana statusu checkboxa wpływała na łączny wynik.
Oto kod - jest trochę przydługi, bo on ma robić jeszcze parę innych rzeczy (np. sprawdzanie, czy znaki wprowadzone w polu "Ile" są liczbami całkowitymi) - nie chcę go teraz odchudzać, bo mogę coś zepsuć i nie będzie działać. Jak zobaczycie, dwie części kodu (suma i checkbox) mają niezależne skrypty - nie umiem wyciągnąć z drugiego skryptu wartości uruchamianej zaznaczeniem checkboxa i włączyć jej do sumy z pierwszego skryptu:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Dobry obiad</title>
<script language=javascript>
function dm(amount)
{
string = "" + amount;
dec = string.length - string.indexOf('.');
if (string.indexOf('.') == -1)
return string + ',-';
if (dec == 1)
return string + '';
if (dec == 2)
return string + '';
if (dec > 3)
return string.substring(0,string.length-dec+3);
return string;
}
function calculate()
{
QtyA = 0; QtyB = 0; QtyC = 0;
TotA = 0; TotB = 0; TotC = 0;
PrcA = 10; PrcB = 20; PrcC = 15;
if (document.ofrm.qtyA.value > "")
{ QtyA = document.ofrm.qtyA.value };
document.ofrm.qtyA.value = eval(QtyA);
if (document.ofrm.qtyB.value > "")
{ QtyB = document.ofrm.qtyB.value };
document.ofrm.qtyB.value = eval(QtyB);
if (document.ofrm.qtyC.value > "")
{ QtyC = document.ofrm.qtyC.value };
document.ofrm.qtyC.value = eval(QtyC);
TotA = QtyA * PrcA;
document.ofrm.totalA.value = dm(eval(TotA));
TotB = QtyB * PrcB;
document.ofrm.totalB.value = dm(eval(TotB));
TotC = QtyC * PrcC;
document.ofrm.totalC.value = dm(eval(TotC));
Totamt =
eval(TotA) +
eval(TotB) +
eval(TotC) ;
document.ofrm.GrandTotal.value = dm(eval(Totamt));
}
function validNum(theForm)
{
var checkOK = "0123456789";
var checkStr = theForm.qtyA.value;
var allValid = true;
var validGroups = true;
var decPoints = 0;
var allNum = "";
for (i = 0; i < checkStr.length; i++)
{
ch = checkStr.charAt(i);
for (j = 0; j < checkOK.length; j++)
if (ch == checkOK.charAt(j))
break;
if (j == checkOK.length)
{
allValid = false;
break;
}
if (ch == ".")
{
allNum += ".";
decPoints++;
}
else if (ch == "," && decPoints != 0)
{
validGroups = false;
break;
}
else if (ch != ",")
allNum += ch;
}
if (!allValid)
{
alert("W polu 'Ile' znajdują się znaki, które nie są liczbą całkowitą - proszę poprawić.");
theForm.qtyA.focus();
return (false);
}
if (decPoints > 0 || !validGroups)
{
alert("W polu 'Ile' znajdują się znaki, które nie są liczbą całkowitą - proszę poprawić.");
theForm.qtyA.focus();
return (false);
}
var checkOK = "0123456789";
var checkStr = theForm.qtyB.value;
var allValid = true;
var validGroups = true;
var decPoints = 0;
var allNum = "";
for (i = 0; i < checkStr.length; i++)
{
ch = checkStr.charAt(i);
for (j = 0; j < checkOK.length; j++)
if (ch == checkOK.charAt(j))
break;
if (j == checkOK.length)
{
allValid = false;
break;
}
if (ch == ".")
{
allNum += ".";
decPoints++;
}
else if (ch == "," && decPoints != 0)
{
validGroups = false;
break;
}
else if (ch != ",")
allNum += ch;
}
if (!allValid)
{
alert("W polu 'Ile' znajdują się znaki, które nie są liczbą całkowitą - proszę poprawić.");
theForm.qtyB.focus();
return (false);
}
if (decPoints > 0 || !validGroups)
{
alert("W polu 'Ile' powinny znaleźć się jedynie liczby całkowite (całkowite).");
theForm.qtyA.focus();
return (false);
}
var checkOK = "0123456789";
var checkStr = theForm.qtyC.value;
var allValid = true;
var validGroups = true;
var decPoints = 0;
var allNum = "";
for (i = 0; i < checkStr.length; i++)
{
ch = checkStr.charAt(i);
for (j = 0; j < checkOK.length; j++)
if (ch == checkOK.charAt(j))
break;
if (j == checkOK.length)
{
allValid = false;
break;
}
if (ch == ".")
{
allNum += ".";
decPoints++;
}
else if (ch == "," && decPoints != 0)
{
validGroups = false;
break;
}
else if (ch != ",")
allNum += ch;
}
if (!allValid)
{
alert("W polu 'Ile' znajdują się znaki, które nie są liczbą całkowitą - proszę poprawić.");
theForm.qtyC.focus();
return (false);
}
if (decPoints > 0 || !validGroups)
{
alert("W polu 'Ile' powinny znaleźć się jedynie liczby całkowite (całkowite).");
theForm.qtyC.focus();
return (false);
}
calculate();
return (true);
}
</script>
<script type='text/javascript'>
window.onload=function(){
var inputs = document.getElementsByClassName('sum'),
total = document.getElementById('payment-total');
for (var i=0; i < inputs.length; i++) {
inputs[i].onchange = function() {
var add = this.value * (this.checked ? 1 : -1);
total.innerHTML = parseFloat(total.innerHTML) + add
}
}
}
</script>
</head>
<body>
<h3>Składamy obiad:</h3>
<form method="POST" action="submit.html" onsubmit="return Validate(this)" name="ofrm">
<table border="0" cellpadding="0" width="550" id="table2">
<tr>
<td width="350" height="31"><b>Co</b></td>
<td align="center" width="100" height="31"><b>Ile</b></td>
<td align="right" height="31" width="60"><b>Cena</b></td>
<td align="right" height="31" width="40"><b>Razem</b></td>
</tr>
<tr>
<td width="350">Zupa</td>
<td align="center" width="100">
<input type="text" name="qtyA" size="5" tabindex="5" onchange="return validNum(document.ofrm)"></td>
<td align="right" width="60">10,-</td>
<td align="right" width="40"> <input type="text" name="totalA" size="4" tabindex="99" onchange="calculate()"></td>
</tr>
<tr>
<td width="350">Kotlet</td>
<td align="center" width="100">
<input type="text" name="qtyB" size="5" tabindex="5" onchange="return validNum(document.ofrm)"></td>
<td align="right" width="60">20,-</td>
<td align="right" width="40"> <input type="text" name="totalB" size="4" tabindex="99" onchange="calculate()"></td>
</tr>
<tr>
<td width="350">Deser</td>
<td align="center" width="100">
<input type="text" name="qtyC" size="5" tabindex="5" onchange="return validNum(document.ofrm)"></td>
<td align="right" width="60">15,-</td>
<td align="right" width="40"> <input type="text" name="totalC" size="4" tabindex="99" onchange="calculate()"></td>
<tr>
<td width="350">Napiwek dla kelnera?</td>
<td align="center" width="100">TAK <input value="10" type="checkbox" class="sum" data-toggle="checkbox"></td>
<td align="right" width="60"> </td>
<td align="left" width="40"> <span id="payment-total" name="totalD">0</span>,-</td>
</tr> <tr>
<td width="350"> <p> </p><p align="right"><b>DO ZAPŁATY:</b></td>
<td align="center" width="100"><p> </p> </td>
<td align="right" width="60"><p> </p> </td>
<td align="right" width="40"><p> </p> <input type="text" name="GrandTotal" size="8" tabindex="99" onchange="calculate()"></td>
</tr>
</table>
</form>
</body>
</html>Ten post został edytowany przez Autora dnia 28.05.14 o godzinie 00:29