Определите, определены ли динамические выборки с помощью JavaScript

0

Я наткнулся на проблему и мог использовать вашу помощь, выясняя здесь какую-то логику, чтобы справиться с этим. В основном у меня есть динамическая форма заказа, где цена обновляется в реальном времени на стороне пользователя, используя 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. Это не сработало, хотя я не могу быть уверен, почему.

Теги:
select

2 ответа

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);
}
  • 0
    Спасибо за этот информативный ответ. Неважно, является ли значение пустым, неопределенным и т. Д., Важно то, что, если администратор загрузил только 2 категории элементов выбора (скажем, A и B), javascript пропустит c, поскольку он не существует. Два примера (код и компаратор тройного равенства) не сработали, хотя я не уверен, почему. Я все еще получаю сообщение об ошибке 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.
  • 0
    также я думаю, что логика обратная в коде, который вы опубликовали, я пытался сделать, если он определен, затем установить переменную для выбранной динамической опции, в противном случае, если она не определена, значение равно 0, так как уравнение в спине в основном (base_cost + a + b + c) * quantity хотя реверсирование тоже не сработало.
Показать ещё 1 комментарий
0

optA (а также другие) в if условия getTotal всегда будет undefined. Js знает только области уровня функции, и не имеет значения, где в функции, которую вы определили с помощью var (вы также можете определить их все в конце вашего тела функции).

Таким образом, все появление optA связано с объемом функции. Вот почему это всегда undefined.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню