Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Помогите в замыкании универсальной функции для обработчиков событий addEventListener (https://javascript.ru/forum/events/44677-pomogite-v-zamykanii-universalnojj-funkcii-dlya-obrabotchikov-sobytijj-addeventlistener.html)

iis_ 29.01.2014 04:38

Помогите в замыкании универсальной функции для обработчиков событий addEventListener
 
Есть два поля, значения в которых нужно отвалидировать (только цифры).

Есть код:
function validateField (e, checked_field_id) {
e.stopPropagation();
e.preventDefault();

var checked_field = $('#' + checked_field_id),
container = checked_field.parent('.field-label').children('.validate-field');

if (isNaN(payment_sum.value) || payment_sum.value === "" || payment_sum.value === undefined) {
checked_field.addClass("wrong-data");
container.addClass("validate-no");
} else {
checked_field.removeClass("wrong-data");
container.removeClass("validate-no");
container.addClass("validate-yes");
}
}

document_number.addEventListener("change", function (e, id) {
return function() {
validateField(e, id);
};
}(event,'document_number')
, false);
payment_sum.addEventListener("change", function (e, id) {
return function() {
validateField(e, id);
};
}(event,'payment_sum')
, false);

Почему-то реакция для первого поля происходит с учетом верного/неверного значения во втором поле.
На значение во первом поле скрипт не реагирует.

Подробно:
1. Ввожу в первое поле цифры - реагирует, что неверно введено (подозреваю, т.к. смотрит на значение второго поля, которое еще не заполнено и равно пустой строке).
2. Ввожу во второе поле цифры - реагирует, что верно всё введено.
3. Ввожу в первое поле буквы - реагирует, что верно введено (подозреваю опять же из-за того, что во втором поле введены цифры).

iis_ 29.01.2014 04:59

Обработчики работают аналогично и с таким замыканием:

document_number.addEventListener("change", function () {
validateField(event, 'document_number');
}
, false);
payment_sum.addEventListener("change", function () {
validateField(event, 'payment_sum');
}
, false);

iis_ 29.01.2014 05:04

Туплю. Ошибку нашел.

kostyanet 29.01.2014 06:02

Ничего не надо передавать. event и this забиндятся сами собой, а тип поля внедряете в объект на этапе развешивания колбаков хардкором.

validateField = function() {

  if(this.flags & 1) // number  

  else if(this.flags & 2) // float

  else  // string by default


};

document_number.flags = 1;
document_number.addEventListener("change", validateField, false);

kostyanet 29.01.2014 06:07

Еще заметил:

Цитата:

container = checked_field.parent('.field-label').children('.validate-field');
Зачленом повторять уродские jquery'вские методы в плановом скрипте?

Вешайте колбэк _непосредственно_ на поле ввода. Или инпутам уже отменили атрибут outline?

И вообще ничего не понял чем занимается валидатор. На всякий случай: связи профтыкаются точно так же как любые други проперти.

string_field = document.getElementById();

number_field.string_field = string_field;

iis_ 30.01.2014 01:06

Цитата:

Сообщение от kostyanet (Сообщение 294650)
Ничего не надо передавать. event и this забиндятся сами собой, а тип поля внедряете в объект на этапе развешивания колбаков хардкором.

validateField = function() {

  if(this.flags & 1) // number  

  else if(this.flags & 2) // float

  else  // string by default


};

document_number.flags = 1;
document_number.addEventListener("change", validateField, false);

Да, интересная мысль. Спасибо за ответ!!!

iis_ 30.01.2014 01:09

Цитата:

Сообщение от kostyanet (Сообщение 294651)
Еще заметил:



Зачленом повторять уродские jquery'вские методы в плановом скрипте?

Вешайте колбэк _непосредственно_ на поле ввода. Или инпутам уже отменили атрибут outline?

И вообще ничего не понял чем занимается валидатор. На всякий случай: связи профтыкаются точно так же как любые други проперти.

string_field = document.getElementById();

number_field.string_field = string_field;

Обработчик на поле ввода и повешен. Цепные jquery метода временное решение для красивостей к сути вопроса не имеет занчение. Но спасибо за замечание!

Про связи не понял.


Часовой пояс GMT +3, время: 15:43.