Обходной путь для событий IE, которые не отправляются пузырями

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

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


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

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

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

11.12.2008 21:41:33
Я использую Prototype (и собираюсь использовать LowPro, если я смогу заставить это работать), поэтому решения, требующие этого, подойдут. Я, вероятно, могу портировать любые решения, которые также требуют jQuery.
Matt Kantor 11.12.2008 21:46:28
Я сделал много обработки форм с Prototype. Не могли бы вы немного подробнее описать специфику вашей проблемы? (отредактируйте свой вопрос).
Diodeus - James MacFarlane 11.12.2008 21:47:17
Кроме того, я мог бы жить с решением, которое не работает в IE6.
Matt Kantor 11.12.2008 22:02:13
6 ОТВЕТОВ

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

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

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

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

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

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

1
12.12.2008 15:25:51

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

3
12.12.2008 18:06:03
Я бы сделал что-то вроде этого: <form onsubmit = "$ (this) .fire ('form: submit'); вернул false;"> Я искал совершенно ненавязчивое решение, но если я не могу его найти тогда это, вероятно, то, что я сделаю.
Matt Kantor 12.12.2008 19:09:30
Вы можете сделать это незаметно, $ ("# form-id"). Submit (function () {return false;}); $ ("# form-submit-button"). click (function () {$ (this) .parents ("form"). submit (); // запускает событие submit return false;}); Изучите использование плагина формы jquery: malsup.com/jquery/form
roborourke 15.12.2008 09:53:59
Это не будет работать для динамически создаваемых элементов, что является одной из основных причин, по которой я это делаю. Кроме того, как насчет отправки формы, нажав Enter или с Javascript? Это должно быть без регресса.
Matt Kantor 16.12.2008 01:05:49
Кроме того, я почти уверен, что событие было вызвано $ (this) .parents ("form"). Submit (); тоже не будет пузыриться (если только jQuery не работает внутри).
Matt Kantor 16.12.2008 01:08:22

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

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

1
31.07.2012 15:08:28

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

Проверять, выписываться

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

2
30.06.2010 01:05:52

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

Исходный код NWEvents находится на GitHub .

1
6.11.2010 20:02:41