2013-07-08 3 views
1

Я следующее JavaScript фрагмент код:JQuery .delay() не работает

$("#dashboard").addClass("standby").delay(3000).removeClass("standby"); 
$(".active").removeClass("active"); 
$("." + target).addClass("active"); 
$(".showDiv").removeClass("showDiv").addClass("hide"); 
$("#" + target).removeClass("hide").addClass("showDiv"); 

Хотя #dashboardнаходится в режиме ожидания, он должен обрабатывать изменения всего этот CSS-класс. После этого он должен снова отобразить #dashboard. Поэтому я установил delay() между добавлением и удалением класса standby. Чтобы узнать, работает ли это, я добавил слишком длинную продолжительность 3sek.

Но это не задерживается! Почему это не так? Я не вижу этого ...

+0

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

+1

возможный дубликат (HTTP [функции ожидания() или сна() в JQuery?]: // stackoverflow.com/questions/5722791/wait-or-sleep-function-in-jquery) –

+1

Существует неправильное понимание того, как выполняется javascript, но на самом деле это не проблема. В качестве дальнейшего исследования, которое поможет вам лучше понять, как работает код javascript, я предлагаю это видео, он объясняет цикл событий javascript, который является неотъемлемой частью работы javascript. http://www.youtube.com/watch?v=8aGhZQkoFbQ –

ответ

10

delay будет работать только над действиями, проходящими через конвейер анимации, и не будет влиять на синхронизацию мгновенных атомных операций, подобных этому. Чтобы задержать такие вещи, как добавление или удаление классов, вы можете использовать setTimeout.

Метод .delay() позволяет нам задержать выполнение функций, следующих за ним в очереди. Он может использоваться со стандартной очередью эффектов или с пользовательской очередью.

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

+0

_ "Задержка будет работать только над действиями, которые проходят через конвейер анимации. _. .delay()' может использоваться вне конвейера анимации, используя ' .queue() ',' .dequeue() ' – guest271314

2

.delay() задерживает анимацию только в jQuery. Чтобы установить фактическую задержку, вы можете использовать setTimeout().

setTimeout(function() { 
... do stuff ... 
}, 3000); 
0

Похоже на то, что вы пытаетесь сделать, вы можете захотеть взглянуть на CSS переходы:

http://css-tricks.com/almanac/properties/t/transition/

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

0

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

$("#dashboard").addClass("standby"); 
$.get('urltoget',function(data){ 
    if(data) 
    $("#dashboard").removeClass("standby"); 
    else 
    $("#dashboard").removeClass("standby").addClass('error'); 
}) 
3

Задержка не будет работать так, как вы ожидаете, что на этих строках:

$("#image1").delay(9000).attr("src", "image/image1.jpg"); 
$("#image1").delay(9000).attr("src", "image/image2.jpg"); 

Он немедленно заменит атрибут. Зачем? Потому что изменение атрибута не является частью «анимации». Задержка может использоваться только с анимационными функциями.

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

Если вы хотите, чтобы развернуть это на многие изображения, попробуйте использовать более прочную функцию «.animate», чтобы затухать и исчезать. «Анимация» может быть задана функция обратного вызова, которая будет вызываться при завершении.

+0

_« Задержка может использоваться только с анимационными функциями ». _ fwiw' .delay() 'также может использоваться с' .queue() ',' .dequeue () 'без анимации элемента – guest271314

+0

Да, guest271314, я полагаю, это возможно, и это также могло бы помочь решить проблему. –

1

Все ваши задержки запуска на $(document).ready();

$("#image1").delay(5000).fadeIn(3000); 
$("#image1").delay(9000).attr("src", "image/image1.jpg"); 
$("#image1").delay(5000).fadeOut(3000); 
$("#image1").delay(9000).attr("src", "image/image2.jpg"); 
$("#image1").delay(5000).fadeIn(3000); 
$("#image1").delay(5000).fadeOut(3000); 

думать об этом таким образом. Когда doc готов, JS начинает выполнять все, что находится внутри этой функции, первая задержка выполняется следующим образом: $("#image1").delay(5000).fadeIn(3000);

Это будет НАЧАТЬ задержку в 5000 мс, а затем fadeOut() с продолжительностью 3000 мс. Этот fadeOut является синхронным с задержкой, но следующая строка кода полностью асинхронна к этой.

Затем он переходит к следующей строке. И так далее. Он не будет ждать окончания вашей задержки, он просто начинает отсчитывать фон.

.delay() НЕ суммируется при применении к одному элементу: JSFiddle

я оставляю это только в случае, если кто-то спутать, как я был

+0

Что ж, теперь это имеет смысл, но как же тогда можно было бы выполнить такую ​​задачу? Я видел, как люди использовали 'setTimeout', также видели, как люди используют' setInterval', и я попытался выяснить, как это может сделать трюк, но, к сожалению, без успеха. Не могли бы вы привести краткий пример, как это можно сделать? что ты предлагаешь. – RasmusGP

+1

В отличие от встроенных тайм-аутов JS 'delay()' в jQuery-стеках, поэтому это объяснение неверно. – JJJ

+2

Функция «.delay» работает правильно, как и ожидалось, при использовании их на том же объекте, что и она. Это не проблема. –

3

Как указано ... задержка не будет работать так, как вы ожидаете ... Вот как это работает:

$(document).ready(function(){   
 
    var audio = new Audio('sang3.mp3'); 
 
    audio.play(); 
 

 
    $("#image1") 
 
     .hide() 
 
     .attr("src", "https://placeholdit.imgix.net/~text?txtsize=63&bg=FF6347&txtclr=ffffff&txt=Image-1&w=350&h=250") 
 
     .fadeIn(1000) 
 
     .delay(3000) 
 
     .fadeOut(1000) 
 
     .queue(function(next) { 
 
      $(this).attr("src", "https://placeholdit.imgix.net/~text?txtsize=63&bg=FF6347&txtclr=ffffff&txt=Image-2&w=350&h=250") 
 
      next(); 
 
     }) 
 
     .fadeIn(1000); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
 
<img src="" id="image1">

2

Попробуйте с использованием .queue()

$("#image1").delay(5000).fadeIn(3000, function() { 
     $(this).delay(9000, "task").queue("task", function() { 
     $(this).attr("src", "image/image1.jpg") 
     .delay(5000).fadeOut(3000, function() { 
      $(this).delay(9000, "task") 
      .queue("task", function() { 
      $(this).attr("src", "image/image2.jpg") 
      .delay(5000).fadeIn(3000, function() { 
       $(this).delay(5000).fadeOut(3000) 
      }) 
      }).dequeue("task") 
     }); 
     }).dequeue("task") 
    });