Прерывающий обработчик прототипа, alert () и event.stop () - PullRequest
0 голосов
/ 14 апреля 2010

Вот тестовая страница, которую я использую. Эта версия работает нормально, переадресация на #success:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html><head>
<script type="text/javascript" src="prototype.js"></script>
</head><body>

<form id='form' method='POST' action='#fail'>
    <button id='button'>Oh my giddy aunt!</button>

    <script type="text/javascript">
    var fn = function() {
        $('form').action = "#success";
        $('form').submit();
    }
    $('button').observe('mousedown', fn);
    </script>
</form>

</body></html>

Если я очищаю обработчик:

var fn = function() {
}

Форма отправлена, но, конечно, на этот раз мы отправлены на #fail.

С предупреждением в обработчике:

var fn = function() {
    alert("omg!");
}

Форма не отправлена. Это ужасно любопытно.

С event.stop(), который должен предотвратить использование браузером действия по умолчанию:

var fn = function(event) {
    event.stop();
}

Мы отправлены на # fail.

Таким образом, alert() более эффективно предотвращает отправку, чем event.stop(). Что дает?

Я использую Firefox 3.6.3 и Prototype 1.6.0.3. Это поведение также появляется в Prototype 1.6.1.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

Причина, по которой вы не можете остановить отправку формы с помощью Event.stop(event), заключается в том, что наблюдаемое вами событие - это событие mousedown, а не событие form.submit (). Я предполагаю, что причина, по которой alert () предотвращает отправку, заключается в том, что вы перезаписали поведение mousedown по умолчанию для ввода type = "button"

0 голосов
/ 26 августа 2010

Кажется, причина отправки формы была в том, что я тоже не ловил клик.

0 голосов
/ 25 августа 2010

похоже, что 'e' в вашем event.stop нужно использовать с большой буквы (чтобы прочитать Event.stop ();)

...