Функция Onclick для флажка все еще работает, даже если она заменена другой функцией с помощью javascript

Я планирую разрешить пользователю при нажатии на один из переключателей A и B:

A - позволит пользователю установить флажок с помощью javascript, заменившего функцию onclick checkRequired(), где функция удалит «требуемый» из ввода после его проверки.

B - позволит пользователю установить только 1 флажок с помощью функции checkOne(), заменив функцию checkRequired()

Проблема в том, что я не понимаю, почему javascript продолжает использовать функцию checkOne(), даже если я проверил весь код и синтаксис, даже инструмент разработчика из браузера Google Chrome ПОКАЗАЛ, ЧТО ФУНКЦИЯ БЫЛА ЗАМЕНЕНА checkRequired( ) ПОСЛЕ ПРОВЕРКИ РАДИОКНОПКИ A. Логически говоря, ЭТО ДОЛЖНО РАБОТАТЬ ХОРОШО, НО почему-то совсем не работает.

function checkRequired() {
        var n = $( "input:checkbox:checked" ).length;
        var requiredCheckboxes = $(':checkbox[required]');
        var chkboxes = $(':checkbox');
        if (n < 1) {
            chkboxes.attr('required', 'required');
        } else {
            requiredCheckboxes.removeAttr('required');
        }
    }


function checkOne() {
        $('.regid-chkbox').on('change', function() {
           $('.regid-chkbox').not(this).prop('checked', false);
        });
    }


function editMeal() {
        var editBrand = document.getElementById("radio-edit-meal-brand");
        var editInfo = document.getElementById("radio-edit-meal-info");

        if (editBrand.checked){
            $('.regid-chkbox').removeAttr('onclick');
            $('.regid-chkbox').attr('onclick', 'checkRequired();');
        } else if (editInfo.checked) {
            /* Making the checkbox only one can be checked */
            $('.regid-chkbox').removeAttr('onclick');
            $('.regid-chkbox').attr('onclick', 'checkOne();');
        }
    }

HTML-коды:

