Я наткнулся на проблему и мог использовать вашу помощь, выясняя здесь какую-то логику, чтобы справиться с этим. В основном у меня есть динамическая форма заказа, где цена обновляется в реальном времени на стороне пользователя, используя javascript на основе того, какие параметры выбирает пользователь. Проблема в том, что существует 3 динамических выпадающих меню, которые могут быть не все, т.е. Иногда будет выпадать a-c, иногда будет только a или просто a и b и т.д. Ошибка, которую я получаю, заключается в том, что переменная для любого неопределенного выбора не определена (очевидно). Я реализовал некоторые js, чтобы справиться с этим, но без успеха. Вот код, с которым я работаю:
PHP:
$a_sql = ("SELECT * FROM prod_add WHERE pid = '$id' AND 'group' = 'a'");
$a_query = mysqli_query($dbconx, $a_sql);
$a_Count = mysqli_num_rows($a_query);
if ($a_Count > 0) {
while($row = mysqli_fetch_array($a_query)) {
$a_option = $row["option"];
$a_value = $row["value"];
$a_results .= "<option value='$a_value'>$a_option</option>";
}
}
if($a_Count > 0) {
$a_opt = "<select class='opt_drop' id='optA' name='optA' onchange='getTotal()'>$a_results</select>";
} else {
$a_opt = "";
}
Промыть и повторить для b & c
HTML:
<h2 id="totalPrice">$<?php echo $base_cost ?></h2> <br />
<input type="hidden" name="base_cost" id="base_cost" value="<?php echo $base_cost ?>" />
<?php echo $a_opt; ?><br />
<?php echo $b_opt; ?><br />
<?php echo $c_opt; ?>
Quantity:
<select name="quantity" id="quantity" onchange="getTotal()">
<option value="1"> 1 </option>
<option value="2"> 2 </option>
<option value="3"> 3 </option>
<option value="4"> 4</option>
<option value="5"> 5 </option>
<option value="6"> 6 </option>
<option value="7"> 7 </option>
<option value="8"> 8 </option>
<option value="9"> 9 </option>
<option value="10"> 10 </option>
</select>
Javascript:
<script type="text/javascript">
function getDDValue(elementID){
var value = 0;
var element = document.getElementById(elementID);
value = element.options[element.selectedIndex].value;
console.log(value);
return parseFloat(value);
}
function getBase (elementID) {
var value = 0;
var element = document.getElementById(elementID);
value = element.value;
return parseFloat(value);
}
function getTotal(){
if (typeof optA != "undefined") {
var optA = getDDValue("optA");
} else {
var optA = "0";
}
if (typeof optB != "undefined") {
var optB = getDDValue("optB");
} else {
var optB = "0";
}
if (typeof optC != "undefined") {
var optC = getDDValue("optC");
} else {
var optC = "0";
}
var quantity = getDDValue("quantity");
var base_cost = getBase ("base_cost")
var totalPrice = '0';
totalPrice = parseFloat((+base_cost + +optA + +optB + +optC) * +quantity);
console.log(totalPrice);
document.getElementById('totalPrice').innerHTML = "$" + totalPrice;
}
getTotal();
</script>
Как вы можете видеть выше, я попытался определить, было ли значение неопределенным и было ли это просто дать ему значение 0. Это не сработало, хотя я не могу быть уверен, почему.
При использовании typeof
в javascript, как правило, неплохо сравнивать результаты с тройным равным компаратору. Поэтому вместо использования !=
Use !==
Также в javascript, если вы передадите объект, значение которого undefined
в условном выражении, оно будет оцениваться как false. Если значение опущено или равно 0, -0, null, false, NaN, undefined или пустая строка (""), объект имеет начальное значение false. Это означает, что вы могли бы переписать вышеприведенное, как указано ниже, если вы специально не хотите, чтобы значение было точно undefined
:
function getTotal(){
// If optA does not exist, create the variable and assign it
if (!optA) {
var optA = getDDValue("optA");
// Otherwise it exists, now set it to "0" pleaseandthankyou :)
} else {
optA = "0";
}
...
}
EDIT: основываясь на ваших ответах на приведенный выше ответ, я думаю, что это может помочь: element
переменной null. Это означает, что ни один элемент не может быть найден с идентификатором id elementID
и поэтому он имеет значение null. Потому что это имеет нулевое значение, он не имеет свойств options
. Убедитесь, что на самом деле есть элемент DOM с атрибутом id, равным тому, что вы передаете как elementID
.
function getDDValue(elementID){
var element = document.getElementById(elementID);
var value;
// if the element exists
if(element){
value = element.options[element.selectedIndex].value;
}else{
value = 0;
}
console.log(value);
return parseFloat(value);
}
optA
(а также другие) в if
условия getTotal
всегда будет undefined
. Js знает только области уровня функции, и не имеет значения, где в функции, которую вы определили с помощью var
(вы также можете определить их все в конце вашего тела функции).
Таким образом, все появление optA
связано с объемом функции. Вот почему это всегда undefined
.
Uncaught TypeError: Cannot read property 'options' of null products.php?id=1:27 getDDValue products.php?id=1:27 getTotal products.php?id=1:54 (anonymous function)
в консоли JavaScript.(base_cost + a + b + c) * quantity
хотя реверсирование тоже не сработало.