2014-10-14 3 views
0

Я хочу сделать функцию, чтобы изменить свой фон <header> каждые 5 секунд.jQuery setinterval function change css

С одной стороны, у меня есть изображение, которое меняется каждый раз, когда X, оно генерируется файл PHP:

../bg.php 

Так что я сделал, что я изменить фоновое изображение с $("header").css().

Запуск сценария, как это:

(function($) 
{ 
    $(document).ready(function() 
    { 

     var $container = $("header"); 
     $container.css("background-image", "url(bg.php)"); 
     var refreshId = setInterval(function() 
     { 
      $container.css("background-image", "url(bg.php)"); 
     }, 9000); 
    }); 
})(jQuery); 

Но не меняется само по себе.

+0

Может быть, вопрос кэша ... Может быть, поэтому она, кажется, не обновляется ... Попробуйте установить его как '$ container.css (" Фоновое изображение "," url ('bg.php? a = "+ Math.random() +"') ");' – LcSalazar

+0

FYI вы говорите, что он обновляется каждые 5 секунд, но он используется для обновления каждые 9. – ajndl

+0

@LcSalazar является правильным решением, спасибо. –

ответ

2

Возможно, потому что ваш браузер кэширует его. разместить случайное число в конце URL:

$container.css("background-image", "url(bg.php?rnd=" + Math.random() + ")"); 
var refreshId = setInterval(function() 
{ 
    $container.css("background-image", "url(bg.php?rnd=" + Math.random() + ")"); 
}, 9000); 
+0

Это будет работать, но есть действительно небольшой, но все же присутствующий шанс, что число может быть повторено, и кэш-образ можно получить доступ ... – ajndl

+0

настроить заголовок кэша http на ** no-cache ** http: // stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers –

+0

Спасибо, это решение работает! –

0
window.setInterval(function(){ 
    /// call your function here 
}, 5000); 

Возможно, вам необходимо вызвать location.reload(); также.

+0

Есть вызов 'setInterval()' в опубликованном коде ... – Pointy

+0

Я думаю, что это не работает для него, потому что у него есть документ. Объявив, что это окно должно работать на него. –

+0

Я не думаю, что это имело бы значение. – Pointy

3

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

var counter = 1, refreshId = setInterval(function() 
    { 
     $container.css("background-image", "url(bg.php?_=" + counter++ + ")"); 
    }, 9000); 

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

+1

Я должен был разместить как ответ вместо комментария, но я не был уверен ... :) – LcSalazar

+0

Ну, я не программист на PHP, поэтому я (и не знаю) знаю, может ли PHP поставить кеш - исправления заголовков по умолчанию. – Pointy

0

Попробуйте добавить запрос bg.php

var d = new Date(); 
var n = d.getTime(); 
$container.css("background-image", "url(bg.php?" + n + ")"); 

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

+1

Вы можете соединить эту дату() с Math.random(), чтобы снизить вероятность повторения даты с помощью случайных регулировок часов ... и добавить 42, пока вы на ней :) – henser

+0

Это другое действующее решение, спасибо. –

0

Вы вам нужно будет установить background-image на другой URL-адрес, если вы не хотите перезагружать всю страницу. Тем не менее, вы можете прикрепить фрагмент (например, http://example.com/index.php#fragment) или, альтернативно, строку запроса (например, http://example.com/index.php?querystring) к этому URL-адресу .php каждый раз. Если вы собираетесь сбросить его через каждые 5 секунд, хороший метод будет присоединять new Date().getTime(); до конца исходного изображения URL, например:

var currentDate = new Date(); 
$container.css("background-image", "url(bg.php#" + currentDate.getTime() + ")"); 

или даже более сжато/эффективно

$container.css("background-image", "url(bg.php#" + new Date().getTime() + ")"); 

Вы должны получить background-image что-то вроде url(bg.php#1413320228120). Это хорошо, потому что фрагмент не повлияет на то, где браузер ищет изображение (все еще bg.php), но каждый раз он будет рассматривать его по-разному и загружать его снова.

Ваше решение должно выглядеть примерно так:

(function($) 
{ 
    $(document).ready(function() 
    { 

     var $container = $("header"); 
     $container.css("background-image", "url(bg.php)"); 
     var refreshId = setInterval(function() 
     { 
      $container.css("background-image", "url(bg.php)"); 
     }, 9000); 
    }); 
})(jQuery); 
+0

Это похоже на решение, которое работает для меня, но если использование # не обнаружено вообще как уникальный URL. Или я думаю. Благодарю. –

+0

@FernandoM Я рад, что вы нашли решение. Что касается фрагментов, я предполагаю, что это зависит от браузера. – ajndl