2017-04-08 51 views
0

我已经使用JQuery“幻灯片”创建了一个动画。该功能以100毫秒的速度翻转62张图像。问题是,Chrome开发人员工具显示,该功能不断地从服务器一遍又一遍地向每个周期请求图像,而不是使用缓存。 图片都有相同的大小32.2 KB,也有相同的尺寸。网站上有大约20种动画,您可以在这里看到一个测试版本:link。动画是20个小指标,位于页面中间的蓝色区域。功能不断从服务器请求图像,而不是缓存

的代码可以看到下面:

<script type="text/javascript">  

function slideShow(id, index, imagePath, lastImage, fadeTime) { 

    $('#slideShowBack'+id).show(); 
    index = (index == lastImage) ? 1 : index + 1; 
    $("#slideShowBack"+id).attr("src", imagePath + "/" + index + ".png") 
    setTimeout('slideShow(' + '"'+ id + '"' + ',' + index + ',' + '"'+ imagePath + '"' +', ' + lastImage + ', ' + fadeTime + ')', fadeTime); 
    } 

    $(document).ready(function() { 
    slideShow('SovSeng', 1, 'images', 62, 100); 
    }); 
</script> 
</head> 
<body> 
    <img id="slideShowBackSovSeng" src="" /> 

我也尝试了不同的方法,这仅成功地在第一周期从服务器请求的图像,但在做的过程闪现的第一个周期/闪烁非常明显图像之间。

<script type="text/javascript"> 

    var imagePath = "images"; 
    var lastImage = 62; 
    var removeAfter = 100; 

    function slideShow(index) { 
     var url = imagePath + "/" + index + ".png"; 
     $("#slideShow").prepend($("<img/>").attr("src",url)); 
     $("#slideShow img:last").remove(); 
      setTimeout(function() { 
       slideShow((index % lastImage) + 1) 
      }, removeAfter); 
    } 

    $(document).ready(function() { 
     setTimeout(function() { slideShow(1); }, removeAfter); 
    }); 

    </script> 
    </head> 
    <body> 
     <div id="slideShow"> 
      <img id="slideShow" src="images/1.png" /> 
     </div> 

然后我用一个函数来预载的图片试图和这个完美的作品大部分在Chrome的时间,但该页面刚刚被加载后,幻灯片功能有时会随机启动直接从获取的图像服务器,而不是预加载它们。我在幻灯片代码之前放置了预加载。预加载无法在Firefox,Internet Explorer或Edge上运行。我还没有试过Safari。

<script type="text/javascript"> 

function preloadImages(array) { 
    if (!preloadImages.list) { 
     preloadImages.list = []; 
    } 
    var list = preloadImages.list; 
    for (var i = 0; i < array.length; i++) { 
     var img = new Image(); 
     img.onload = function() { 
     var index = list.indexOf(this); 
     if (index !== -1) { 
      list.splice(index, 1); 
     } 
     } 
     list.push(img); 
     img.src = array[i]; 
    } 
} 

preloadImages(["images/1.png", "images/2.png", "images/3.png", etc.. ]); 

</script> 

所以我的问题是我可以停止我的函数的第一个代码示例进行无限的请求到服务器或者可以改善我的代码在我的第二个例子,使其停止闪烁/闪烁在做第一次运行?

编辑:来自第一个代码示例中的函数的图像请求的HTTP标头。

我不完全相信请求会绕过缓存,因为Chrome开发工具显示,在第一次运行动画之后,传输的数据量实际上并没有增加。我在这里丢失了什么,HTTP请求是否被重定向到缓存?

{ 
    "startedDateTime": "2017-04-11T21:05:11.260Z", 
    "time": 0, 
    "request": { 
     "method": "GET", 
     "url": "http://fiskervej.com/tody/images/31.png", 
     "httpVersion": "unknown", 
     "headers": [], 
     "queryString": [], 
     "cookies": [], 
     "headersSize": -1, 
     "bodySize": 0 
    }, 
    "response": { 
     "status": 200, 
     "statusText": "OK", 
     "httpVersion": "unknown", 
     "headers": [ 
     { 
      "name": "Date", 
      "value": "Tue, 11 Apr 2017 21:02:44 GMT" 
     }, 
     { 
      "name": "Last-Modified", 
      "value": "Wed, 05 Apr 2017 04:49:17 GMT" 
     }, 
     { 
      "name": "Server", 
      "value": "Apache" 
     }, 
     { 
      "name": "Accept-Ranges", 
      "value": "bytes" 
     }, 
     { 
      "name": "Content-Length", 
      "value": "33266" 
     }, 
     { 
      "name": "Content-Type", 
      "value": "image/png" 
     } 
     ], 
     "cookies": [], 
     "content": { 
     "size": 33266, 
     "mimeType": "image/png" 
     }, 
     "redirectURL": "", 
     "headersSize": -1, 
     "bodySize": 0, 
     "_transferSize": 0 
    }, 
    "cache": {}, 
    "timings": { 
     "blocked": -1, 
     "dns": -1, 
     "connect": -1, 
     "send": 0, 
     "wait": 0, 
     "receive": 0, 
     "ssl": -1 
    }, 
    "serverIPAddress": "144.208.78.49", 
    "pageref": "page_1" 
    }, 
+0

您能不能告诉我们HTTP一个图像请求和响应的头该浏览器不缓存?您可以使用Chrom DevTools [全部复制为HAR](https://developers.google.com/web/tools/chrome-devtools/network-performance/reference#copy)。 –

+0

嗨@LeonidVasilyev谢谢你的回复。我添加了一个图片请求的例子。我使用Chrome DevTools“Copy All as HAR”。 –

+0

这可能是一些帮助http://stackoverflow.com/questions/3712234/caching-dynamically-loaded-images –

回答

0

来到你曲解的网络信息。图像被正确缓存。但看看我们谈论的动画,基于DOM的JavaScript动画可能不是最佳选择。

尽管缺乏明确的新鲜度信息,例如Cache-ControlExpires HTTP标头作为响应,但浏览器仍然使用启发式新鲜度将其缓存。响应的bodySize等于0意味着它来自缓存。可能您可以在Chrome开发工具网络选项卡的大小列中看到(从磁盘缓存中)标签。还有一些请求可能会命中List of available images或内存高速缓存。

在我看来,在你的情况下,所有这些DOM操作都可以用单个动画GIF文件和单个节点来代替。还有很多其他的方法来为Web做动画。您可能需要检查What's the best way to animate an illustration for the web?关于Graphic Design Stack Exchange的讨论。

欲了解更多信息检查:

+0

谢谢@Leonid的帮助。我将动画改为gif,这样做效果更好。 –

0

您是否尝试过服务器端和客户端缓存?我会考虑他们两个。

的DOM将执行任何JavaScript之前,所有的方法会首先加载,所以你可以做的是加载图像和使用CSS将其隐藏起来,然后在脚本得到执行的所有加载图像。

我看着缓存动态加载图片和整个new Image()here