Javascript не очищает старые изображения в браузере - PullRequest
1 голос
/ 15 мая 2011

У меня есть HTML-страница, которая берет данные изображения base64 из WebSocket и затем отображает их пользователю. Изображение периодически изменяется (новое изображение base64 помещается поверх сокета), поэтому новое изображение должно быть декодировано и затем отображено пользователю.

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

Есть идеи, как это можно решить? Я вставил фрагмент кода ниже.

<html>
<head>
<title>Presenter</title>

<style>
 html,body{font:normal 0.9em arial,helvetica;text-align:center;}
#dynamicImage { margin:0px auto; }
</style>

<script type="text/javascript">
function handleMessage(data) {
    switch(data.type) {
        case 'imageUpdate':         
            // replace the image            
            $('#dynamicImage').attr({
                'src': "data:image/jpeg;base64," + data.image,
            }); 
            break;
    }
}
</script>
</head>

<body>  
 <div id="dynamicImageWrapper">
    <img id="dynamicImage" src="./WhitePixel45w.jpg" />
</div>
</body>
</html>

1 Ответ

1 голос
/ 15 мая 2011

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

Другой вариант требует гораздо меньше усилий: вместо получения изображения "image.jpg", получите изображение "image.jpg? T =", потому что для браузера это новый URL каждый раз.

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

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