Показать сообщение отдельно
  #3 (permalink)  
Старый 19.12.2009, 18:12
Аспирант
Отправить личное сообщение для Yazla Посмотреть профиль Найти все сообщения от Yazla
 
Регистрация: 01.11.2009
Сообщений: 31

Сообщение от TheRoSS Посмотреть сообщение
Добрый всем день.
Нужна помощь в решении следующей задачи:

Есть форма, на отдельные поля которой через addEventListener повешены валидаторы-обработчики "onchange". Причём на каких-то полях обработчики висят, на каких-то нет. Перед отправкой формы требуется дополнительно пройтись по тем элементам, на которых обработчики висят, вызвав их программно.

Я это решаю следующим образом:
В обработчике события отправки формы создаю ивент "onchange" и отправляю его по очереди всем элементам формы. Если на элементе висит валидатор, он будет вызван и возвратит результат проверки.

var h_onsubmit = function(e) {
    var e_onchange = document.createEvent("Event");
    e_onchange.initEvent("change", false, true);

    var res = true;
    var form = e.target.form;
    for(var j = 0; j < form.elements.length; j++) {
        var element = form.elements[j];
        var ret = element.dispatchEvent(e_onchange);
        if(!ret) {
            res = false;
            break;
        }
    }
    if(!res) {
        e.preventDefault();
        e.stopPropagation();
    }
    return res;
}


Работает на ура, если бы не одно "но"...
В форме есть элемент select с набором опций, без валидатора, но со своим обработчиком "onchange".
Так вот, когда такому элементу из обработчика формы приходит событие по dispatchEvent, он сбрасывает своё текущее выбранное значение, что совсем не есть здорово

То есть если у меня форма задана так:
<form>
  <select id='select_id' size='1'>
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
  </select>
  <input id='element_with_validator'/>
  <input type='submit' id='submit_id' value='Submit'/>
</form>


и на сранице была выбрана, например, опция селекта "4", то после вызова
document.getElementById("select_id").dispatchEvent(e_onchange);

в h_onsubmit значение селекта сбросится с "4" в "1".

Код обработчика "onchange" для селекта следующий:
h_select_onchange = function() {
    var value = document.getElementById("select_id").value;
    // ...
};


Как можно решить мою задачу, чтобы опция селекта не сбрасывалась?
Обработчик h_select_onchange желательно не трогать.

P.S. Только что подумал, что в качестве решения моей задачи можно элементам с валидаторами устанавливать какую-нибудь специфическую переменную, в обработчике h_onsubmit проверять у элемента её наличие и отправлять программный "onchange" только элементам с валидаторами. Тогда селекту событие не придёт и сброса не произойдёт. Но хотелось бы всё-таки разобраться, почему происходит сброс и как этого избежать.

P.P.S. Прошу прощения. Ошибка найдена. Была у меня в коде. Это обработчик другого элемента сбрасывал значение. Тему можно удалять.
Мда... утром голова явно работает лучше
Если честно, то подход немножко неправельный, мягко говоря. Имхо.
Почему бы тебе просто не зделать метод validate у каждого елемента и вызывать его тогда когда надо?!.
Ответить с цитированием