Мне нужно принудительно обновить только это изображение на странице. Есть идеи?

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

var newImage = new Image();
newImage.src = "http://localhost/image.jpg";

function updateImage()
{
if(newImage.complete) {
    document.getElementById("theText").src = newImage.src;
    newImage = new Image();
    number  ;
    newImage.src = "http://localhost/image/id/image.jpg?time="   new Date();
}

    setTimeout(updateImage, 1000);
}

так, как их видит FireFox :

HTTP/1.x 200 OK
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: image/jpeg
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Server: Microsoft-HTTPAPI/1.0
Date: Thu, 02 Jul 2009 23:06:04 GMT

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

, в качестве второго аргумента используйте запасное значение, замените { *} JavaScript может соответствовать регулярному выражению:

newImage.src = "http://localhost/image.jpg?"   new Date().getTime();

(1) Добавьте уникальный параметр запроса к кешу в URL, такой как:

Я видел много вариантов ответов о том, как это сделать, поэтому я решил обобщить их здесь (плюс добавить 4-й метод моего собственного изобретения):


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

newImage.src = "image.jpg?t="   new Date().getTime();

Pros: Теперь стили применяются только к элементу таблицы регистратора — не ко всем таблицам — это тоже

Это работает, потому что Когда использовать: не меняется между представлениями. Потенциально заполнит кэш браузера (и любые промежуточные кеши) множеством копий одного и того же изображения! Также требуется изменение URL изображения.

Использовать когда изображение постоянно меняется, например, для прямой трансляции с веб-камеры. Если вы используете этот метод, убедитесь, что сами изображения обслуживаются заголовками HTTP !!! Cache-control: no-cache (2) Добавьте параметр запроса к URL-адресу, который изменяется только при изменении файла, например: (часто это можно настроить с помощью файла .htaccess). В противном случае вы будете постепенно заполнять кеши старыми версиями изображения!


(это PHP-код на стороне сервера, но важным моментом здесь является то, что? M =

echo '<img src="image.jpg?m=' . filemtime('image.jpg') . '">';

[файл время последнего изменения] 100 % надежно, быстро & amp ; легко понять и реализовать, , представляют собой строку запроса: добавляется к имени файла).

Pros: Минусы: значения этого {{}} этого свойства наша вики-страница EL

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

Использовать когда изображение постоянно меняется, например, для прямой трансляции с веб-камеры. Если вы используете этот метод, Если вы хотите кэшировать изображения, но, возможно, придется время от времени обновлять их на стороне сервера без изменения самого имени файла. И когда вы можете легко убедиться, что правильная строка запроса добавлена ​​к каждому экземпляру изображения в вашем HTML.


, который является заменой на основе обещаний для плагина Cache-control: max-age=0, must-revalidate memcache Идея заключается в том, что заголовок элемента управления кэшем помещает изображения в кэш браузера, но сразу же помечает их как устаревшие, так что при каждом повторном отображении браузер должен проверять с помощью сервер, чтобы увидеть, если они изменились. Это гарантирует, что браузер — удаление фрагмента идентификатора URL-адреса, например:

newImage.src = "image.jpg#"   new Date().getTime();

