我想从ipCamera获取最后一张图片,我的功能是这样的。 基本上,一个图像加载后。然后立即重新开始循环()。我不想使用AJAX。
var toggle= function(_imageUrl ) { //refresh include and adjust
var img = document.getElementById('image');
var updater = function(){
var time = Date.now();
var loop = function() {
ImageURL = _imageUrl + '&' + time;
console.log(time)
img.setAttribute("src", imageURL);
ImageURL = ''; //set the image.src to empty
img.addEventListener('load', function() {
setTimeout(updater ,100)
}, false);
};
loop();
}
updater();
};
此函数工作正常,但显然,Date.now()在每个加载时间继续堆叠。这是console.log(time);
的结果 First Loop:
1417935798237
Second loop:
1417935798237
1417935798925
ThirdLoop (as it took longer to load), thus the time stack more
1417935798925
1417935800057
1417935800057
1417935801226
1417935801227
1417935801228
1417935801228
在渲染最后一个图像之前,该函数必须通过每个循环评估更多项目,最后它仍然传递最后一个图像,但是通过第20个循环。清单是巨大的
问题:
1.发生了什么?
2.如何将Date.now()仅设置为最后一个时间戳?
答案 0 :(得分:2)
每次调用loop
时,由于img.addEventListener
调用,都会添加另一个eventListener。当图像的url发生更改(导致浏览器重新加载图像)时,将调用eventListener。该eventListener只应添加一次。将其移到loop
函数之外。
var toggle= function(_imageUrl ) { //refresh include and adjust
var img = document.getElementById('image');
img.addEventListener('load', function() {
setTimeout(loop ,100)
}, false);
var loop = function() {
var time = Date.now();
imageURL = _imageUrl + '&' + time;
console.log(time)
img.setAttribute("src", imageURL);
imageURL = ''; //set the image.src to empty
};
loop();
};
答案 1 :(得分:1)
因为你在每个循环中重复使用相同的img
对象,所以每次循环时都会向它添加越来越多的事件监听器,因此当它加载时,它不只是调用你的循环一次,但N次。
您可能想要做的是将事件监听器的添加移动到循环外部,因此只添加一次。
您需要在您想要支持的任何旧浏览器中仔细测试此代码,因为几年前,我发现在同一load
上多次触发img
个事件时出现了一些可靠性问题对象
此外,您的代码中包含对_imageURL
和imageURL
的引用。这些应该是不同的吗?