IE9 Двойная форма Отправить вопрос

Мне просто интересно, есть ли у кого-то какая-либо информация или отзывы о ситуации, в которой я нахожусь. В настоящее время я сталкиваюсь с проблемой "Двойной отправки формы", когда я нажимаю кнопку "Отправить" один раз, и она отправляет форму дважды. Это происходит только в 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 ответов

Решение

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

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() является концом всего выполнения в документе. Я сомневаюсь, что это так.

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

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

(при отсутствии двойной передачи в IE9):

<input type="submit" />

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

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

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

Я предполагаю, что вы могли бы сделать то же самое в чистом JavaScript:

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам