Rails Javascript Database Сомнение - PullRequest
0 голосов
/ 07 июля 2011

Я пытаюсь отобразить набор изображений через определенные промежутки времени в моем приложении rails.Теперь я использую для этого javascript и беру время от пользователя за время между каждым показом слайдов.Теперь для этого я использую функцию setTimeout в javascript, в которой я пытаюсь извлечь время из базы данных, т.е. моя таблица называется slides.

Это мой фрагмент кода для предварительной загрузки изображений

var preloaded = new Array();


for (var x = 0; x < 10; x++)
{
    preloaded[x]     = new Image();
    preloaded[x].src = "/images/pausch/img"+x+".gif";
}

Это мой фрагмент функции изменения изображения

    function slideit(){
//if browser does not support the image object, exit.
if (!document.images)
return;
document.images.slide.src=eval("preloaded["+step+"].src");
if (step<10)
step++;
else
step=0 ;
<% @slides.each do |slide| %>
setTimeout("slideit()",'<%= slide.time.to_i %>')

    <% end %>
}

Однако изображения меняются в случайное время, а не в соответствии с сохраненным временем.Кто-нибудь может подсказать, что не так?

1 Ответ

1 голос
/ 07 июля 2011

Попробуйте удалить вызов setTimeout() из функции и поместить вызов (скажем) setInterval(slideit,1000) где-нибудь вне функции:

    ....
    document.images.slide.src = preloaded[step].src; 

    if (step<10) step++;
    else step=0;
}
setInterval(slideit,1000);

Это приведет к тому, что slideit() будет вызываться каждые 1000 мс, вместо того, чтобы назначать несколько тайм-аутов каждый раз, когда вызывается функция.

Примечание. Я также удалил вызов eval() и некоторые дополнительные кавычки из вашей строки preloaded[step].src - это не повлияет на время ожидания, но вам не нужно указывать здесь eval, поскольку содержимое массива - просто строка (и по соображениям безопасности обычно лучше избегать использования eval(), если можете).

Редактировать: Только что увидел, что вы хотите разные таймауты для каждого изображения. Я бы сделал это с помощью одного вызова setTimeout ():

    ....
    document.images.slide.src = preloaded[step].src; 

    setTimeout(slideit,timeouts[step]);

    if (step<10) step++;
    else step=0;
}

Для этого решения вам нужно инициализировать массив с именем timeouts, где каждая запись timeouts[x] содержит количество миллисекунд для отображения изображения x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...