Событие Onsubmit молча убито onchange - PullRequest
3 голосов
/ 04 ноября 2011

Событие Onsubmit может молча уничтожить событие onchange, если оно вызывается одновременно. Я предполагаю состояние гонки в двигателе JS. Протестировано в Chrome, FF3, FF6 и IE9.

Для воспроизведения необходимо изменить содержимое ввода и нажать кнопку «Отправить». Не делайте никаких дополнительных кликов между изменением ввода и нажатием кнопки подтверждения.

<div id="somediv">
    <div>one</div>
    <div>two</div>
</div>
<form method="POST" id="someform">
    <input type="text" name="input1" id="someinput" value="change me" />         
    <input type="submit" />
</form>
<script type="text/javascript">
    document.getElementById('someinput').onchange = function() {
        //some delay - DOM operations, AJAX or alert:
        document.getElementById('somediv').getElementsByTagName('div')[1].style.display = 'none';
        //or alert('123');
    }
    document.getElementById('someform').onsubmit = function() {
        alert('This event is not called');
    }
</script>

Ожидаемое поведение: событие onchange, затем onsubmit.

Если мы используем кнопку вместо отправки и вызова событий один за другим - все работает как положено.

Если в событии onchange нет операций (без задержки) - работает как положено.

Если onchange изменит цвет div (не отображается) - иногда (3/10) работает как положено, смеется.

js-гуру, пожалуйста, объясните, что, черт возьми, происходит?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

onsubmit работает как onclick, что требует последовательных событий onmousedown и onmouseup. Если ваш код показывает диалоговое окно (например, оповещение) или заменяет кнопку после события onmouseown, последующее onmouseup не запускается и, таким образом, отменяет событие. Поменять местами текстовое поле и кнопку с somediv.

3 голосов
/ 04 ноября 2011

Обратите внимание, что были проблемы с механизмом JS, не запускающим отправку при открытом диалоговом окне: Событие onchange Javascript, предотвращающее событие onsubmit в форме HTML?

Получаетсяиз-за того, что только событие alert () - или verify () - во время события onchange входа вызывает то, что событие onsubmit формы не срабатывает.Поток JS оказывается заблокированным оповещением ().Обходной путь заключается в том, чтобы не включать в вызов входного вызова onchange какие-либо alert () или verify ().

Вполне вероятно, что они обошли эту ошибку, запретив команды alert () или verify () в onchangeпозвоните, чтобы разрешить отправку формы, как ожидалось.

...