从Javascript将图像作为base64调用加载
我正试图通过django Web服务器实现一个小型照片展示。在下面,您可以找到将图片加载到图像数组并每x毫秒更改一次图像的javascript代码。如果我只从django服务器加载一张图片(没有循环),它就可以工作,但它停止使用任何类型的循环 我很想知道为什么它不能以这种方式工作,并且非常乐意收到关于代码改进的其他反馈。我还不太熟悉ajax调用 此外:Django模板引擎提供了简化模板中使用的URL的简单方法。有没有办法在.js文件中也使用从Javascript将图像作为base64调用加载,javascript,ajax,django,Javascript,Ajax,Django,我正试图通过django Web服务器实现一个小型照片展示。在下面,您可以找到将图片加载到图像数组并每x毫秒更改一次图像的javascript代码。如果我只从django服务器加载一张图片(没有循环),它就可以工作,但它停止使用任何类型的循环 我很想知道为什么它不能以这种方式工作,并且非常乐意收到关于代码改进的其他反馈。我还不太熟悉ajax调用 此外:Django模板引擎提供了简化模板中使用的URL的简单方法。有没有办法在.js文件中也使用{{%url%}标记 window.images = [
{{%url%}
标记
window.images = [];
window.current = 0;
window.imageCount = 2;
function loadImages(){
for(var i = 0; i < window.imageCount; i++){
loadNextImage(i);
}
showImage();
}
function loadNextImage(i) {
// https://wiki.selfhtml.org/wiki/JavaScript/XMLHttpRequest/
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
window.images.push("data:image/jpeg;base64," + xmlhttp.responseText);
}
};
xmlhttp.open('GET', "http://127.0.0.1:8000/mirror/"+i);
xmlhttp.send(null);
}
function showImage() {
if(window.current >= window.imageCount){
window.current = 0;
}
alert("current window count = "+ window.current);
document.getElementById('imgshow').src = window.images[window.current];
window.current = window.current + 1;
setTimeout(showImage, 50000);
}
window.images=[];
window.current=0;
window.imageCount=2;
函数loadImages(){
对于(var i=0;i=window.imageCount){
window.current=0;
}
警报(“当前窗口计数=“+window.current”);
document.getElementById('imgshow').src=window.images[window.current];
window.current=window.current+1;
设置超时(showImage,50000);
}
您遇到的直接问题是因为XMLHttpRequest
是异步的,并且您正在处理竞争条件。下面是您的代码现在正在执行的操作:
XMLHttpRequests
document.getElementById('imgshow').src=window.images[window.current]代码>因为窗口。图像
为空李>
setTimeout(showImage,50000)由于步骤3出现异常,代码>从未执行
将setTimeout
移动到document.getElementById('imgshow').src=window.images[window.current]上方代码>行可能会工作。然而,这是一个坏主意。
一种解决方案是完全删除循环,并延迟加载图像(仅在需要时加载图像),如下所示:
window.images=[];
window.current=0;
window.imageCount=2;
函数loadNextImage(i,回调){
// https://wiki.selfhtml.org/wiki/JavaScript/XMLHttpRequest/
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=函数(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
push(“数据:image/jpeg;base64,”+xmlhttp.responseText);
callback.call();
}
};
xmlhttp.open('GET','http://127.0.0.1:8000/mirror/“+i);
xmlhttp.send(空);
}
//增加图像计数器并在需要时加载图像。
函数stepImage(){
//如果已到达图像的末尾,请重新启动。
如果(window.current>=window.imageCount){
window.current=0;
}
//确保图像已加载到图像数组中,
//如果没有,请加载图像,然后显示它。
如果(window.images.length您遇到的直接问题是因为XMLHttpRequest
是异步的,并且您正在处理竞争条件。下面是您的代码现在正在执行的操作:
启动一个循环,并告诉浏览器查询2XMLHttpRequests
执行showImage方法(尽管我们不知道上面的2个AJAX请求是否已经返回)
在此行引发异常:document.getElementById('imgshow').src=window.images[window.current];
因为window.images
为空
setTimeout(showImage,50000);
从未执行,因为步骤3出现异常
将setTimeout
移动到document.getElementById('imgshow').src=window.images[window.current];
行上方可能会起作用。但是,这是个坏主意。
一种解决方案是完全删除循环,并延迟加载图像(仅在需要时加载图像),如下所示:
window.images=[];
window.current=0;
window.imageCount=2;
函数loadNextImage(i,回调){
// https://wiki.selfhtml.org/wiki/JavaScript/XMLHttpRequest/
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=函数(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
push(“数据:image/jpeg;base64,”+xmlhttp.responseText);
callback.call();
}
};
xmlhttp.open('GET','http://127.0.0.1:8000/mirror/“+i);
xmlhttp.send(空);
}
//增加图像计数器并在需要时加载图像。
函数stepImage(){
//如果已到达图像的末尾,请重新启动。
如果(window.current>=window.imageCount){
window.current=0;
}
//确保图像已加载到图像数组中,
//如果没有,请加载图像,然后显示它。
if(window.images.length非常感谢您的支持!它现在可以工作了。您处理异步活动的方式读起来非常流畅。这将帮助我提高js代码的质量。但我没有注意到异常情况。:)非常感谢您的支持!它现在可以工作了。您处理异步活动的方式读起来非常顺利。这将有助于我提高js代码的质量。但我没有注意到异常情况。:)