всегда возвращает самую последнюю копию изображения. Однако браузеры будут часто повторно использовать копию изображения в памяти, если они есть, и не даже проверить их HT ТП кеш в таком случае. Чтобы предотвратить это, используется идентификатор фрагмента: Сравнение образа в памяти HTTP-кеш включает идентификатор фрагмента, но он отбрасывается перед запросом кеша HTTP. (Так, например,src Содержит идентификатор фрагмента, но он отбрасывается перед запросом HTTP кэш. (Так, например, image.jpg#A и image.jpg#B может отображаться как из записи image.jpg в HTTP-кэше браузера, но image.jpg#B и т. д. image.jpg#A последний раз отображался).

Pros: правильно использует механизмы кэширования HTTP и использует кэшированные изображения, если они не изменились. Работает для серверов которые душат строку запроса, добавленную к статическому URL-адресу изображения (поскольку серверы никогда не видят идентификаторы фрагментов — они предназначены только для собственного использования браузерами).

Минусы: Полагается на несколько сомнительные (или, по крайней мере, плохо документированные) поведение браузеров в отношении изображений с идентификаторами фрагментов в их URL-адресах (тем не менее, я успешно проверил это в FF27, Chrome33 и IE11). По-прежнему отправляет запрос на повторную проверку на сервер для каждого представления изображения, что может быть избыточным если изображения меняются редко и / или задержка является большой проблемой (поскольку вам нужно дождаться ответа на повторную проверку, даже если кэшированное изображение все еще исправно). Требуется изменение URL-адресов изображений.

Использовать когда изображение постоянно меняется, например, для прямой трансляции с веб-камеры. Если вы используете этот метод, Используйте, если изображения могут часто меняться или требуются периодически обновляться клиентом без участия сценария на стороне сервера , но где вы все еще хотите преимущество кэширования. Например, опрос живой веб-камеры, которая обновляет изображение нерегулярно каждые несколько минут. В качестве альтернативы используйте вместо (1) или (2), если ваш сервер не разрешает строки запросов для статических URL-адресов изображений.


(4) Принудительно обновите определенное изображение, используя Javascript, сначала загрузив его в скрытый <iframe> и затем вызывая location.reload(true) в iframe. contentWindow Глядя на вывод

Шаги:

  • Загрузите изображение, которое нужно обновить, в скрытый iframe. Это всего лишь шаг настройки — его можно сделать заранее, если нужно, и само обновление. Даже не имеет значения, если изображение не загружается на этом этапе!

  • Как только это будет сделано, удалите все копии этого изображения на своих страницах или в любом месте в любых узлах DOM (даже вне страницы, которые хранятся в переменных javascript). Это необходимо, поскольку в противном случае браузер может отображать изображение из устаревшей копии в памяти (особенно это делает IE11): перед обновлением кэша HTTP необходимо убедиться, что все копии в памяти очищены. Если другой код javascript выполняется асинхронно, вам также может понадобиться предотвратить создание этим кодом новых копий обновляемого изображения.

  • Вызвать iframe.contentWindow.location.reload(true) Если вы хотите все эти true форсирует обход кеша, перезагружая непосредственно с сервера и перезаписывая существующую кешированную копию.

  • После того, как он закончил re Важный сценарий использования IIFE:

Для изображений из одного домена вы можете загрузить изображение непосредственно в iframe. Для междоменных изображений вы должны вместо этого загрузить HTML-страницу из своего домена . Тем не менее, во многих случаях шаблон модуля по-прежнему весьма полезен и при правильном использовании, безусловно, может улучшить структуру нашего приложения. <img> У Дуга Крокфорда, который был старшим разработчиком JavaScript в течение нескольких лет, есть очень интересный пост здесь iframe.contentWindow.reload(...) Глядя на вывод

Pros: Работает так же, как функция image.reload (), которую вы хотите , которое имел DOM! Позволяет изображения кэшируется нормально (даже с датами истечения срока действия в будущем, если вы этого хотите, что позволяет избежать частой повторной проверки). Позволяет обновить определенное изображение без изменения URL-адресов этого изображения на текущей странице или на любых других страницах, используя только клиентский код.

Против: Полагается на Javascript. Не 100 % гарантированно работают должным образом в каждом браузере (хотя я успешно проверил это в FF27, Chrome33 и IE11). Очень сложный по сравнению с другими методами. Страница

Использовать когда изображение постоянно меняется, например, для прямой трансляции с веб-камеры. Если вы используете этот метод, Когда у вас есть коллекция в основном статических изображений, которые Вы хотели бы кэшировать, но вы все равно должны иметь возможность периодически обновлять их и получать немедленную визуальную информацию о том, что обновление имело место. (Особенно, когда просто не обновляется вся страница браузера, как, например, в некоторых веб-приложениях, построенных на AJAX). И когда методы (1) — (3) неосуществимы, потому что (по какой-либо причине) вы не можете изменить все URL-адреса, которые потенциально могут отображать изображение, которое вам необходимо обновить. (Обратите внимание, что с помощью этих 3 методов изображение будет обновлено, но если другой затем пытается отобразить это изображение Вызывается как: с соответствующей строкой запроса или идентификатором фрагмента, вместо этого может отображаться более старая версия).

Подробная информация о реализации этого надежного и гибкого способа приведена ниже:

Предположим, что ваш веб-сайт содержит пустой 1×1 пиксель .gif по пути URL /img/1x1blank.gif, а также имеет следующий однострочный PHP Сценарий (требуется только для применения принудительного обновления к кросс-домену изображений и могут быть переписаны на любом языке сценариев на стороне сервера, разумеется) по пути URL /echoimg.php:

<img src="<?=htmlspecialchars(@$_GET['src'],ENT_COMPAT|ENT_HTML5,'UTF-8')?>">

. Затем, вот реалистичная реализация того, как вы могли бы сделать все это в Javascript. Это выглядит немного сложнее, но есть много комментариев и важные функция — это просто forceImgReload () — первые два просто пустые и непустые изображения, и должны быть спроектированы так, чтобы эффективно работать с вашим собственным HTML, так что кодируйте их так, как вам удобнее ;, многие из сложностей в них могут быть ненужным для вашего сайта:

// This function should blank all images that have a matching src, by changing their src property to /img/1x1blank.gif.
// ##### You should code the actual contents of this function according to your page design, and what images there are on them!!! #####
// Optionally it may return an array (or other collection or data structure) of those images affected.
// This can be used by imgReloadRestore() to restore them later, if that's an efficient way of doing it (otherwise, you don't need to return anything).
// NOTE that the src argument here is just passed on from forceImgReload(), and MAY be a relative URI;
// However, be aware that if you're reading the src property of an <img> DOM object, you'll always get back a fully-qualified URI,
// even if the src attribute was a relative one in the original HTML.  So watch out if trying to compare the two!
// NOTE that if your page design makes it more efficient to obtain (say) an image id or list of ids (of identical images) *first*, and only then get the image src,
// you can pass this id or list data to forceImgReload() along with (or instead of) a src argument: just add an extra or replacement parameter for this information to
// this function, to imgReloadRestore(), to forceImgReload(), and to the anonymous function returned by forceImgReload() (and make it overwrite the earlier parameter variable from forceImgReload() if truthy), as appropriate.
function imgReloadBlank(src)
{
  // ##### Everything here is provisional on the way the pages are designed, and what images they contain; what follows is for example purposes only!
  // ##### For really simple pages containing just a single image that's always the one being refreshed, this function could be as simple as just the one line:
  // ##### document.getElementById("myImage").src = "/img/1x1blank.gif";

  var blankList = [],
      fullSrc = /* Fully qualified (absolute) src - i.e. prepend protocol, server/domain, and path if not present in src */,
      imgs, img, i;

  for each (/* window accessible from this one, i.e. this window, and child frames/iframes, the parent window, anything opened via window.open(), and anything recursively reachable from there */)
  {
    // get list of matching images:
    imgs = theWindow.document.body.getElementsByTagName("img");
    for (i = imgs.length; i--;) if ((img = imgs[i]).src===fullSrc)  // could instead use body.querySelectorAll(), to check both tag name and src attribute, which would probably be more efficient, where supported
    {
      img.src = "/img/1x1blank.gif";  // blank them
      blankList.push(img);            // optionally, save list of blanked images to make restoring easy later on
    }
  }

  for each (/* img DOM node held only by javascript, for example in any image-caching script */) if (img.src===fullSrc)
  {
    img.src = "/img/1x1blank.gif";   // do the same as for on-page images!
    blankList.push(img);
  }

  // ##### If necessary, do something here that tells all accessible windows not to create any *new* images with src===fullSrc, until further notice,
  // ##### (or perhaps to create them initially blank instead and add them to blankList).
  // ##### For example, you might have (say) a global object window.top.blankedSrces as a propery of your topmost window, initially set = {}.  Then you could do:
  // #####
  // #####     var bs = window.top.blankedSrces;
  // #####     if (bs.hasOwnProperty(src)) bs[src]  ; else bs[src] = 1;
  // #####
  // ##### And before creating a new image using javascript, you'd first ensure that (blankedSrces.hasOwnProperty(src)) was false...
  // ##### Note that incrementing a counter here rather than just setting a flag allows for the possibility that multiple forced-reloads of the same image are underway at once, or are overlapping.

  return blankList;   // optional - only if using blankList for restoring back the blanked images!  This just gets passed in to imgReloadRestore(), it isn't used otherwise.
}




// This function restores all blanked images, that were blanked out by imgReloadBlank(src) for the matching src argument.
// ##### You should code the actual contents of this function according to your page design, and what images there are on them, as well as how/if images are dimensioned, etc!!! #####
function imgReloadRestore(src,blankList,imgDim,loadError);
{
  // ##### Everything here is provisional on the way the pages are designed, and what images they contain; what follows is for example purposes only!
  // ##### For really simple pages containing just a single image that's always the one being refreshed, this function could be as simple as just the one line:
  // ##### document.getElementById("myImage").src = src;

  // ##### if in imgReloadBlank() you did something to tell all accessible windows not to create any *new* images with src===fullSrc until further notice, retract that setting now!
  // ##### For example, if you used the global object window.top.blankedSrces as described there, then you could do:
  // #####
  // #####     var bs = window.top.blankedSrces;
  // #####     if (bs.hasOwnProperty(src)&&--bs[src]) return; else delete bs[src];  // return here means don't restore until ALL forced reloads complete.

  var i, img, width = imgDim&&imgDim[0], height = imgDim&&imgDim[1];
  if (width) width  = "px";
  if (height) height  = "px";

  if (loadError) {/* If you want, do something about an image that couldn't load, e.g: src = "/img/brokenImg.jpg"; or alert("Couldn't refresh image from server!"); */}

  // If you saved & returned blankList in imgReloadBlank(), you can just use this to restore:

  for (i = blankList.length; i--;)
  {
    (img = blankList[i]).src = src;
    if (width) img.style.width = width;
    if (height) img.style.height = height;
  }
}




// Force an image to be reloaded from the server, bypassing/refreshing the cache.
// due to limitations of the browser API, this actually requires TWO load attempts - an initial load into a hidden iframe, and then a call to iframe.contentWindow.location.reload(true);
// If image is from a different domain (i.e. cross-domain restrictions are in effect, you must set isCrossDomain = true, or the script will crash!
// imgDim is a 2-element array containing the image x and y dimensions, or it may be omitted or null; it can be used to set a new image size at the same time the image is updated, if applicable.
// if "twostage" is true, the first load will occur immediately, and the return value will be a function
// that takes a boolean parameter (true to proceed with the 2nd load (including the blank-and-reload procedure), false to cancel) and an optional updated imgDim.
// This allows you to do the first load early... for example during an upload (to the server) of the image you want to (then) refresh.
function forceImgReload(src, isCrossDomain, imgDim, twostage)
{
  var blankList, step = 0,                                // step: 0 - started initial load, 1 - wait before proceeding (twostage mode only), 2 - started forced reload, 3 - cancelled
      iframe = window.document.createElement("iframe"),   // Hidden iframe, in which to perform the load reload.
      loadCallback = function(e)                          // Callback function, called after iframe load reload completes (or fails).
      {                                                   // Will be called TWICE unless twostage-mode process is cancelled. (Once after load, once after reload).
        if (!step)  // initial load just completed.  Note that it doesn't actually matter if this load succeeded or not!
        {
          if (twostage) step = 1;  // wait for twostage-mode proceed or cancel; don't do anything else just yet
          else { step = 2; blankList = imgReloadBlank(src); iframe.contentWindow.location.reload(true); }  // initiate forced-reload
        }
        else if (step===2)   // forced re-load is done
        {
          imgReloadRestore(src,blankList,imgDim,(e||window.event).type==="error");    // last parameter checks whether loadCallback was called from the "load" or the "error" event.
          if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
        }
      }
  iframe.style.display = "none";
  window.parent.document.body.appendChild(iframe);    // NOTE: if this is done AFTER setting src, Firefox MAY fail to fire the load event!
  iframe.addEventListener("load",loadCallback,false);
  iframe.addEventListener("error",loadCallback,false);
  iframe.src = (isCrossDomain ? "/echoimg.php?src=" encodeURIComponent(src) : src);  // If src is cross-domain, script will crash unless we embed the image in a same-domain html page (using server-side script)!!!
  return (twostage
    ? function(proceed,dim)
      {
        if (!twostage) return;
        twostage = false;
        if (proceed)
        {
          imgDim = (dim||imgDim);  // overwrite imgDim passed in to forceImgReload() - just in case you know the correct img dimensions now, but didn't when forceImgReload() was called.
          if (step===1) { step = 2; blankList = imgReloadBlank(src); iframe.contentWindow.location.reload(true); }
        }
        else
        {
          step = 3;
          if (iframe.contentWindow.stop) iframe.contentWindow.stop();
          if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
        }
      }
    : null);
}

Затем, чтобы принудительно обновить изображение, расположенное в том же домене, что и ваша страница, вы можете просто сделать:

forceImgReload("myimage.jpg");

Чтобы обновить изображение из другого места (междоменный):

forceImgReload("http://someother.server.com/someimage.jpg", true);

Более сложным приложением может быть перезагрузка изображения после загрузки новой версии в Ваш сервер готовит начальный этап процесса перезагрузки одновременно с загрузкой, чтобы минимизировать видимую задержку перезагрузки для пользователя. Если вы выполняете загрузку через AJAX, а сервер возвращает очень простой массив JSON [success, width, height], тогда ваш код может выглядеть примерно так:

// fileForm is a reference to the form that has a the <input typ="file"> on it, for uploading.
// serverURL is the url at which the uploaded image will be accessible from, once uploaded.
// The response from uploadImageToServer.php is a JSON array [success, width, height]. (A boolean and two ints).
function uploadAndRefreshCache(fileForm, serverURL)
{
  var xhr = new XMLHttpRequest(),
      proceedWithImageRefresh = forceImgReload(serverURL, false, null, true);
  xhr.addEventListener("load", function(){ var arr = JSON.parse(xhr.responseText); if (!(arr&&arr[0])) { proceedWithImageRefresh(false); doSomethingOnUploadFailure(...); } else { proceedWithImageRefresh(true,[arr[1],ar[2]]); doSomethingOnUploadSuccess(...); }});
  xhr.addEventListener("error", function(){ proceedWithImageRefresh(false); doSomethingOnUploadError(...); });
  xhr.addEventListener("abort", function(){ proceedWithImageRefresh(false); doSomethingOnUploadAborted(...); });
  // add additional event listener(s) to track upload progress for graphical progress bar, etc...
  xhr.open("post","uploadImageToServer.php");
  xhr.send(new FormData(fileForm));
}

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

В качестве альтернативы …

newImage.src = "http://localhost/image.jpg?"   new Date().getTime();

… кажется, что …

newImage.src = "http://localhost/image.jpg#"   new Date().getTime();

. … достаточно, чтобы обмануть кеш браузера, не обходя никакие восходящие кэши, при условии, что вы вернули правильные Cache-Control заголовки. Хотя вы можете использовать …

Cache-Control: no-cache, must-revalidate

… вы теряете преимущества If-Modified-Since или If-None-Match заголовки, что-то вроде …

Cache-Control: max-age=0, must-revalidate

… должно препятствовать повторной загрузке браузером всего изображения, если оно фактически не изменилось. Протестировано и работает на IE, Firefox и Chrome. Досадно, что в Safari он не работает, если вы не используете …

Cache-Control: no-store

… хотя это все же может быть предпочтительнее, чем заполнение вышестоящих кешей сотнями идентичных образов, особенно когда они работают на вашем собственном сервере. ; -)

Обновление (2014-09-28): В настоящее время похоже, что Cache-Control: no-store также необходим для Chrome.

После создания нового образа вы удаляете старое изображение из DOM и заменяете его новым?

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

Есть несколько способов сделать это. Нечто подобное будет работать.

function updateImage()
{
    var image = document.getElementById("theText");
    if(image.complete) {
        var new_image = new Image();
        //set up the new image
        new_image.id = "theText";
        new_image.src = image.src;           
        // insert new image and remove old
        image.parentNode.insertBefore(new_image,image);
        image.parentNode.removeChild(image);
    }

    setTimeout(updateImage, 1000);
}

После того, как это заработало, если проблемы все еще существуют, вероятно, это проблема кэширования, о которой говорят другие ответы.

Один из ответов заключается в хакерском добавлении некоторого параметра запроса get, как было предложено.

Обратите внимание, что вы передаете

Pragma: no-cache
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Cache-Control: no-cache, must-revalidate

предоставляя дату в прошлом, она не будет кэшироваться браузером. Cache-Control был добавлен в HTTP / 1.1, а тег must-revalidate указывает на то, что прокси никогда не должны обслуживать старое изображение даже при смягчающих обстоятельствах, а Pragma: no-cache на самом деле не является необходимым для современных современных браузеров / кешей, но может помочь с некоторые грубые сломанные старые реализации.

function reloadImage(imageId)
{
   path = '../showImage.php?cache='; //for example
   imageObject = document.getElementById(imageId);
   imageObject.src = path   (new Date()).getTime();
}
<img src='../showImage.php' id='myimage' />

<br/>

<input type='button' onclick="reloadImage('myimage')" />

В итоге я заставил сервер сопоставить любой запрос изображения в этом каталоге с источником, который я пытался обновить. Затем мой таймер добавил число в конец имени, чтобы DOM увидел его как новое изображение и загрузил его.

Например.

http://localhost/image.jpg
//and
http://localhost/image01.jpg

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

var newImage = new Image();
newImage.src = "http://localhost/image.jpg";
var count = 0;
function updateImage()
{
    if(newImage.complete) {
        document.getElementById("theText").src = newImage.src;
        newImage = new Image();
        newImage.src = "http://localhost/image/id/image"   count     ".jpg";
    }
    setTimeout(updateImage, 1000);
}
document.getElementById("img-id").src = document.getElementById("img-id").src

установить свой собственный src в качестве src.

Попробуйте использовать бесполезную строку запроса, чтобы сделать ее уникальной ссылкой:

function updateImage()
{
    if(newImage.complete) {
        document.getElementById("theText").src = newImage.src;
        newImage = new Image();
        number  ;
        newImage.src = "http://localhost/image.jpg?"   new Date();
    }

    setTimeout(updateImage, 1000);
}

, который у меня был требование: 1) не может добавить ?var=xx к изображению 2) она должна работать в кросс-домене

