У меня есть форма, которая требует немного времени для обработки сервера. Я должен убедиться, что пользователь ждет и не пытается повторно отправить форму, нажав кнопку еще раз. Я попытался использовать следующий код JQuery:
<script type="text/javascript">
$(document).ready(function() {
$("form#my_form").submit(function() {
$('input').attr('disabled', 'disabled');
$('a').attr('disabled', 'disabled');
return true;
});
});
</script>
Когда я пытаюсь сделать это в Firefox, все отключается, но форма не отправляется ни с какими данными POST, которые она должна включать. Я не могу использовать jQuery для отправки формы, потому что мне нужно, чтобы кнопка была отправлена вместе с формой, поскольку есть несколько кнопок отправки, и я определяю, какое из них использовалось, какое значение включено в POST. Мне нужно отправить форму как обычно, и мне нужно отключить все сразу после того, как это произойдет.
Спасибо!
Ответы:
Обновление в 2018 году : я только что получил несколько баллов за этот старый ответ и просто хотел добавить, что лучшим решением было бы сделать операцию идемпотентной, чтобы дублирующие представления были безвредными.
Например, если форма создает заказ, поместите уникальный идентификатор в форму. Когда сервер впервые видит запрос на создание заказа с таким идентификатором, он должен создать его и ответить «успех». Последующие представления также должны отвечать «успех» (в случае, если клиент не получил первый ответ), но не должны ничего менять.
Дубликаты должны быть обнаружены с помощью проверки уникальности в базе данных, чтобы предотвратить состояние гонки.
Я думаю, что ваша проблема заключается в этой строке:
Вы отключаете ВСЕ входные данные, в том числе, я полагаю, те, чьи данные должна предоставить форма.
Чтобы отключить только кнопку отправки, вы можете сделать это:
Тем не менее, я не думаю, что IE отправит форму, если даже эти кнопки отключены. Я бы предложил другой подход.
Плагин JQuery, чтобы решить это
Мы только что решили эту проблему с помощью следующего кода. Хитрость здесь в том, чтобы с помощью jQuery
data()
пометить форму как уже отправленную или нет. Таким образом, нам не нужно связываться с кнопками отправки, что выводит IE из себя.Используйте это так:
Если есть формы AJAX, которые нужно разрешить отправлять несколько раз за загрузку страницы, вы можете дать им класс, указывающий на это, а затем исключить их из вашего селектора следующим образом:
источник
$(this)
avar that = $(this)
?$form
Хотя я использовал - «форма», потому что он более описательный, и ведущий,$
потому что по моему соглашению это означает, что это объект jQuery.Сроки подхода неверны - как узнать, сколько времени займет действие в браузере клиента?
Как это сделать
Когда форма отправлена, она отключит все кнопки отправки внутри.
Помните, в Firefox, когда вы отключаете кнопку, это состояние будет запомнено, когда вы вернетесь в историю. Чтобы предотвратить это, вы должны включить кнопки при загрузке страницы, например.
источник
Я думаю, что ответ Натана Лонга - это путь. Для меня я использую проверку на стороне клиента, поэтому я просто добавил условие, чтобы форма была действительной.
РЕДАКТИРОВАТЬ : Если это не добавлено, пользователь никогда не сможет отправить форму, если проверка на стороне клиента обнаружит ошибку.
источник
event.timeStamp
не работает в Firefox. Возвращение false не является стандартным, вам следует позвонитьevent.preventDefault()
. И пока мы это делаем, всегда используйте фигурные скобки с управляющей конструкцией .Подводя итог всем предыдущим ответам, вот плагин, который делает работу и работает кросс-браузер.
Чтобы обратиться к Kern3l, метод синхронизации работает для меня просто потому, что мы пытаемся остановить двойной щелчок по кнопке отправки. Если у вас очень большое время отклика на отправку, я рекомендую заменить кнопку «Отправить» на бланк.
Полное блокирование последующих представлений формы, как это делается в большинстве приведенных выше примеров, имеет один плохой побочный эффект: если произошел сбой в сети, и они захотят повторить попытку, они не смогут это сделать и потеряют изменения, которые они сделали. Это определенно сделает злой пользователя.
источник
Пожалуйста, проверьте плагин jquery-safeform .
Пример использования:
источник
Верный. Имена / значения отключенных элементов формы не будут отправлены на сервер. Вы должны установить их как элементы только для чтения .
Кроме того, якоря не могут быть отключены таким образом. Вам нужно будет либо удалить их HREF (не рекомендуется), либо предотвратить их поведение по умолчанию (лучший способ), например:
источник
$('input[type=submit]').attr("disabled", "disabled");
но мой любимый способ - добавить егоonclick="this.disabled = 'disabled'"
в клик.Есть возможность улучшить подход Натана Лонга . Вы можете заменить логику обнаружения уже отправленной формы этой:
источник
Код Натана, но для плагина jQuery Validate
Если вы используете плагин jQuery Validate, в них уже реализован обработчик отправки, и в этом случае нет причин для реализации более одного. Код:
Вы можете легко развернуть его в
} else {
-блоке, чтобы отключить ввод и / или кнопку отправки.ура
источник
В итоге я использовал идеи из этого поста, чтобы найти решение, очень похожее на версию AtZako.
Используя как это:
Я обнаружил, что решения, которые не включают в себя какое-то время ожидания, а просто отключают отправку или отключают элементы формы, вызывают проблемы, потому что после срабатывания блокировки вы не сможете отправить снова, пока не обновите страницу. Это создает некоторые проблемы для меня при работе с AJAX.
Это, вероятно, можно немного приукрашивать, так как это не так уж и красиво.
источник
Если для отправки формы используется AJAX , set
async: false
должен предотвращать дополнительные отправки до очистки формы:источник
Немного изменил решение Натана для Bootstrap 3. Это установит загрузочный текст для кнопки отправки. Кроме того, он будет отключен через 30 секунд и позволит повторно отправить форму.
источник
Используйте две кнопки отправки.
И JQuery:
источник
Используйте простой счетчик при отправке.
И вызовите
monitor()
функцию по отправке формы.источник
У меня были подобные проблемы, и мои решения следующие.
Если у вас нет проверки на стороне клиента, вы можете просто использовать метод jquery one (), как описано здесь.
http://api.jquery.com/one/
Это отключает обработчик после его вызова.
Если вы делаете проверку на стороне клиента, как я делал, то это немного сложнее. Приведенный выше пример не позволит вам отправить снова после неудачной проверки. Попробуйте этот подход вместо
источник
Вы можете остановить вторую отправку этим
источник
Мое решение:
источник
В моем случае на отправке формы был некоторый проверочный код, поэтому я увеличиваю ответ Натана Лонга, включая контрольную точку на отправке.
источник
Изменить кнопку отправки:
С нормальной кнопкой:
Затем используйте функцию щелчка:
И помните кнопку повторного включения, когда это необходимо:
источник
Я не могу поверить старому доброму уловке css событий указателя: ни один еще не был упомянут. У меня была та же проблема, добавив отключенный атрибут, но это не отправляет назад. Попробуйте следующее и замените #SubmitButton на идентификатор вашей кнопки отправки.
источник
Enter
нажимает клавишу.Почему бы не просто - это отправит форму, но также отключит кнопку отправки,
Кроме того, если вы используете jQuery Validate, вы можете поместить эти две строки в
if ($('#myForm').valid())
.источник
этот код будет отображать загрузку на ярлыке кнопки и установить кнопку в
отключить состояние, затем после обработки снова включить и вернуть исходный текст кнопки **
источник
Я решил очень похожую проблему, используя:
источник