Почему этот обработчик событий jquery подключен не так, как ожидалось?

#javascript #jquery

#javascript #jquery

Вопрос:

У меня есть список переключателей с именем «ReportTypeId». Для каждой radio кнопки я хочу отображать оповещение с ее значением при нажатии.

Я написал следующий jQuery, который выводит все 5 переключателей в список с именем «ReportTypeId»:

 $("[name='ReportTypeId']").toArray().forEach(function(reportTypeId){
    reportTypeId.click(function(reportTypeId){
       alert(reportTypeId.value);
    });
});
  

Когда я устанавливаю точку останова и проверяю переменные во время загрузки, переменные выглядят так, как ожидалось. Однако, когда я нажимаю на переключатель после загрузки страницы, ничего не происходит. Что я делаю неправильно в приведенном выше jquery?

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

1. Ваш код в $(document).ready() ?

2. Кстати, вместо .toArray().forEach() вы можете просто использовать встроенный jQuery .each() .

3. reportTypeId это элемент DOM, а не объект jQuery. Вам нужно $(reportTypeId).click .

4. Вы должны получать сообщение об ошибке, в котором говорится, что у него нет .click() метода.

Ответ №1:

Вы должны использовать this для получения текущего элемента внутри вашей функции обратного вызова в .click() . Аргумент, переданный функции, на самом деле является объектом события click.

 $("[name='ReportTypeId']").toArray().forEach(function(reportTypeId){
    reportTypeId.click(function(event){
        alert(this.value);
    });
});
  

Вы можете значительно упростить свой код, просто вызвав .click() коллекцию jQuery. Прослушиватель событий будет автоматически прикреплен ко всем элементам коллекции.

 $("[name='ReportTypeId']").click(function(event){
    alert(this.value);
});
  

Ответ №2:

reportTypeId.value вероятно, не определено и, следовательно, предупреждение отображаться не будет.

Это не определено, потому что по умолчанию первым аргументом в функции обратного вызова события click является event объект, а не сам переключатель. Попробуйте оповещать this.value вместо reportTypeId.value .

Ответ №3:

Попробуйте это:

 $("[name='ReportTypeId']").click(function(){
    alert(this.value);
});
  

используйте это внутри обратного вызова функции, и вам не придется использовать toArray()

Ответ №4:

Вы могли бы прикрепить событие click ко всем кнопкам одновременно, потому что у них одинаковое имя ReportTypeId , вам не нужно использовать .forEach() и цикл … затем, чтобы получить значение, используйте .val() :

 $("body").on('click', '[name='ReportTypeId']', function(){
     alert($(this).val());
});
  

Надеюсь, это поможет.

 $("body").on('click', '[name="ReportTypeId"]', function(){
     alert($(this).val());
});  
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='radio' name='ReportTypeId' value='radio_1' checked/> Radio 1
<br>
<input type='radio' name='ReportTypeId' value='radio_2'/> Radio 2
<br>
<input type='radio' name='ReportTypeId' value='radio_3'/> Radio 3
<br>
<input type='radio' name='ReportTypeId' value='radio_4'/> Radio 4  

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

1. Почему использование анонимной функции внутри циклов является плохой практикой? .each() это не цикл.

2. @ZakariaAcharki Эта проблема связана с for циклами, а не .forEach() циклами.

3. Но у вас не возникает проблем с переменными замыкания, как при использовании for цикла. Каждая итерация имеет свою собственную переменную environment.