更改图像时使用简单的幻灯片代码进行内存泄漏
Memory leak with simple slideshow code when changing image
JavaScript 的初学者。我制作了一个简单的幻灯片脚本,它通过更改 imgcontainer div 上背景图像的 CSS 来发挥作用。下面是我的代码和 HTML.
的简化版本
<!DOCTYPE html>
<html lang="en">
<body>
<div id="imgcontainer" style="background-image: url(img/slider/image1.jpg); width: 500px; height: 500px;">
</div>
<button id="previmg" onclick="changePage(1)">Prev img</button>
<button id="nextimg" onclick="changePage(0)">Next img</button>
</body>
<script type="text/javascript">
var element = document.getElementById("imgcontainer");
var timer = setTimeout(autoPage, 5000);
var images = ["img/slider/image1.jpg","img/slider/image2.jpg","img/slider/image3.jpg","img/slider/image4.jpg","img/slider/image5.jpg","img/slider/image6.jpg","img/ slider/image7.jpg","img/slider/image8.jpg"];
var currentImage = 1;
function autoPage() {
if (currentImage === images.length) {
element.style.backgroundImage = "url(" + images[0] + ")";
currentImage = 1;
} else {
element.style.backgroundImage = "url(" + images[currentImage] + ")";
currentImage ++;
}
timer = setTimeout(autoPage, 5000);
console.log("image autopaged to page " + currentImage + ", image src now: " + images[currentImage - 1]);
}
function changePage(i) {
clearTimeout(timer);
if (i === 0) {
if (currentImage === images.length) {
element.style.backgroundImage = "url(" + images[0] + ")";
currentImage = 1;
} else {
element.style.backgroundImage = "url(" + images[currentImage] + ")";
currentImage ++;
}
} else if (i === 1) {
if (currentImage === 1) {
element.style.backgroundImage = "url(" + images[images.length - 1] + ")";
currentImage = images.length;
} else {
element.style.backgroundImage = "url(" + images[currentImage - 2] + ")";
currentImage --;
}
}
timer = setTimeout(autoPage, 5000);
console.log("image paged to page " + currentImage + ", image src now: " + images[currentImage - 1]);
}
</script>
</html>
幻灯片本身似乎运行良好...除了它在 Chrome 中存在的巨大内存泄漏。每次图像更改时,选项卡内存使用量都会大量增加,有时是 10mb,有时是 50mb。这种趋势一直持续到内存使用量似乎在某个特定点达到上限。
Firefox 似乎没有表现出这种行为,而是在完全没有内存问题的情况下循环浏览图像。
这是我编码中的一些弱点,还是 Chrome 问题?我试过设置背景图片 CSS 和直接设置图片标签的来源。
非常感谢对此问题的任何帮助或对代码本身的评论!
这是一个 Chrome 的东西,它设置背景图像并将旧图像保存在缓存中以供重复使用。
但是:当加载之前显示的图像时,内存不应增加。
我觉得你的代码没问题。
就我个人而言,我希望这略有不同。如果你想为此使用 javascript ,可以通过以下方式更方便地进行:
对于您要展示的每张图片:创建一张图片(如下所示:https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/Image)
var myImage = new Image(100, 200);
myImage.src = 'picture.jpg';
然后在循环中,告诉另一个函数将图像设置为当前想要的图像:
function SetImage(wantedUrl){
// here put the image inside the div
}
JavaScript 的初学者。我制作了一个简单的幻灯片脚本,它通过更改 imgcontainer div 上背景图像的 CSS 来发挥作用。下面是我的代码和 HTML.
的简化版本<!DOCTYPE html>
<html lang="en">
<body>
<div id="imgcontainer" style="background-image: url(img/slider/image1.jpg); width: 500px; height: 500px;">
</div>
<button id="previmg" onclick="changePage(1)">Prev img</button>
<button id="nextimg" onclick="changePage(0)">Next img</button>
</body>
<script type="text/javascript">
var element = document.getElementById("imgcontainer");
var timer = setTimeout(autoPage, 5000);
var images = ["img/slider/image1.jpg","img/slider/image2.jpg","img/slider/image3.jpg","img/slider/image4.jpg","img/slider/image5.jpg","img/slider/image6.jpg","img/ slider/image7.jpg","img/slider/image8.jpg"];
var currentImage = 1;
function autoPage() {
if (currentImage === images.length) {
element.style.backgroundImage = "url(" + images[0] + ")";
currentImage = 1;
} else {
element.style.backgroundImage = "url(" + images[currentImage] + ")";
currentImage ++;
}
timer = setTimeout(autoPage, 5000);
console.log("image autopaged to page " + currentImage + ", image src now: " + images[currentImage - 1]);
}
function changePage(i) {
clearTimeout(timer);
if (i === 0) {
if (currentImage === images.length) {
element.style.backgroundImage = "url(" + images[0] + ")";
currentImage = 1;
} else {
element.style.backgroundImage = "url(" + images[currentImage] + ")";
currentImage ++;
}
} else if (i === 1) {
if (currentImage === 1) {
element.style.backgroundImage = "url(" + images[images.length - 1] + ")";
currentImage = images.length;
} else {
element.style.backgroundImage = "url(" + images[currentImage - 2] + ")";
currentImage --;
}
}
timer = setTimeout(autoPage, 5000);
console.log("image paged to page " + currentImage + ", image src now: " + images[currentImage - 1]);
}
</script>
</html>
幻灯片本身似乎运行良好...除了它在 Chrome 中存在的巨大内存泄漏。每次图像更改时,选项卡内存使用量都会大量增加,有时是 10mb,有时是 50mb。这种趋势一直持续到内存使用量似乎在某个特定点达到上限。
Firefox 似乎没有表现出这种行为,而是在完全没有内存问题的情况下循环浏览图像。
这是我编码中的一些弱点,还是 Chrome 问题?我试过设置背景图片 CSS 和直接设置图片标签的来源。
非常感谢对此问题的任何帮助或对代码本身的评论!
这是一个 Chrome 的东西,它设置背景图像并将旧图像保存在缓存中以供重复使用。 但是:当加载之前显示的图像时,内存不应增加。
我觉得你的代码没问题。
就我个人而言,我希望这略有不同。如果你想为此使用 javascript ,可以通过以下方式更方便地进行: 对于您要展示的每张图片:创建一张图片(如下所示:https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/Image)
var myImage = new Image(100, 200);
myImage.src = 'picture.jpg';
然后在循环中,告诉另一个函数将图像设置为当前想要的图像:
function SetImage(wantedUrl){
// here put the image inside the div
}