Я делаю запрос POST на сервер, используя ajax из Firefox. Входные данные — это просто некоторая текстовая запись в поле, содержащемся внутри div
:
<div id = "mydiv">
...stuff...
</div>
Если запрос выполнен успешно, я вызываю обработчик, чтобы отразить этот статус. Если запрос ошибочен, я вызываю другой обработчик.
$.ajax({
type: 'POST',
data: my_json,
dataType: "json",
url: "/my/url",
success: function(result, status, xhr) {
success_callback();
},
error: function(xhr) {
error_callback();
}
});
Обратный вызов успеха мало что делает. В обратном вызове ошибки я хочу изменить атрибут цвета фона на красный, чтобы визуально указать на ошибку, а затем вернуться к исходному цвету фона (скажем, белому).
Мгновенное изменение цвета очень просто:
function success_callback() {
var element = document.getElementById('mydiv');
element.style.backgroundColor = "white";
}
function error_callback() {
var element = document.getElementById('mydiv');
element.style.backgroundColor = "red";
}
Я пытался сделать затухание с помощью анимации css, такой как
CSS
.div.error {
-webkit-animation-duration: 3s;
-webkit-animation-name: error;
animation-duration: 3s;
animation-name: error;
}
@-webkit-keyframes error {
from {
background-color: red;
}
to {
background-color: white;
}
}
а затем добавить класс ошибки в JavaScript:
JS
function error_callback() {
if ($('.div').hasClass('error')) {
$('.div').removeClass('error');
else {
$('.div').addClass('error');
}
}
Это работает в первый раз, когда я отправляю неверный POST-запрос, но не работает при последующих неверных POST-запросах, потому что я не думаю, что removeClass
работает правильно (или, скорее, я неправильно его использую).
Я также пытался использовать jquery-ui после этого сообщения CSS-переход: затухание цвета фона, сброс после, но, похоже, это не работает для меня. Возможно, это как-то связано с выполнением анимации в контексте нажатия кнопки, а не ответа HTTP?
Я иду в правильном направлении для использования этого? Я хотел бы, если возможно, не выходить за рамки стандартного jQuery (т.е. держаться подальше от пользовательского интерфейса jQuery).
в вашем error_callback
вы, по сути, переключаете класс. Вместо этого вы хотите добавить его и установить тайм-аут, чтобы удалить его снова. (и кстати, вы можете легко удалить 50% текста вопроса без потери соответствующей информации)
@Taplar: я попытался удалить его сразу после вызова addClass, то есть $('.div').addClass('error').removeClass('error');
, но это, похоже, вообще ничего не происходило. Я также попытался обнаружить наличие класса ошибок и удалить его, прежде чем добавлять снова, и это тоже не сработало.
Такое быстрое добавление и удаление, скорее всего, не даст браузеру достаточно времени для завершения анимации. И на самом деле, если обе операции происходят до того, как браузер попытается перерисовать, анимация может вообще не запуститься.
Проблема в том, что при каждом последующем запросе вы переключаете цвет фона вместо того, чтобы устанавливать его в состояние, которое отражает статус последнего запроса.
Чтобы исправить это, вы можете вместо этого установить класс error
для элемента, а затем использовать тайм-аут для удаления этого класса через произвольное время, например, 10 секунд:
function error_callback() {
var $div = $('.div').addClass('error');
setTimeout(function() {
$div.removeClass('error');
}, 10000);
}
Обратите внимание, что, как упоминал @Taplar в комментарии ниже, вам также нужно помнить об удалении класса error
, когда второй успешный запрос делается вскоре после первоначального сбоя.
С добавленным примечанием, что если запрос может повториться до истечения времени ожидания, логика также может попытаться удалить класс перед следующим запросом.
Итак, вы добавляете класс ошибки в обратный вызов ошибки. Где вы его удаляете?