Показать сообщение отдельно
  #1 (permalink)  
Старый 18.12.2009, 14:05
Новичок на форуме
Отправить личное сообщение для TheRoSS Посмотреть профиль Найти все сообщения от TheRoSS
 
Регистрация: 18.12.2009
Сообщений: 3

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

Есть форма, на отдельные поля которой через 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. Прошу прощения. Ошибка найдена. Была у меня в коде. Это обработчик другого элемента сбрасывал значение. Тему можно удалять.
Мда... утром голова явно работает лучше

Последний раз редактировалось TheRoSS, 18.12.2009 в 14:32. Причина: Разобрался
Ответить с цитированием