Мне действительно нравится опция # 4 в . Он включает интерфейс на основе Java, который определяет URL-адреса и упрощает доступ к ним. с одним, но:

  • , у нее есть проблемы с надежной работой с междоменным доменом (и она требует прикосновения к коду сервера).

Мой быстрый и грязный способ:

  1. Создать скрытый iframe
  2. Загрузите в нее текущую страницу (да, всю страницу)
  3. iframe.contentWindow.location.reload(true);
  4. Переустановите источник изображения на себя

Вот это

function RefreshCachedImage() {
    if (window.self !== window.top) return; //prevent recursion
    var $img = $("#MYIMAGE");
    var src = $img.attr("src");
    var iframe = document.createElement("iframe");
    iframe.style.display = "none";
    window.parent.document.body.appendChild(iframe);
    iframe.src = window.location.href;
    setTimeout(function () {
        iframe.contentWindow.location.reload(true);
        setTimeout(function () {
            $img.removeAttr("src").attr("src", src);
        }, 2000);
    }, 2000);
}

Да, я знаю, setTimeout … Вы должны изменить это на надлежащие события onload.

Ответ: ДА!

function reloadImage(imageId) {
   imgName = 'vishnu.jpg'; //for example
   imageObject = document.getElementById(imageId);
   imageObject.src = imgName;
}

