2010-09-24 4 views
3

У меня проблема с IE (8, не проверены на 7). У меня есть очень простая ситуация: создать элемент формыКнопка отправки не запускает событие jQuery bind'ed submit на IE

var formNode = $('<form>'); 

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

formNode.bind('submit', function (ev) { 
    alert('submit of form!'); 
    // do lots of stuff.... 
} 

Это работает с Safari на моем Mac (й, я Mac парень), и на Safari и Firefox на Windows, но предупреждение не вызывается, когда я нажимаю кнопку отправки при использовании IE 8. Вместо этого браузер пытается отправить запрос GET для/(я не установил ни метод, ни действие для формы - возможно, это необходимо?).

Любые идеи были бы очень благодарны, так как я делаю изменения с ошибкой для отладки.

+0

* «(Я не установил ни метод, ни действие для формы - возможно, это необходимо?)» * Вы пробовали? –

+0

Какую версию jQuery вы используете? – ahsteele

+0

Я вытаскиваю jQuery 1.4.2.min из CDN от Google. В отдельности у меня есть простой код, который генерирует форму, и я прикрепляю обработчик отправки, и все работает нормально. В контексте моего приложения, которое много встраивается в DOM, простой тестовый пример терпит неудачу, поэтому есть некоторое взаимодействие ... Я пытаюсь изолировать ... – Zhami

ответ

2

Существует множество проблем с прослушиванием событий из элементов формы с помощью jQuery в Internet Explorer. На форуме jQuery есть серия комментариев: IE-specific issues with live ('submit'). Конечно, я знаю, что вы используете bind, а не live, но многие из описанных проблем связаны с попытками использования обоих.

Я прокомментировал ваш ответ, спрашивая, какую версию jQuery вы используете. Если вы еще этого не сделали и можете сделать это, я бы обновился до последней версии.

Несколько коды решения:

Свяжите представить обработчик каждый ребенок из тела элемента
адаптирован из synertech1 ответа в вышеупомянутом JQuery обсуждения на форуме.

var submitHandler = function() { ... }; 

$("body").children().each(function() { 
     $("form", this).bind("submit", submitHandler); 
}) 

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

$('form > input[type*="submit"]').bind('click', function(event) { 
    var form = $(this).parent; 
    form.submit(); 
    event.preventDefault(); 
}); 
+0

Спасибо за ссылку и предложения. Я пытаюсь сузить проблему, потому что то, что я нашел, заключается в том, что если я создаю минимальный HTML-файл с формой и кнопкой отправки и привяжу к нему, IE работает. Поэтому я потратил несколько часов на создание формы и кнопки в своем приложении, нахожу, где она работает ... и где это не так, и я пытаюсь оттолкнуть на разделительной линии, которая может пролить свет на то, почему она работает в в некоторых случаях, а не в других. Надеюсь, я не бесплодно крутил свои колеса. – Zhami

+0

@ Zhami В ваших тестах, к чему вы привязываете событие, кнопку или форму? Предложение ** привязать обработчик отправки к каждому дочернему элементу тела ** существует, потому что есть гипотеза о том, что события, связанные с событиями формы на уровне документа, имеют склонность к потере IE. Я привяжу их к телу и посмотрю, что произойдет. – ahsteele

+0

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

1

Вы не сказали, какой уровень HTML вы используете, но FWIW, action является обязательным атрибутом на form элементах в HTML4. Поэтому было бы неудивительно, если бы браузер не вел себя странно без него. (В HTML5, то validator говорит, что это не требуется больше, вероятно, потому, что некоторые из этих вещей теперь разрешены на самих кнопках отправки.)

+0

HTML 4. Я попытался установить action = "" на создание элемента, и теперь форма даже не отображается в IE 8 (работает на Mac Safari). Будет продолжать попытки ... – Zhami

+0

'action =" "' также недействителен. Попробуйте 'action =" # "'. Но если форма даже не отображалась, честно говоря, я подозреваю, что в других проблемах больше. –

+0

Любопытно: если я попытаюсь установить действие = "#" в создании элемента jQuery, элемент не будет создан и форма не будет отображаться; code: formNode = $ ('

') .... однако, если я устанавливаю действие на .attr ('action', '#'), то форма отображает. Но все же привязка отправки не работает. – Zhami

0

Вы не забывать return false (или event.preventDefault()) из обработчика событий? Если нет, форма будет продолжать подаваться, эффективно перемещая вас по URL-адресу action или по тому же адресу, что и текущий документ, если его нет. Хотя на самом деле должно быть action как для действительности HTML, так и для обеспечения рабочего решения без JavaScript, где это возможно (прогрессивное улучшение и все такое).

Если вы сделать есть return false, убедитесь, что никакое JavaScript ошибки не происходит в коде обработчика, что прервать функцию, прежде чем он попадет в return false. Включите отчет об ошибках JS в настройках Интернета и/или используйте отладчик.

+0

Хотелось бы, чтобы у меня возникла проблема, связанная с необходимостью прекратить распространение :-) Но проблема в том, что обработчик отправки даже не выполняется. Да, код возвращает false. Прямо сейчас для тестирования я выдаю предупреждение при записи - чего не происходит - и затем возвращает false. ... Что касается действия ... мой прецедент - это приложение для браузера в браузере - ничего не может сделать сервер, поскольку все функции для действия этой формы происходят в обработчике. Это работает для всех браузеров, которые я пробовал, кроме IE. Мое приложение никоим образом не является «прогрессивным» - если Javascript не работает, то это приложение DOA. – Zhami

Смежные вопросы