#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.