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 соответственно.