Можно ли связать функцию submit () перед любой существующей onsubmit / submit? - PullRequest
7 голосов
/ 12 января 2010

У меня есть форма с атрибутом onsubmit. Мне нужно связать новое событие отправки, и мне нужно, чтобы это событие было выполнено перед любыми существующими функциями отправки.

Следующий код демонстрирует проблему.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Test</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
      jQuery(function($) {
        // a plugin
        $('form').submit(function() {
          alert("Second");
        });
        // an other plugin
        $('form').submit(function() {
          alert("Third");
        });

        // this event must always be executed as first event
        $('form').submit(function() {
          alert("Always First");
        });
      });
    </script>
  </head>
  <body>
    <form onsubmit="javascript:alert('Fourth');">
      <p>
        <input type="submit">
      </p>
    </form>
  </body>
</html>

Если вы выполните сценарий, сначала вы получите «Второй», затем «Первый».

Можно ли связать новое событие отправки и указать, должна ли функция вызываться перед любым существующим событием?

Ограничения:

  • Существующие события должны быть сохранены.
  • Я не могу удалить существующие события, потому что содержимое атрибута onsubmit содержит довольно сложную логику, написанную Rails
  • (ДОБАВЛЕНО): событие всегда должно выполняться перед любым существующим событием onsubmit и уже связанными событиями (возможно, связанными с другим плагином)

Есть идеи?

Ответы [ 3 ]

14 голосов
/ 12 января 2010

Сначала запускается встроенное событие submit, вы можете получить ссылку на него, обнулить атрибут onsubmit в элементе form, а затем связать ваше новое событие submit, оно выполнит ваше old отправить обработчик:

  jQuery(function($) {
    var form = $('form'), oldSubmit = form[0].onsubmit;
    form[0].onsubmit = null;

    $('form').submit(function() {
      alert("First");
      oldSubmit.call(this); // preserve the context
    });
  });

Обратите внимание, что я использую метод call для вызова вашего старого обработчика отправки, чтобы сохранить ключевое слово this внутри этой функции, это будет сам элемент form.

Если ваш оригинальный обработчик onsubmit имеет какое-либо поведение для проверки, вы можете получить его возвращаемое значение по var ret = oldSubmit.call(this);

Проверьте приведенный выше пример здесь .

3 голосов
/ 12 января 2010

Возьмите существующий обработчик submit и сохраните его в переменной.

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

Пример:

  jQuery(function($) {

    $('form').submit(function() {
         var first = this.onsubmit;
         //...
         first.call( this );
    });
  });

... или что-то в этом роде. : =)

0 голосов
/ 29 июля 2010

Я думаю, этот - лучший способ, если он работает, как должен, потому что ОП принял его.

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