Opera 7 ändert Select-Listeneintrag ohne erkennbaren Grund
Utz
- javascript
Hallo zusammen,
ich habe eine einfach Rabattberechnung: auf zwei Lizenzarten ("Personal" und "Professional") gibt es 30% Rabatt, auf eine dritte ("Enterprise") dagegen nicht. Den aufs Wesentliche reduzierten Code findet Ihr unten.
Opera 7 (getestet: 7 und 7.02) zeigt damit folgendes Verhalten: Wählt man bei "Lizenzform" Personal oder Professional und klickt dann auf "Preis berechnen" (oder ändert die Lizenzanzahl), wird die Berechnung korrekt durchgeführt, aber die Lizenzform springt anschließend wieder zurück auf "Enterprise". In der echten Variante wird damit also immer die falsche Lizenzart verschickt. Zur Verdeutlichung ist im Beispielcode ein Alert-Fenster als Breakpoint eingebaut, kurz bevor dieser Listeneintrag zurückspringt.
Durch Probieren hab ich herausgefunden, dass dieses Verhalten nicht mehr auftritt, wenn eine bestimmte Zeile auskommentiert wird (im Beispielcode zeigt Euch ein Kommentar die Zeile). Bloß: diese Zeile ändert den Wert eines Hidden-Feldes, und ich kann keinen Zusammenhang zwischen ihr und dem Verhalten erkennen.
Überflüssig zu sagen, dass der Code mindestens in IE 5 und Mozilla 1.0 problemlos läuft.
Könnt Ihr dieses Fehlverhalten bei Euch reproduzieren, oder ist einfach meine Installation kaputt?
Falls Ihr es reproduzieren könnt: Habt Ihr ne Idee woran es liegt und was man dagegen tun könnte? Oder muss man es einfach als Bug akzeptieren?
Grüße,
Utz
Hier der Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<title>Opera 7 Bug?</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript"><!--
function calculate()
{
license = document.forms[0].LicenseType.selectedIndex + 1;
amount = document.forms[0].ProductBuyAmount.options[document.forms[0].ProductBuyAmount.options.selectedIndex].value;
if (license == 1) rawPrize = 100 * amount;
else if (license == 3) rawPrize = 300 * amount;
else rawPrize = 200 * amount;
floorPrize = Math.floor(rawPrize);
tempPrize = String(floorPrize);
finalPrize = tempPrize + ",-";
document.forms[0].dummyPrice.value = finalPrize + " EUR zzgl. Mwst.";
alert("Breakpoint");
if (license == 1 || license == 2) {
rabattRawPrize = (rawPrize/10)*7;
rabattFloorPrize = Math.floor(rabattRawPrize);
rabattTempPrize = String(rabattFloorPrize);
rabattFinalPrize = rabattTempPrize + ",-";
document.forms[0].dummyPriceRabatt.value = rabattFinalPrize + " EUR zzgl. Mwst.";
// Kommentiert man folgende Zeile aus, geht es
document.forms[0].RabattLicensePrice.value = rabattFloorPrize;
}
else {
document.forms[0].dummyPriceRabatt.value = "";
document.forms[0].RabattLicensePrice.value = floorPrize;
}
}
//--></script>
</head>
<body>
<form action="something.asp" method="post">
<p><input type="hidden" name="RabattLicensePrice" value="">
Lizenzform: <select name="LicenseType">
<option value="0">Personal</option>
<option value="1">Professional</option>
<option value="2" selected>Enterprise</option>
</select></p>
<p>Anzahl Lizenzen: <select name="ProductBuyAmount" size="1" onChange="calculate();">
<option value="1">1</option>
<option value="2">2</option>
<option value="3" selected>3</option>
<option value="4">4</option>
<option value="5">5</option>
</select> <a href="#" onClick="calculate(); return false;">Preis berechnen</a></p>
<p>Listenpreis: <input type="text" name="dummyPrice" value="900,- EUR zzgl. Mwst." size="41" readonly></p>
<p>Aktionspreis (-30%): <input type="text" name="dummyPriceRabatt" value="" size="41" readonly></p>
</form>
</body>
</html>