JQuery отправляет обработчик событий только один раз

Я проверяю простую форму с помощью jQuery 1.6 с помощью обработчика события .submit(), который возвращает false, когда форма недействительна:

$(function() {
  $('#my-form').submit(function(event) {
    if (true) {  // for testing, always go through the failure path
      alert("Invalid entry");
      return false;
    } else {
      return true;
    }
  });
});

Если пользователь сделал выбор, форма была отправлена ​​должным образом. Если пользователь не сделал выбор, появится предупреждение, и форма не будет отправлена ​​(опять же, правильно). Проблема в том, что в этом случае кнопка отправки больше не работает. Другими словами, после возникновения сбоя пользователь остается в форме, но нажатие кнопки отправки ничего не делает.

Я проверил HTML (нет дубликатов идентификаторов, нет имен/идентификаторов "submit", "length" и т.д.). Форма загружается динамически, поэтому тестирование с Firebug является проблемой. Другие обработчики событий в форме работают нормально (например, я вижу предупреждения при изменении значения поля). Еще одна странность: я заменил "return false" на "event.preventDefault(); return true", но форма все еще представлена. (Я думал, что .preventDefault() остановит это.)

Любые идеи?

EDIT. Этот подход работает:

$(function() {
  $('#my-form :submit').click(function(event) {
    if (...validation stuff goes here...) {
      alert("Invalid entry");
      return false;
    } else {
      $('#my-form').submit();
    }
  });
});

Мне все равно хотелось бы узнать, что случилось с моим обработчиком обработчика original.submit().

Ответы

Ответ 1

Пожалуйста, прочитайте эту документацию в методе $(). on (это заменяет .live())

http://api.jquery.com/on/

Проверьте, не будет ли ваша форма не воссоздана каким-либо методом ajax - если это обработчик будет отброшен.

Ответ 2

Ваша форма, скорее всего, перезагружается с помощью ajax.

Так как ajax перезагружает только часть страницы, $(function() { yourCodeHere }); не запускается снова. Поэтому ваш обработчик событий onSubmit не привязан к вашей форме.

Используйте эту технику для повторного прикрепления обработчика события onSubmit к вашей форме

$('body').on('submit','#my-form', function() {
    if (true) {  // for testing, always go through the failure path
      alert("Invalid entry");
      return false;
    } else {
      return true;
    }
}

Мы могли бы перевести на человеческий язык как "для любого изменения тела , повторно присоединить событие onsubmit к элементу с id 'my-form'.

Ответ 3

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

как это...

  $('#my-form').live('submit', function(event) {
    if (true) {  // for testing, always go through the failure path
      alert("Invalid entry");
      return false;
    } else {
      return true;
    }
  });

Ответ 4

Кроме того, проверьте, нет ли другого вмешательства Javascript. Например, Web Forms (.NET) часто имеет обратные вызовы или некоторый связанный код для обработки обратных передач. Будучи новичком в .NET, это было только после того, как я отключил включенные скрипты/библиотеки (чтобы проверить и увидеть), что проблема была решена.

Ответ 5

Скорее всего, другой обработчик событий привязан в другом месте. Получите расширение chrome Visual Event, чтобы подробно просмотреть все обработчики, прикрепленные к элементу, чтобы увидеть, что блокирует его.