Ошибка ввода в IE9

Мне просто интересно, есть ли у кого-нибудь информация или отзывы о ситуации, в которой я нахожусь. В настоящее время я сталкиваюсь с проблемой "Double Form Submit", когда я один раз нажимаю кнопку "Отправить", и она отправляет форму дважды. Это происходит только в IE9, но я тестировал только Safari, Chrome (последний), 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.. (Duh!)

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

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

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

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

onclick="this.disabled=true;"

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

Спасибо!

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

В общем, я нашел, что это исправляет двойной IE9 проблема подачи формы:

(с ошибкой IE9 с двойным представлением HTML):

<input type="submit" />

(исправление IE9 html double):

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

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

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

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

но я не тестировал его.

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

у нас была та же проблема в IE9, и мы решили проблему, установив cancelBubble и returnValue флаги события в true и false соответственно.