Пользовательский тумблер перестает работать после трех переключений

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

Вот код.

$('input[name = "switch"]').change(function() {
      if (this.checked) {
        $('input[name = "tin"], label[for = "tin"]').prop('disabled', true);
        $('input[name = "switch"]').prop('name', "tin");
        $('#tinSwitchText').hide().html("(This will attract an added cost)").fadeIn(1500);
      } else {
        $('input[name = "tin"], label[for = "tin"]').prop('disabled', false);
        $('input[name = "switch"]').prop('name', "switch");
        $('#tinSwitchText').html('')
      }
  });
<!-- Include jQuery. -->
<script src = "https://code.jquery.com/jquery-3.3.1.min.js"></script>

<div class = "form-group d-flex " >
  <span class = "w-15 d-flex justify-content-end">
    <input value = "Get TIN" type = "checkbox" id = "id-name--1" name = "switch" class = "switch-input">
    <label for = "id-name--1" class = "switch-label"></label>
  </span>
  <span class = "w-85 d-flex justify-content-start">
    <label for = "" >I dont have a TIN, I want to get one <br>
      <small><i id = "tinSwitchText"></i></small> 
    </label>
  </span>
 </div>

виноватая линия - $('input[name = "switch"]').prop('name', "tin");, сделав так, вы отключаете сам флажок после того, как он был переименован. Почему вы хотите его именно переименовать? Удалите строки переименования, и все заработает. Второй $('input[name = "switch"]').prop('name', "switch"); бесполезен, кстати, потому что на этом этапе больше нет элементов с именем "switch"

Kaddath 18.12.2018 11:14

вы были близки, поменяйте этот $('input[name = "tin"], label[for = "tin"]').prop('disabled', true); на $('input[name = "tin"], label[for = "tin"]').prop('disabled', false); и все готово.

Ramon de Vries 18.12.2018 11:15

@Kaddath Я переименовываю его, потому что, если он отмечен, я хочу, чтобы на сервер было отправлено другое значение

Hamza Bashir 18.12.2018 11:29

@RamondeVries Я не понимаю, как это решает проблему

Hamza Bashir 18.12.2018 11:30

Вам не нужно это, IIRC, значение будет присутствовать на стороне сервера, если отмечено, и будет отсутствовать, если не отмечено. Этого должно быть достаточно, чтобы вы знали, установлен ли флажок.

Kaddath 18.12.2018 11:35

Вы решили мою проблему .. Большое спасибо. Теперь он работает отлично. Я до сих пор не понимаю, почему другой не работал

Hamza Bashir 18.12.2018 11:54

@Kaddath, можешь ли ты поместить это как полный ответ, чтобы я принял его?

Hamza Bashir 18.12.2018 12:04
Поведение ключевого слова "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) для оценки ваших знаний,...
0
7
48
2

Ответы 2

Прочитав комментарии и еще много чего, я сделал предположение, что это что-то вроде того, что вы хотели бы иметь?

Я должен сказать, что немного непонятно, чего конкретно вы пытаетесь достичь здесь, т.е. почему вы устанавливаете внутреннее значение HTML элемента с идентификатором tinSwitchText равным нулю, только чтобы сбросить его? Наверняка было бы эффективнее просто показать / спрятать.

// Some function that will run when the input is checked.
const whenChecked = (input) => {
  $('input[name = "tin"], label[for = "tin"]').prop('disabled', input.checked);
  $(input).prop('name', "tin");
  $('#tinSwitchText').fadeIn(1500);
};


// Some function that will run when the input is unchecked.
const whenUchecked = (input) => {
  $('input[name = "tin"], label[for = "tin"]').prop('disabled', input.checked);
  $(input).prop('name', "switch");
  $('#tinSwitchText').hide();
};


// Some function to handle the input state change.
const onChangeHandler = (input) => input.checked ? whenChecked(input) : whenUchecked(input);


// Wait for the DOM to load.
$(document).ready(() => {
  const input = document.querySelector("input[name=switch]");
  input.onchange = () => onChangeHandler(input);
});
<!-- Include jQuery. -->
<script src = "https://code.jquery.com/jquery-3.3.1.min.js"></script>

<div class = "form-group d-flex " >
  <span class = "w-15 d-flex justify-content-end">
    <input value = "Get TIN" type = "checkbox" id = "id-name--1" name = "switch" class = "switch-input">
    <label for = "id-name--1" class = "switch-label"></label>
  </span>
  
  <!-- 
     - I've set the content of $('#tinSwitchText') to the default value below, 
     - the reason being because in the example code you provided, there wasn't much
     - going on? It would either be hidden, or visible, and essentially in this 
     - solution, it maintains the same functionality, but by all means, feel free to 
     - change it as you like.
    -->
  <span class = "w-85 d-flex justify-content-start">
    <label for = "">I dont have a TIN, I want to get one <br>
      <small><i style = "display:none" id = "tinSwitchText">(This will attract an added cost)</i></small> 
    </label>
  </span>
  
 </div>

Виноватая линия - $('input[name = "switch"]').prop('name', "tin");, сделав так, вы отключите сам флажок после того, как он был переименован. Это подробный процесс:

  1. this.checked верно, input name = "switch" переименовывается в name = "tin"
  2. this.checked ложно, input name = "switch" больше не найден
  3. this.checked истинно, ввод, который был переименован в name = "tin", отключается

Вам также действительно не нужно переименовывать ввод, чтобы обнаружить изменение в данных вашего сервера. Из-за того, как работают флажки, ваше поле будет присутствовать во входных данных, если отмечено, и будет отсутствовать, если не отмечено. Этого должно быть достаточно, чтобы определить вашу ценность.

просто удалите строки $('input[name = "switch"]').prop('name', "tin"); и $('input[name = "switch"]').prop('name', "switch");, а затем адаптируйте сервер обнаружения.

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