IE9 Двойная форма Отправить вопрос - PullRequest
14 голосов
/ 28 сентября 2011

Мне просто интересно, есть ли у кого-то какая-либо информация или отзывы о ситуации, в которой я нахожусь. В настоящее время я сталкиваюсь с проблемой "Двойной отправки формы", когда я нажимаю кнопку "Отправить" один раз, и она отправляет форму дважды.Это происходит только в IE9, но я тестировал только на Safari, Chrome (Latest), FF (Ver 5/6), IE8 и IE9.

Вот код:

<!DOCTYPE html>
<html lang="en-us" dir="ltr">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
<title>IE9 test</title>
</head>
<body>
<h1>Testing</h1>
<form method="POST" id="submit_form">
<input type="text" name="x" value="xxxx" />
<input type="text" name="y" value="yyyy" />
<button type="submit" class="btn_sign_in" id="btn_logon" onclick="this.disabled=true;document.forms[0].submit();">Submit</button>
</form>
</body>
</html>

Проблемная часть:

onclick="this.disabled=true;document.forms[0].submit();"

Код был на моем сайте целую вечность, и я впервые столкнулся с проблемой двойной отправки, так как IE9 только выпускает в этом году, и, вероятно, в эти дни большеи все больше людей используют IE9, и, следовательно, я получаю жалобы пользователей на эту проблему.

Самое сложное в том, что проблема двойного представления не всегда воспроизводима.Иногда он будет сдаваться дважды, иногда один раз.

Моя текущая работа заключается в изменении с:

<meta http-equiv="X-UA-Compatible" content="IE=edge" >

и изменении на:

<meta http-equiv="X-UA-Compatible" content="IE=8" >

Это заставляетIE9, чтобы использовать совместимость с IE8, и он будет правильно выполнять Javascript для отправки.

Я позвонил в службу поддержки Microsoft, и они утверждают, что это «проблема совместимости с Javascript», поэтому нам нужно будет настроить наш Javascript направильно ли работает наш сайт под IE9 .. (Дух!)

В любом случае, мой код:

onclick="this.disabled=true;document.forms[0].submit();"

уже неверен с самого начала?Потому что, хотя другие браузеры не жалуются, но, вероятно, это не правильно начинать с?

Я надеюсь, если кто-то также сталкивается с подобными проблемами, есть дополнительная информация или отзывы.В настоящее время, если я не изменю X-UA-Compatible на IE = 8, я могу изменить свой код на:

onclick="this.disabled=true;"

Это также решит проблему двойной отправки, но есть ли список IE9Проблемы совместимости, на которые стоит обратить внимание?

Спасибо!

Ответы [ 7 ]

20 голосов
/ 09 декабря 2011

Этот код неверен:

onclick="this.disabled=true;document.forms[0].submit();"

Javascript onclick не гарантирует, что обычная отправка также не будет выполнена.Для этого он должен вернуть false, например:

onclick="this.disabled=true;document.forms[0].submit(); return false;"

Является ли это изменение в поведении ошибкой IE9?Зависит от того, что это может зависеть от правового поведения, которое является результатом временных проблем.Это только ошибка, если стандарт DOM / Javacript гарантирует, что document.submit () является концом всего выполнения в документе.Я сомневаюсь, что это так.

5 голосов
/ 27 июля 2012

Абстрагируясь от сложности, кажется, что проблема заключается в том, что IE9 отправляет формы дважды одним нажатием кнопки , когда событие submit запускается в JavaScript.

В общем, я обнаружил, что это устраняет проблему двойной отправки IE9:

(при отказе HTML-представления IE9 при двойной передаче):

<input type="submit" />

(IE9 html исправление двойной отправки):

<input type="submit" onclick="return false; " />

Итак, в основном, я обрабатываю отправку формы в javascript (не показано) с помощью прослушивателя событий (щелчок), но возвращаю false в обработчике событий старой школы (onclick), который IE9, кажется, вызывает автоматически, даже если вы уже обработали его через прослушиватель событий.

Полагаю, вы могли бы сделать то же самое на чистом javascript:

inputElement.onclick = function(){ return false; };

, но я не проверял это.

1 голос
/ 15 декабря 2012

Когда вы используете

onclick="document.forms[0].submit();"

на кнопке отправки, напишите input type="button" вместо type="submit",

1 голос
/ 28 сентября 2011

Отчасти проблема в том, что я полагаю, что вы отправляете дважды.Вам нужно остановить первое событие, прежде чем начать второе.См. Этот пост для получения дополнительной информации об остановке событий с использованием встроенного JavaScript: Как остановить распространение событий с помощью встроенного атрибута onclick?

1 голос
/ 28 сентября 2011

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

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

Если вы не делаете ajax, просто регулярно отправляете сообщение, вы должны иметь возможность return true вместо вызова submit - по сути, скажите браузеру, что нужно идти вперед и выполнить действие по умолчанию (которое отправлено).

Или, на самом деле, убить всю submit() часть целиком, поскольку она избыточна.

1 голос
/ 28 сентября 2011

, поскольку у вас уже есть код для выполнения .submit (), почему бы не изменить тип кнопки на простую кнопку вместо отправки?

0 голосов
/ 21 марта 2014

У нас была та же проблема в IE9, и мы решили эту проблему, установив для флагов отмены события и возвращаемых значений события true и false соответственно.

...