Отключить и включить флажок с помощью переключателя

#javascript

#javascript

Вопрос:

У меня возникла проблема с отключением и включением некоторых флажков с помощью radiobutton. По сути, я пытался отключить какой-либо флажок на основе выбранного переключателя и снова включить его, если переключатель не выбран.

Это программа для заказа пиццы. В нем есть 3 варианта пиццы с несколькими вариантами начинки. На самом деле, первый и второй переключатели работают так, как ожидалось. Но это становится беспорядочным, когда выбран третий переключатель. Первый и второй переключатели снова не работают.

Кто-нибудь может помочь мне исправить это?

Вот фрагмент моего синтаксиса JS

 function pizzaChoice() {
var menu = document.querySelectorAll('input[name="pizza"]');
var dis = [];

if (menu[0].checked || menu[1].checked || menu[2].checked) {
    
    if (menu[0].checked) {
        var dis = ['Lobster', 'Oyster', 'Salmon', 'Bacon', 'Duck', 'Sausage'];
        for (const val of dis) {
            document.getElementById(val).disabled = true;
        }
    } else {
        var dis = ['Lobster', 'Oyster', 'Salmon', 'Bacon', 'Duck', 'Sausage'];
        for (const val of dis) {
            document.getElementById(val).disabled = false;
        }
    }

    if (menu[1].checked) {
        var dis = ['Avocado', 'Tuna', 'Duck', 'Sausage']
        for (const val of dis) {
            document.getElementById(val).disabled = true;
        }
    } else {
        var dis = ['Avocado', 'Tuna', 'Duck', 'Sausage']
        for (const val of dis) {
            document.getElementById(val).disabled = false;
        }
    }

    if (menu[2].checked) {
        var dis = ['Avocado', 'Lobster', 'Oyster', 'Salmon'];
        for (const val of dis) {
            document.getElementById(val).disabled = true;
        }
    } else {
        var dis = ['Avocado', 'Lobster', 'Oyster', 'Salmon'];
        for (const val of dis) {
            document.getElementById(val).disabled = false;
        }
    }
    
}
  

}

Комментарии:

1. в вашем блоке if else произошла утечка. попробуйте проверить логику. если вы не можете разобраться в этом самостоятельно, дайте мне знать, я помогу вам заставить его работать.

Ответ №1:

ну, как я понимаю, вы считаете, что ваш код запутан из-за дубликатов в каждом цикле for?

Я надеюсь, что это может вам помочь:

https://jsfiddle.net/J00nas/ozu1thjL/

Я создаю таблицу для связи между topping и каждым параметром.

   var toppings = {
  // 'Topping name': [is available on Option1, Option2, Option3]
    'Avocado': [true, false, false],
    'Tuna': [true, false, true],
    'Duck': [false, false, true],
    'Sausage': [false, false, true],
    'Lobster': [false, true, false],
    'Oyster': [false, true, false],
    'Salmon': [false, true, false],
    'Bacon': [false, true, true]
  };
  

Может быть больше опций, которые вы хотите для каждой начинки.

когда вы выбираете какую-либо переключающую кнопку, передавайте идентификатор опции в качестве параметра следующим образом pizzaChoice(0) :

 <input type="radio" name="pizza" onchange="pizzaChoice(0)">
  

и отключите флажки с помощью выбранного варианта пиццы

   for (const name of Object.keys(toppings)) {
    var chkbox = document.getElementById(name);
    if (toppings[name][menuId]) { // available topping on this menu
      chkbox.disabled = false;
    }
    else {
        // disable if menu selected
      chkbox.disabled = menu[menuId].checked;
      if (menu[menuId].checked) {
        chkbox.checked = false;
      }
    }
  }
  

Ответ №2:

Установите все ваши флажки по умолчанию отключенными и измените pizzaChoice на next

 <input type="checkbox" id="Lobster" name="Lobster" disabled>
... other checkboxes

function pizzaChoice() {
    var menu = document.querySelectorAll('input[name="pizza"]');
    var checkboxes = Array.from(document.querySelectorAll('input[type="checkbox"]'));
    var dis = [];    

    if (menu[0].checked) {
        dis = ['Lobster', 'Oyster', 'Salmon', 'Bacon', 'Duck', 'Sausage'];
    } else if(menu[1].checked) {
        dis = ['Avocado', 'Tuna', 'Duck', 'Sausage'];
    } else if(menu[2].checked) {
        dis = ['Avocado', 'Lobster', 'Oyster', 'Salmon'];
    }

    checkboxes.map(function(el){
        el.disabled = dis.indexOf(el.id) != -1;
    });
}
  

Ответ №3:

Я просто изменил ваши условия if-else, чтобы он выполнял логику для выбранного переключателя, а не для других. возникла проблема с тем, как вы написали оператор if-else.

 function pizzaChoice() {
  var menu = document.querySelectorAll('input[name="pizza"]');
  var dis = [];
  let defualt = ['Lobster', 'Oyster', 'Salmon', 'Bacon', 'Duck', 'Sausage', 'Avocado', 'Tuna'];
  for (let val of defualt) {
    document.getElementById(val).disabled = false;
  }

  if (menu[0].checked || menu[1].checked || menu[2].checked) {
    if (menu[0].checked) {
      let dis = ['Lobster', 'Oyster', 'Salmon', 'Bacon', 'Duck', 'Sausage'];
      for (let val of dis) {
        document.getElementById(val).disabled = true;
      }
    }

    if (menu[1].checked) {
      let dis = ['Avocado', 'Tuna', 'Duck', 'Sausage']
      for (let val of dis) {
        document.getElementById(val).disabled = true;
      }
    }

    if (menu[2].checked) {
      let dis = ['Avocado', 'Lobster', 'Oyster', 'Salmon'];
      for (let val of dis) {
        document.getElementById(val).disabled = true;
      }
    }

  }
}  
 <form>
  <input type="radio" id="option1" name="pizza" value="option1" onclick="pizzaChoice()">
  <label for="male">option1</label><br>
  <input type="radio" id="option2" name="pizza" value="option2" onclick="pizzaChoice()">
  <label for="female">option2</label><br>
  <input type="radio" id="option3" name="pizza" value="option3" onclick="pizzaChoice()">
  <label for="other">option3</label>
</form>

<input type="checkbox" id="Lobster" name="Lobster" value="1">
<label for="Lobster"> Lobster</label><br>
<input type="checkbox" id="Oyster" name="Oyster" value="2">
<label for="pizza2"> Oyster</label><br>
<input type="checkbox" id="Salmon" name="Salmon" value="3">
<label for="Salmon"> Salmon</label><br>
<input type="checkbox" id="Bacon" name="Bacon" value="4">
<label for="Bacon"> Bacon</label><br>
<input type="checkbox" id="Duck" name="Duck" value="5">
<label for="Duck"> Duck</label><br>
<input type="checkbox" id="Avocado" name="Avocado" value="6">
<label for="Avocado"> Avocado</label><br>
<input type="checkbox" id="Sausage" name="Sausage" value="7">
<label for="Sausage"> Sausage</label><br>
<input type="checkbox" id="Tuna" name="Tuna" value="8">
<label for="Tuna"> Tuna</label><br>  

Комментарии:

1. Спасибо за ваш ответ. я понятия не имею, что решение настолько простое. Но можете ли вы сказать мне, какова цель этого «отладчика»?

2. ох, прости, что я виноват. я использую отладчик для перехвата кода JS, чтобы я мог анализировать переменные и объекты в инструменте разработчика.