Переход цвета фона Javascript и сброс при ответе HTTP

Я делаю запрос 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).

Итак, вы добавляете класс ошибки в обратный вызов ошибки. Где вы его удаляете?

Taplar 29.05.2019 16:42

в вашем error_callback вы, по сути, переключаете класс. Вместо этого вы хотите добавить его и установить тайм-аут, чтобы удалить его снова. (и кстати, вы можете легко удалить 50% текста вопроса без потери соответствующей информации)

Chris G 29.05.2019 16:45

@Taplar: я попытался удалить его сразу после вызова addClass, то есть $('.div').addClass('error').removeClass('error');, но это, похоже, вообще ничего не происходило. Я также попытался обнаружить наличие класса ошибок и удалить его, прежде чем добавлять снова, и это тоже не сработало.

user12066 29.05.2019 16:49

Такое быстрое добавление и удаление, скорее всего, не даст браузеру достаточно времени для завершения анимации. И на самом деле, если обе операции происходят до того, как браузер попытается перерисовать, анимация может вообще не запуститься.

Taplar 29.05.2019 16:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
434
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Чтобы исправить это, вы можете вместо этого установить класс error для элемента, а затем использовать тайм-аут для удаления этого класса через произвольное время, например, 10 секунд:

function error_callback() {
  var $div = $('.div').addClass('error');
  setTimeout(function() {
    $div.removeClass('error');
  }, 10000);
}

Обратите внимание, что, как упоминал @Taplar в комментарии ниже, вам также нужно помнить об удалении класса error, когда второй успешный запрос делается вскоре после первоначального сбоя.

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

Taplar 29.05.2019 16:48

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