Использование AJAX / jQuery для обновления изображения

Это, наверное, простой вопрос, но я в тупике и просто не знаю с чего начать.

У меня есть PHP-скрипт (image_feed.php), который возвращает URL-адрес изображения. Каждый раз, когда этот URl называется, он возвращает последнее доступное изображение (изображение меняется каждые пару секунд).

Я хочу, чтобы, когда страница загружается, есть вызов AJAX для image_feed.php, который возвращает последний URL-адрес. Этот URl затем вставляется в HTMl, заменяя соответствующее изображение src.

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

На данный момент у меня есть следующий jQuery, который просто загружает возвращаемое значение image_feed.php непосредственно в div с именем # image1. image_feed.php правильно отформатирован для предоставления тега изображения html.

$(document).ready(function(){ var $container = $("#image1"); $container.load('image_feed.php?CAMERA_URI=<?=$camera_uri;?>') var refreshId = setInterval(function() { $container.load('image_feed.php?CAMERA_URI=<?=$camera_uri;?>'); }, 5000); }); 

Это работает, но есть проблема. Я получаю пустое пространство размером с изображение в IE и Firefox каждый раз, когда изображение обновляется, потому что для загрузки требуется некоторое время.

Я знаю, что мне нужно для image_feed.php, чтобы вернуть простой URL-адрес изображения. Затем я использую некоторый jQuery для запроса этого URL-адреса, предварительно загружаю его и затем заменяю его существующим изображением.

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

Related of "Использование AJAX / jQuery для обновления изображения"

 $(document).ready(function() { var $img = $('#image1'); setInterval(function() { $.get('image_feed.php?CAMERA_URI=<?=$camera_uri;?>', function(data) { var $loader = $(document.createElement('img')); $loader.one('load', function() { $img.attr('src', $loader.attr('src')); }); $loader.attr('src', data); if($loader.complete) { $loader.trigger('load'); } }); }, 5000); }); 

Непроверенные. Код выше должен загрузить новое изображение в фоновом режиме, а затем установить атрибут src старого изображения при загрузке.

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

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

Например, когда есть часто изменяющееся изображение (например, captcha), и вы хотите загрузить его снова, не обновляя браузер, вы можете сделать так:

Исходный код:

 <img src="captcha.png" alt="captcha" /> 

Обновленный код:

 <img src="captcha.png?1" alt="captcha" /> 

Используемый здесь сценарий будет справедливым:

 var d = new Date(); $('img').attr('src', $('img').attr('src') + '?_=' + d.getMilliseconds()); 

Надеюсь это поможет! 🙂

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

 $.ajax({ url: 'getnewimageurl.php', success: function(data) { $('img').attr('src', data); } }); 

Сервер должен возвращать в него только новое имя изображения. Например, PHP код должен быть таким:

 <?php $images = array("jifhdfg", "jklduou", "yuerkgh", "uirthjk", "xcjhrii"); die($images[date('u') % count($images)] . ".png"); // Get the random milliseconds mod by length of images. ?> 

Я предлагаю вам использовать плагин jQuery 'onImagesLoad'. Это дает вам обратный вызов, когда изображение закончит загрузку.

Когда вы получаете новый URL изображения с сервера, вы создаете новый объект <img с src="new_url_from_server" и присоединяете 'onImagesLoad' обратный вызов 'onImagesLoad' . Когда вы вызываете обратный вызов, ваше изображение закончило загрузку.

Теперь вы можете просто заменить атрибут src старого объекта img на new_url_from_server. Поскольку новое изображение уже доступно в кеше, оно не будет загружено снова и будет немедленно отображено!

Упрощенно вы можете скрыть старое изображение и добавить это новое изображение в DOM (не требуется, если выше работает правильно)

Пример с некоторыми голыми костями может выглядеть следующим образом:

 <!DOCTYPE html> <html> <body> <img id='bla' src="10.jpg" /> <script type="text/javascript" src="jquery.min.js"></script> <script type="text/javascript" src="jquery.onImagesLoad.js"></script> <script type="text/javascript"> $(function(){ var img = $('<div><img src="http://img.ruphp.com/php/verybig.jpg"></img></div>'); img.onImagesLoad({ all : allImgsLoaded }); function allImgsLoaded($selector){ var allLoaded = ""; //build a string of all items within the selector $selector.each(function(){ $('#bla').attr('src','http://img.ruphp.com/php/verybig.jpg'); }) } }); </script> </body> </html>