Помогите в замыкании универсальной функции для обработчиков событий 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. Ввожу в первое поле буквы - реагирует, что верно введено (подозреваю опять же из-за того, что во втором поле введены цифры). |
Обработчики работают аналогично и с таким замыканием:
document_number.addEventListener("change", function () { validateField(event, 'document_number'); } , false); payment_sum.addEventListener("change", function () { validateField(event, 'payment_sum'); } , false); |
Туплю. Ошибку нашел.
|
Ничего не надо передавать. 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); |
Еще заметил:
Цитата:
Вешайте колбэк _непосредственно_ на поле ввода. Или инпутам уже отменили атрибут outline? И вообще ничего не понял чем занимается валидатор. На всякий случай: связи профтыкаются точно так же как любые други проперти. string_field = document.getElementById(); number_field.string_field = string_field; |
Цитата:
|
Цитата:
Про связи не понял. |
Часовой пояс GMT +3, время: 14:48. |