<div class = "logmod__tab lgm-2" id = "ver-form-res">
      <form method = "POST" action = "">
        <div class = "logmod__heading">
          <span class = "logmod__heading-subtitle">Enter your information to verify and <strong>edit the meal.</strong></span>
        </div>
        <div class = "logmod__form">
        <!-- Upload Image Section -->
         <center>
           <div id = "wrapper" class = "img-container">
            <img id = "output_image" src = "image/e2.png" class = "preview-img"/>
            <div class = "upload-text-container">
              <div class = "upload-text"><i class = "fa fa-camera" aria-hidden = "true"></i><br> Click here to Upload </div>
            </div>
            <input type = "file" onchange = "preview_image(event)" style = "display: none;" name = "bran-img" id = "bran-image-reg">
           </div>
         </center>
            <div class = "sminputs">
              <div class = "input full" style = "height:auto!important;">
                <label class = "string optional" for = "user-account-code-dis">Edit Categories*</label>
                <label class = "radio-container"> EDIT MEAL\'S BRAND
                  <input required type = "radio" checked = "checked" value = "0" id = "radio-edit-meal-brand" name = "meal-edit" onclick = "editMeal()">
                  <span class = "checkmark-radio"></span>
                </label>
                <label class = "radio-container"> EDIT MEAL\'S INFO
                  <input required type = "radio" value = "1" id = "radio-edit-meal-info" name = "meal-edit" onclick = "editMeal()">
                  <span class = "checkmark-radio"></span>
                </label>
              </div>
            </div>
            <div class = "sminputs">
              <div class = "input full">
                <label class = "string optional" for = "user-account-code-res">Account Code*</label>
                <input class = "string optional" name = "enable-acccode" maxlength = "8" minlength = "8" id = "user-account-code-res" placeholder = "Account Code" type = "password" size = "8" />
              </div>
            </div>
            <div class = "sminputs">
              <div class = "input string optional">
                <label class = "string optional" for = "user-pw-res">Password *</label>
                <input class = "string optional first-pw" name = "enable-pw" maxlength = "255" id = "user-pw-res" onkeyup = "check_verlist_res();" placeholder = "Password" type = "password" size = "50" />
              </div>
              <div class = "input string optional">
                <label class = "string optional" for = "user-pw-repeat-res">Repeat password *</label>
                <input class = "string optional" name = "enable-pw-repeat" maxlength = "255" id = "user-pw-repeat-res" onkeyup = "check_verlist_res();" placeholder = "Repeat password" type = "password" size = "50" />
                <span class = "hide-password" id = "toggle-pw-res" onclick = "togglePassResA();">SHOW</span>
              </div>
            </div>
            <div class = "sminputs" id = "edit-brand-meal">
              <div class = "input full" style = "height:80px!important">
                <label class = "string optional" for = "vercode-role">BRAND *</label>
                <select class = "role-select" id = "brand-type-meal" name = "meal-edit-brand" style = "width:30vw; height:4vh;">
                  <option value = "" selected disabled>BRAND</option>
                  <!-- call out the brand value -->
                  ';
                    $BRANDTYPE = "SELECT * FROM meal_brand WHERE active = 1";
                    $result = $con->query($BRANDTYPE);
                    if ($result->num_rows > 0) {
                      while ($row = $result->fetch_assoc()) {
                        echo '
                        <option value = "'.$row["brand_id"].'">' .$row["brand_name"]. '</option>
                        ';
                      }
                    }
                echo
                '</select>
              </div>
            </div>
            <div class = "sminputs" id = "edit-info-meal-1">
              <div class = "input input string optional">
                <label class = "string optional" for = "meal-name-edit">Meal Name *</label>
                <input class = "string optional meal-name" name = "meal-name-edit" maxlength = "255" id = "meal-name-edit" placeholder = "Meal Name"/>
              </div>
              <div class = "input input string optional">
                <label class = "string optional" for = "meal-quantity-edit">Meal Default Quantity *</label>
                <input class = "string optional meal-quantity" type = "number" min = "1" step = "1" onkeypress = "validate(event)" name = "meal-quantity-edit" id = "meal-quantity-edit" placeholder = "00"/>
              </div>
            </div>
            <div class = "sminputs" id = "edit-info-meal-2">
              <div class = "input input string optional" style = "height:80px!important">
                <label class = "string optional" for = "meal-edit-info-brand">BRAND *</label>
                <select class = "role-select" id = "brand-type-meal-info" name = "meal-edit-info-brand" style = "width:30vw; height:4vh;">
                  <option value = "" selected disabled>BRAND</option>
                  <!-- call out the brand value -->
                  ';
                    $BRANDTYPE = "SELECT * FROM meal_brand WHERE active = 1";
                    $result = $con->query($BRANDTYPE);
                    if ($result->num_rows > 0) {
                      while ($row = $result->fetch_assoc()) {
                        echo '
                        <option value = "'.$row["brand_id"].'">' .$row["brand_name"]. '</option>
                        ';
                      }
                    }
                echo
                '</select>
              </div>
              <div class = "input input string optional" style = "height:80px!important">
                <label class = "string optional" for = "meal-price-edit">Meal Price *</label>
                <input class = "string optional meal-price" type = "number" step = "0.25" min = "1" onkeypress = "validate(event)" name = "meal-price-edit" id = "meal-price-edit" placeholder = "RM 0.00"/>
              </div>
            </div>
            <div class = "sminputs" id = "edit-info-meal-3">
              <div class = "input full" style = "height:30vh!important;">
                <label class = "string optional" for = "meal-details-edit">Meal Details*</label>
                <textarea style = "height:20vh!important;width:68vw!important" class = "string optional meal-details" type = "textarea" name = "meal-details-edit" id = "meal-details-edit" placeholder = "Meal Details" /></textarea>
              </div>
            </div>
            <div class = "simform__actions">
              <input disabled class = "sumbit" name = "submit-list-edit-meal" style = "font-family:oswald!important;" type = "submit" id = "submit-res" value = "Confirm Edit" />
              <div id = "error-message-res" style = "font-size:17px;"></div>
              <span class = "simform__actions-sidetext">By editing the brand, you are here and agree our <a class = "special" onclick = "return false;" role = "link">Terms & Conditions</a></span>
            </div>
        </div>
       </div>

Ожидаемый результат должен работать в этих условиях, но по какой-то причине он не работает, даже если инструмент разработчика из Chrome показал, что функция уже заменена.

Поведение ключевого слова "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
0
117
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Обновлено еще раз:

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

Пытаться:

function editMeal() {
    var editBrand = document.getElementById("radio-edit-meal-brand");
    var editInfo = document.getElementById("radio-edit-meal-info");

    if (editBrand.checked){
        $('.regid-chkbox').off('click');
        $('.regid-chkbox').off('change');
        $('.regid-chkbox').on('click', checkRequired);
    } else if (editInfo.checked) {
        /* Making the checkbox only one can be checked */
        $('.regid-chkbox').off('click');
        $('.regid-chkbox').off('change');
        $('.regid-chkbox').on('click', checkOne);
    }
}

Обновлено:

Я сделал быстрый макет фрагмента кода, и, похоже, он работает так, как вы хотели. Есть ли другое место, где вы изменяете обработчики событий, которые могут вызвать вашу проблему?

function checkRequired() {
    console.info('Check required');
}

function checkOne() {
    console.info('check one');
}