<img src='vishnu.jpg' id='myimage' />

<input type='button' onclick="reloadImage('myimage')" />

Я решил эту проблему, отправив данные обратно через сервлет.

response.setContentType("image/png");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.setDateHeader("Expires", 0);

BufferedImage img = ImageIO.read(new File(imageFileName));

ImageIO.write(img, "png", response.getOutputStream());

Затем со страницы вы просто даете ему сервлет с некоторыми параметрами, чтобы получить правильный файл изображения.

<img src="YourServlet?imageFileName=imageNum1">

Вот мое решение. Это очень просто Кадровое планирование может быть лучше.

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">      
        <title>Image Refresh</title>
    </head>

    <body>

    <!-- Get the initial image. -->
    <img id="frame" src="frame.jpg">

    <script>        
        // Use an off-screen image to load the next frame.
        var img = new Image();

        // When it is loaded...
        img.addEventListener("load", function() {

            // Set the on-screen image to the same source. This should be instant because
            // it is already loaded.
            document.getElementById("frame").src = img.src;

            // Schedule loading the next frame.
            setTimeout(function() {
                img.src = "frame.jpg?"   (new Date).getTime();
            }, 1000/15); // 15 FPS (more or less)
        })

        // Start the loading process.
        img.src = "frame.jpg?"   (new Date).getTime();
    </script>
    </body>
