JQuery: предотвратить анимацию и время ожидания очереди? - PullRequest
1 голос
/ 10 февраля 2012

Возможно, мне нужно решить простую проблему, но я не знаю, каков правильный подход к этому.

У меня есть панель div.notification поверх моего сайта, которая по умолчанию скрыта.Бар получает дополнительный класс либо success, либо warning, который при необходимости устанавливает его на display:block;.

Итак, есть два случая.Либо выходное сообщение выводится непосредственно на полосу .notification при загрузке страницы (и он получает класс success или warning прямо с ним), либо полоса .notifcation скользит вниз сверху и подается сjson data.

В любом случае, панель уведомлений всегда должна быть видна в течение 10 секунд, а затем скользить вверх.

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

var timing = 10000;
function notificationOutput(type, message) {
    var note = $('.notification');
    note.hide();
    note.find('.message').html(message);
    note.stop(true,true).slideDown().delay(timing).slideUp();
}

function notificationSlideUp(slideUp) {
    var note = $('.notification');

    if ( slideUp ) note.delay(timing).slideUp();
        else note.stop(true,true).slideUp();
}

Таким образом, функция notificationOutput() запускается из различных других функций, которые возвращают данные json и отображают их в поле.

И функция notificationSlideUp() сейчас вызывается при каждой загрузке страницы, потому что в моем заголовке у меня есть это ...

<script type="text/javascript">
    $(document).ready(function(){
        notificationSlideUp(true);
    });
</script>

И для этого есть причина!Вспомните случай, когда .notification прямо установлен как видимый при загрузке страницы… например, когда пользователь заходит на мою платформу, панель .notification сразу становится видимой и говорит «Добро пожаловать, пользователь успешно вошел в систему».

Я вызываю функцию notifictaionSlideUp() в своем заголовке, чтобы удостовериться, что видимая в данный момент панель .notification снова выполнит slideUp () через 10 секунд.

И здесь возникает проблема ... Каким-то образом это приводит к тому, что вся синхронизация уведомлений и скольжение вверх и вниз "запутываются".Таким образом, должна произойти некоторая постановка в очередь функций слайдов и / или функции delay (), потому что без note.stop(true,true) в функции notificationOutput() уведомление не будет сразу вызывать slideDown (), если оно будет запущено в течение первых 10 секунд послезагрузка страницы.Это происходит потому, что функция notificationSlideUp() уже запустила slideUp () и delay () объекта.

И то же самое происходит с задержкой.Если .notification выдается в течение первых 10 секунд, время задержки не подходит, потому что счетчик задержки уже запущен при загрузке страницы.

Есть идеи, как решить эту проблему, чтобы она всегда работала?

Обновление:

var notificationTimer;

function notificationOutput(type, message) {
    var note = $('.notification');
    note.hide();
    note.find('.message').html(message);

    note.stop(true,true).slideDown();

    clearTimeout(notificationTimer);
    notificationTimer = setTimeout(function() {
        note.stop(true,true).slideUp();
    }, 10000);

}

function notificationSlideUp(slideUp) {
    var note = $('.notification');

    if ( slideUp ) {
        clearTimeout(notificationTimer);
        notificationTimer = setTimeout(function() {
            note.stop(true,true).slideUp();
        }, 10000);
    } else {
        note.stop(true,true).slideUp();
    }
}

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

http://api.jquery.com/delay/

Метод .delay () лучше всего подходит для задержки между поставленными в очередь jQuery последствия. Поскольку оно ограничено, например, оно не предлагает отменить задержку - .delay () не является заменой нативного JavaScript функция setTimeout, которая может быть более подходящей для определенного использования случаи.

Но вы можете использовать следующий «совет» - заменить задержку анимацией, которая ничего не меняет. Например, с .animate({opacity:1},timing)

1 голос
/ 10 февраля 2012

К сожалению, функция jQuery delay() не предлагает никакого метода для отмены задержки, как setTimeout() делает с clearTimeout(). Я бы предложил заменить ваши delay() на именованные setTimeout() s и записать условие в clearTimeout() для случаев, когда вам нужно немедленно отменить / запустить анимацию в очереди.

...