function editMeal() {
      var editBrand = document.getElementById("radio-edit-meal-brand");
      var editInfo = document.getElementById("radio-edit-meal-info");
      if (editBrand.checked){
          $('.regid-checkbox').off('click');
          $('.regid-checkbox').on('click', checkRequired);
      } else if (editInfo.checked) {
          /* Making the checkbox only one can be checked */
          $('.regid-checkbox').off('click');
          $('.regid-checkbox').on('click', checkOne);
      }
}

$(document).ready(() => {
  $('input[type = "radio"]').on('change', editMeal);
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <input type = "radio" id = "radio-edit-meal-brand" name = "edit-meal"><label for = "radio-edit-meal-brand">Check Required</label>
  <input type = "radio" id = "radio-edit-meal-info" name = "edit-meal"><label for = "radio-edit-meal-info">Check One</label>

  <input type = "checkbox" class = "regid-checkbox">
</form>

Оригинал:

Может быть, использовать синтаксис обработчика событий вместо установки атрибута onclick?

function editMeal() {
    var editBrand = document.getElementById("radio-edit-meal-brand");
    var editInfo = document.getElementById("radio-edit-meal-info");

    if (editBrand.checked){
        $('.regid-chkbox').off('click');
        $('.regid-chkbox').on('click', checkRequired);
    } else if (editInfo.checked) {
        /* Making the checkbox only one can be checked */
        $('.regid-chkbox').off('click');
        $('.regid-chkbox').on('click', checkOne);
    }
}

Пробовал, он все еще использует функцию checkOne().

ME MYSELF 10.04.2019 01:20

Хорошо, я понял, что этот странный сценарий произойдет после того, как функция будет заменена на checkOne(), и если вы установите флажок хотя бы один раз, в противном случае, если функция заменена на checkOne(), и вы еще не установили ни один флажок, javascript кажется не будет использовать функцию checkOne(), а только функцию checkRequired(), когда она будет заменена функцией checkRequired().

ME MYSELF 10.04.2019 01:55

@MEMYSELF Я думаю, что нашел проблему, дайте мне знать, если обновленное (Редактировать 2) изменение устранит проблему.

kht 10.04.2019 01:56

Ваш код должен работать, если вы исправите атрибут, чтобы он был .attr('onClick') вместо .attr('onclick'). Это чувствительно к регистру.

Хотя, как указал kht, может иметь смысл просто использовать вместо этого функцию on('click').

Пробовал, он все еще использует функцию checkOne(). >_<

ME MYSELF 10.04.2019 01:22

Вы добавите HTML?

Jordan Soltman 10.04.2019 01:22

Желательно родственные

Jordan Soltman 10.04.2019 01:25

Он содержит некоторый PHP-код, надеюсь, вы не возражаете. Отредактировал в посте.

ME MYSELF 10.04.2019 01:31

Можете ли вы поместить HTML после того, как он будет обработан PHP?

Jordan Soltman 10.04.2019 01:35

Это довольно долго, потому что PHP вызывает довольно много записей из базы данных. Отредактировал в посте.

ME MYSELF 10.04.2019 01:39

Неважно, это слишком длинно, вот ссылка на соответствующие коды. codeshare.io/5wxLBR

ME MYSELF 10.04.2019 01:45

Просто выполните поиск по ключевому слову «радио-редактирование-бренд-еды», после чего вы увидите соответствующие коды с вопросом.

ME MYSELF 10.04.2019 01:47

Подобно ответу, опубликованному kht, даже исходный немодифицированный опубликованный Javascript OP работает, как и ожидалось.

function checkRequired() {
  console.info('checkRequired');
  var n = $("input:checkbox:checked").length;
  var requiredCheckboxes = $(':checkbox[required]');
  var chkboxes = $(':checkbox');
  if (n < 1) {
    chkboxes.attr('required', 'required');
  } else {
    requiredCheckboxes.removeAttr('required');
  }
}


function checkOne() {
  console.info('checkOne');
  $('.regid-chkbox').on('change', function() {
    $('.regid-chkbox').not(this).prop('checked', false);
  });
}


function editMeal() {
  var editBrand = document.getElementById("radio-edit-meal-brand");
  var editInfo = document.getElementById("radio-edit-meal-info");

  if (editBrand.checked) {
    $('.regid-chkbox').removeAttr('onclick');
    $('.regid-chkbox').attr('onclick', 'checkRequired();');
  } else if (editInfo.checked) {
    /* Making the checkbox only one can be checked */
    $('.regid-chkbox').removeAttr('onclick');
    $('.regid-chkbox').attr('onclick', 'checkOne();');
  }
}

$(document).ready(() => {
  $('input[type = "radio"]').on('change', editMeal);
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <input type = "radio" id = "radio-edit-meal-brand" name = "edit-meal"><label for = "radio-edit-meal-brand">Check Required</label>
  <input type = "radio" id = "radio-edit-meal-info" name = "edit-meal"><label for = "radio-edit-meal-info">Check One</label>

  <input type = "checkbox" class = "regid-chkbox" />
</form>

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