</html>

, делая возможным произвольное и потенциально опасное выполнение скрипта. document.write вывод будет: src В iframe В вышеприведенном примере

ниже написано в typescript и использует angular $ q библиотека обещаний, просто к вашему сведению, но должна быть достаточно простой для переноса на ванильный javascript. Метод предназначен для жизни внутри машинописного класса.

Возвращает обещание, которое будет разрешено после завершения перезагрузки iframe. Не проверено, но у нас хорошо работает.

    mmForceImgReload(src: string): ng.IPromise<void> {
        var deferred = $q.defer<void>();
        var iframe = window.document.createElement("iframe");

        var firstLoad = true;
        var loadCallback = (e) => {
            if (firstLoad) {
                firstLoad = false;
                iframe.contentWindow.location.reload(true);
            } else {
                if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
                deferred.resolve();
            }
        }
        iframe.style.display = "none";
        window.parent.document.body.appendChild(iframe);
        iframe.addEventListener("load", loadCallback, false);
        iframe.addEventListener("error", loadCallback, false);
        var doc = iframe.contentWindow.document;
        doc.open();
        doc.write('<html><head><title></title></head><body><img src="'   src   '"></body></html>');
        doc.close();
        return deferred.promise;
    }
<img src='someurl.com/someimage.ext' onload='imageRefresh(this, 1000);'>

Затем ниже в некотором javascript

<script language='javascript'>
 function imageRefresh(img, timeout) {
    setTimeout(function() {
     var d = new Date;
     var http = img.src;
     if (http.indexOf("&d=") != -1) { http = http.split("&d=")[0]; } 

     img.src = http   '&d='   d.getTime();
    }, timeout);
  }
</script>

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

Я использовал приведенную ниже концепцию: сначала связать изображение с ложным (буферным) URL-адресом, а затем — с действительным URL-адресом.

imgcover.ImageUrl = ConfigurationManager.AppSettings["profileLargeImgPath"]   "Myapp_CoverPic_"   userid   "Buffer.jpg";

imgcover.ImageUrl = ConfigurationManager.AppSettings["profileLargeImgPath"]   "Myapp_CoverPic_"   userid   ".jpg";

Таким образом, я заставляю браузер обновлять действительный URL.