Порядок выполнения обработчиков событий jquery относительно (встроенных) обработчиков событий javascript - PullRequest
4 голосов
/ 11 августа 2010

Исправьте меня, если я ошибаюсь, но мне кажется, что обработка событий jQuery полностью отделена от обработки событий javascript. Я знаю, что порядок выполнения самих обработчиков событий jQuery и javascript не определен, но можно ли сделать предположение, что все обработчики javascript будут выполняться раньше, чем jQuery?

В примере , приведенном в ответе на этот вопрос , который, кажется, имеет место.

Кроме того, есть ли предпочтения при выполнении встроенных обработчиков событий JavaScript по сравнению с привязанными?

Для пояснения, я прошу все это, потому что я столкнулся с проблемой, когда у меня есть встроенный обработчик события onClick элемента <a>, который вызывает метод submit() вложенной формы. Непосредственно перед отправкой формы я хочу динамически добавить некоторые скрытые inputs в форму. Прямо сейчас я делаю это:

        var preSubmit = function preSubmit()
        {
            // add inputs
        }

        var oldSubmit = form.submit;
        form.submit = function newSubmit()
        {
            preSubmit();
            oldSubmit.call(form, arguments);
        }


Но мне действительно интересно, есть ли более элегантный способ, и мне действительно нужно кое-что прояснить.

Ответы [ 3 ]

4 голосов
/ 11 августа 2010

Я не уверен насчет спецификаций, но я предполагаю, что обработчики событий просто стоят в очереди в том же порядке, в котором вы их определяете.Встроенные обработчики определены прямо в узле DOM, так что больше ничего не может быть раньше.

Самый элегантный способ - написать all ваш JavaScript в ненавязчивой форме, т.е. отделить его от HTML(кажется, вы смешиваете стили программирования).Как бы то ни было, вы можете перехватить отправку формы, прикрепив обработчик onsubmit к форме:

$("form").submit(function(){
    // Do stuff
    return true;
});

Обновление

Я провел некоторое тестирование, и кажется, что обработчик отправки присоединен кФорма через jQuery не запускается, когда вы вызываете метод submit () в DOM где-то еще.Вот обходной путь:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript"><!--
jQuery(function($){
    $("a").each(function(i, a){
        a.onclick = function(){ // Remove previous handlers
            alert("I will no longer submit the form");
            $(this).closest("form").submit();
        };
    });
    $("form").submit(function(){
        alert("I'll take care myself, thank you");
        $("input[name=foo]").val("Another value");
        return true;
    });
});
//--></script>
</head>
<body>


<form action="" method="get">
    <input type="text" name="foo" value="Default value">
    <a href="javascript:;" onclick="document.forms[0].submit()">Submit form</a>
</form>

</body>
</html>
1 голос
/ 11 августа 2010

Существует два решения: обернуть функцию отправки формы или обработчик ссылки onClick. Я не знаю, что jQuery предлагает API "обернуть существующую функцию".

Что касается порядка выполнения, то jQuery - это JavaScript, поэтому обработчики запускаются при их запуске браузером. Это не специфично для jQuery, за исключением случаев, когда API заявляет, что что-то выполняется асинхронно.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...