#javascript #jquery #bind #addeventlistener
#javascript #jquery #привязка #addeventlistener
Вопрос:
Я хочу получать значение проверенного радиовхода при каждом событии размытия, щелчка или фокусировки радиовходов.
function getCheckedVal(){
var checked = $('#education_number input:radio:checked')
console.log(checked.val());
};
Это не работает:
window.onload = function(){
var radio = $('#education_number input:radio');
for(var i=0; i<radio.length; i ){
radio[i].addEventListener('blur', function(){getCheckedVal()});
};
}
И это вызывает исключение:
window.onload = function(){
var radio = $('#education_number input:radio');
for(var i=0; i<radio.length; i ){
radio[i].bind('blur', getCheckedVal());
};
}
Ошибка неперехваченного типа: объект #HTMLInputElement не имеет метода ‘bind’
Как это сделать?
Ответ №1:
Во втором примере вы вызываете getCheckedVal
, а затем передаете возвращаемое значение в bind
. Вы не хотите, чтобы ()
они после getCheckedVal
:
window.onload = function(){
var radio = $('#education_number input:radio');
for(var i=0; i<radio.length; i ){
$(radio[i]).bind('blur', getCheckedVal);
}
}
(Примечание, которое я добавил $(...)
radio[i]
, потому radio[i]
что это необработанный элемент DOM, а не объект jQuery.)
Но вы можете значительно упростить этот код:
window.onload = function(){
$('#education_number input:radio').blur(getCheckedVal);
}
jQuery очень основан на множествах. Вы можете работать со всем согласованным набором элементов, а не перебирать набор самостоятельно.
Однако следует учитывать две вещи:
- Вам действительно нужна только эта информация о размытии? Не включен
change
, например? - Вы действительно хотите дождаться
window#load
события, чтобы подключить ваши обработчики событий? Это очень поздно в процессе загрузки страницы, после завершения загрузки всех ваших изображений и тому подобного. Вместо того, чтобы использоватьwindow#load
, рассмотрите возможность либо размещения вашего скрипта в конце, непосредственно перед закрывающим</body>
тегом, либо использованияready
функции jQuery.
Ответ №2:
bind
это метод jQuery, но все, что у вас есть на данном этапе, это HTMLInputElement
— к счастью, вы можете передать элемент в jQuery и получить доступ ко всем его функциям:
Изменить:
radio[i].bind('blur', getCheckedVal());
Для
$(radio[i]).bind('blur', getCheckedVal);
Вам также необходимо удалить круглые скобки из getCheckedVal
— передача getCheckedVal() в bind
вызовет немедленную оценку функции, и только возвращаемое значение будет привязано к вашему событию. Вместо этого вам нужно передать ссылку на функцию bind
.
Ответ №3:
Это просто:
$('#education_number input:radio').bind('blur', getCheckedVal);
Обратите внимание на пропущенное ()
после getCheckedVal
. Вы должны передавать ссылку на функцию, а не вызывать функцию.
Я рекомендую прочитать одно из руководств по jQuery, чтобы узнать об основах.
Одним из больших преимуществ jQuery является то, что он позволяет легко выполнять действия с коллекцией HTML-элементов. $('selector')
всегда возвращает объект jQuery, чтобы вы могли воспользоваться этим. Если бы у вас был чистый массив элементов DOM, тогда да, вам пришлось бы перебирать их и привязывать обработчик событий по отдельности.