Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.01.2014, 04:38
Интересующийся
Отправить личное сообщение для iis_ Посмотреть профиль Найти все сообщения от iis_
 
Регистрация: 29.01.2014
Сообщений: 14

Помогите в замыкании универсальной функции для обработчиков событий 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. Ввожу в первое поле буквы - реагирует, что верно введено (подозреваю опять же из-за того, что во втором поле введены цифры).
Ответить с цитированием
  #2 (permalink)  
Старый 29.01.2014, 04:59
Интересующийся
Отправить личное сообщение для iis_ Посмотреть профиль Найти все сообщения от iis_
 
Регистрация: 29.01.2014
Сообщений: 14

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

document_number.addEventListener("change", function () {
validateField(event, 'document_number');
}
, false);
payment_sum.addEventListener("change", function () {
validateField(event, 'payment_sum');
}
, false);
Ответить с цитированием
  #3 (permalink)  
Старый 29.01.2014, 05:04
Интересующийся
Отправить личное сообщение для iis_ Посмотреть профиль Найти все сообщения от iis_
 
Регистрация: 29.01.2014
Сообщений: 14

Туплю. Ошибку нашел.
Ответить с цитированием
  #4 (permalink)  
Старый 29.01.2014, 06:02
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Ничего не надо передавать. 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);
Ответить с цитированием
  #5 (permalink)  
Старый 29.01.2014, 06:07
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Еще заметил:

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

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

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

string_field = document.getElementById();

number_field.string_field = string_field;

Последний раз редактировалось kostyanet, 29.01.2014 в 06:17.
Ответить с цитированием
  #6 (permalink)  
Старый 30.01.2014, 01:06
Интересующийся
Отправить личное сообщение для iis_ Посмотреть профиль Найти все сообщения от iis_
 
Регистрация: 29.01.2014
Сообщений: 14

Сообщение от kostyanet Посмотреть сообщение
Ничего не надо передавать. 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);
Да, интересная мысль. Спасибо за ответ!!!
Ответить с цитированием
  #7 (permalink)  
Старый 30.01.2014, 01:09
Интересующийся
Отправить личное сообщение для iis_ Посмотреть профиль Найти все сообщения от iis_
 
Регистрация: 29.01.2014
Сообщений: 14

Сообщение от kostyanet Посмотреть сообщение
Еще заметил:



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

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

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

string_field = document.getElementById();

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

Про связи не понял.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать eval в контексте другой функции для доступа к ее локальным переменным? Почемучкин Общие вопросы Javascript 8 29.10.2012 22:31
Асинхронное программирование - реализация функции для "синхронизации" function Общие вопросы Javascript 8 22.06.2012 13:52
Применение toFixed для определенной функции. djonA Общие вопросы Javascript 3 03.05.2012 15:49
Удалению метаданных в JPEG lorents Библиотеки/Тулкиты/Фреймворки 2 22.04.2012 21:02
Нужна помощь для реализации функции d'n'd vaal Элементы интерфейса 4 09.06.2010 17:27