Как переключить переключатель с меткой

Я хотел бы отменить выбор переключателя, когда я нажимаю на метку, и следующий код работает, как и ожидалось, только если я нажимаю на саму кнопку.

Как связать поведение метки с кнопкой?

<label>
<input type = "radio" name = "choice" value = "HTML" onMouseDown = "this.__chk = this.checked" onClick = "if (this.__chk) this.checked = false" /> Learn HTML 
</label>

<label>
<input type = "radio" name = "choice" value = "Java" onMouseDown = "this.__chk = this.checked" onClick = "if (this.__chk) this.checked = false"/> Learn JavaScript 
</label>

Почему вы хотите использовать переключатели, если вы хотите снять их по щелчку? Для этого есть галочки.

Zsolt Meszaros 18.12.2020 18:17

Это потому, что я не хочу, чтобы оба варианта были выбраны одновременно. Другими словами, это только одна возможность с возможностью отменить выбор, если это необходимо.

Xtof 19.12.2020 10:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
1 783
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

  1. используйте атрибут for в метке
<label for='idHTML'>Learn HTML </label>
  1. дать радио эквивалент идентификатора
<input id='idHTML' type = "radio" name = "choice" />

Он не отвечает на вопрос, он работает так же, как и тот, о котором идет речь выше.

Zsolt Meszaros 18.12.2020 18:18

ваши прослушиватели событий onMouseDown и onClick не имеют смысла. Я создал еще один пост, если вы могли бы проверить его.

XMehdi01 18.12.2020 19:16

Вы должны изменить свой другой пост тогда.

Mr. Polywhirl 18.12.2020 19:24

что ты имеешь ввиду под этим.__chk

onMouseDown = "this.__chk = this.checked"
onClick = "if (this.__chk) this.checked = false"

если вы хотите выбрать только один, вы можете использовать просто тип радио с группировкой опций с одним именем = «выбор»

если вы хотите проверить и снять отметку с нескольких вариантов, вы можете использовать флажок

Радиокнопки работают не так, как вы думаете. Чтобы отменить выбор одного, вам нужно либо выбрать другой с тем же атрибутом name, либо сбросить форму. Функциональность, которую вы описываете, больше подходит для флажка, чем для переключателя. См. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/radio для спецификаций. Вы также можете взглянуть на этот вопрос / ответ: Сбросить определенный элемент ввода в HTML-форме.

Кроме того, нет необходимости оборачивать тег label вокруг ввода. Атрибут for отвечает за связь.

Если вы хотите отменить выбор радиокнопки, вам нужно будет сбросить форму.

form {
  display: flex;
  flex-direction: column;
}
<form>
  <label for = "ckb-01">
    <input id = "ckb-01" type = "radio" name = "choice" value = "HTML" />
    Learn HTML
  </label>
  <label for = "ckb-02">
    <input id = "ckb-02" type = "radio" name = "choice" value = "Java" />
    Learn JavaScript
  </label>
  <label for = "ckb-03">
    <input id = "ckb-03" type = "radio" name = "choice" value = "Java" />
    Learn CSS
  </label>
  <input type = "reset" />
</form>
Ответ принят как подходящий

После многих попыток мне наконец удалось закодировать рабочее решение с помощью некоторого javascript.

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

<main id = "form">
    <label >
      <input type = "radio" name = "rad" id = "Radio0" />Learn Html
    </label>
    <br><br>
    <label>
      <input type = "radio" name = "rad" id = "Radio1" />Learn CSS
    </label>
    <br><br>
    <label>
      <input type = "radio" name = "rad" id = "Radio2" />Learn Java
    </label>
</main>



<script>
    let buttons = document.querySelectorAll('#form input');
    for (button of buttons){
        button.dataset.waschecked = "false";
        button.addEventListener('click', myFunction, false);
    }


function myFunction(e) {
  if (e.originalTarget.dataset.waschecked == "false"){
    
    for (button of document.querySelectorAll('#form input')){
        button.dataset.waschecked = "false";
    }
    e.originalTarget.dataset.waschecked = "true";
    e.originalTarget.checked =true;
  }else {
    for (button of document.querySelectorAll('#form input')){
        button.dataset.waschecked = "false";
    }
    e.originalTarget.checked =false;
  }
}
</script>

Приветствуются любые предложения по улучшению этого кода.

Другие вопросы по теме