Обходной путь для событий IE, которые не отправляются пузырями - PullRequest
4 голосов
/ 12 декабря 2008

Я работаю над большим веб-приложением с большим количеством AJAX, чья обработка событий вышла из-под контроля. Я пытаюсь настроить делегирование события систему для управления всем этим, но мне интересно, есть ли обходной путь для отправления не всплывающей формы IE (есть много форм, которые вставляются / обновляются через AJAX). Лучшее, что я придумал, - это выполнение небольшого количества javascript для повторной загрузки обработчиков отправки каждый раз, когда я получаю ответ от вызова AJAX, но это кажется уродливым. Есть идеи?

Кроме того, у кого-нибудь есть хороший справочник, для которого события не распространяются правильно в разных версиях IE? У меня были проблемы с поиском хорошей информации (хотя у этого другого вопроса есть немного).


Реальный пример с сайта: на месте редактирование некоторого пользовательского контента. Делая делегирование события, я бы попросил тело прослушать события отправки, а затем посмотреть, какой элемент вызвал событие, и обработать его соответствующим образом. Поскольку отправка не всплывает в IE, это не сработает. Решение за 5 долларов состояло бы в том, чтобы делегировать события для всех других событий и обрабатывать отправку, используя что-то вроде этого в Prototype:

// call this onload:
$$('form').invoke('observe', 'submit', function(event) { /*delegate*/ });

Но это не сработает для форм, которые создаются динамически (я должен был бы каждый раз повторять создание экземпляра обработчика, как упомянуто выше), и все это было бы лучше, если бы я мог "сделать" форму, отправляющую пузырь в IE и просто делайте обычное делегирование везде (без особых случаев и т. д.).

Ответы [ 6 ]

3 голосов
/ 12 декабря 2008

Можете ли вы заставить формы возвращать false и просто искать событие CLICK на кнопках отправки вместо события отправки формы? Затем отправляйте формы программно через ваши AJAX-звонки.

2 голосов
/ 30 июня 2010

Rails 3 rails.js решил эту проблему, обнаружив, поддерживает ли браузер всплывающее окно отправки события, если нет, то связывает метод onSubmit с обработчиком первого события фокуса формы. Довольно аккуратно.

Выезд

http://github.com/rails/rails/commit/f61d923d284062b4e4864d81c603157020198d06

1 голос
/ 06 ноября 2010

Мэтт Кантор, Я настоятельно рекомендую вам взглянуть на NWEvents. Как вы сказали, это на самом деле вызывает пузыри в IE и делает «делегирование событий» доступным для любого другого события кросс-браузерным способом.

Исходный код NWEvents включен GitHub .

1 голос
/ 21 января 2009

Другой вариант для рассмотрения может быть reglib .

Последняя версия транка имеет реализацию, которая позволяет делегирование отправки

1 голос
/ 12 декабря 2008

Один из способов, который вы можете попробовать, - это иметь только две формы: «рабочую» форму и скрытую «отправляющую» форму и иметь только эти две формы на странице.

«Рабочая» форма - это то, что отображается пользователю - это просто контейнер и может содержать элементы из различных форм. Различные кнопки в форме на самом деле не отправляются, но вызывают обработчик формы / процедуру проверки в JavaScript.

Обработчик / процедура проверки динамически устанавливает действие формы «отправки» и динамически добавляет необходимые элементы в эту форму, чтобы ее можно было отправить.

Таким образом, вы никогда не добавляете и не удаляете из самих тегов, а просто изменяете внешний вид и поведение двух основных, таким образом избегая всех неприятных манипуляций с событиями.

0 голосов
/ 12 декабря 2008

Опции, которые я рассмотрел до сих пор:

  • Дрянное решение, которое я разместил в самом вопросе.
  • Inline Cop-out - Всегда гарантированно работает и имеет относительно низкие накладные расходы, но невероятно навязчиво. Мне пришлось бы адаптировать эту идею для работы с Prototype (что на самом деле не было бы сложно, я, вероятно, просто написал бы функцию Event.fix (событие), которая останавливает событие, а затем повторно запускает его, чтобы распространять его по-своему ).
  • NWEvents - У меня не было шанса поиграться с этим слишком много, но якобы это заставляет все события пузыриться. Глядя на источник, я не уверен, что это действительно работает для динамически создаваемых элементов. Мне придется еще поиграть с этим.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...