WebSocket에서 base64 이미지 데이터를 가져 와서 사용자에게 표시하는 HTML 페이지가 있습니다. 이미지는 주기적으로 변경되며 (새 base64 이미지가 소켓을 통해 푸시 됨) 새 이미지를 디코딩 한 다음 사용자에게 표시해야합니다.Javascript가 브라우저에서 오래된 이미지를 정리하지 않습니다.
현재 문제는 이미지를 업데이트 한 후에 이전 이미지가 브라우저의 메모리에서 삭제되지 않는 것입니다. 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>
캐시 침수와 관련된 답변을 제안한 이유에 대해 혼란 스럽습니다. 정확히 처음 문제가 무엇인지 알기 때문입니다. 기존의 캐시 된 이미지가 새 이미지와 같으면 이미지를 다시로드 할 필요가 없도록 한 이미지 (또는 아마도 과거 5 또는 10 이미지)를 캐시하는 것을 선호합니다. 이것이 가능한가? – BSchlinker
이 작업을 수행하는 유일한 방법은 이전에 no-cache 또는 cache expiration time으로 이미지를 제공하여 다음 번에 가져올 때 원래의 캐시 된 복사본을 덮어 쓰게하는 것입니다. 그러나 리소스 추적을 설정하면 일반 캐시 규칙이 더 이상 적용되지 않습니다. 리소스 추적을 수행 했으므로 캐시가없는 경우에도이 리소스가 표시됩니다. 덮어 쓸 수 있습니다. 나는 이것을 위해 imageservice 스크립트를 사용한다. ", false) });
관련 문제