2017-04-08 5 views
0

나는 JQuery와 "슬라이드 쇼"를 사용하여 애니메이션을 만든에서 요청하는 이미지를 유지합니다. 이 기능은 100 밀리 초로 설정된 속도로 62 개의 이미지를 뒤집습니다. 문제는,입니다 크롬 개발자 도구 쇼, 함수가 각주기 위해 또 다시 서버에서 이미지를 요청하는 대신 캐시를 사용하여 유지있다. 픽처 모두 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> 
그때 이미지를 미리로드 기능을 사용하여 시도이 완벽 크롬에서 대부분의 시간을 작동하지만 페이지가 바로로드 된 후, 슬라이드 쇼 기능이 때때로 무작위에서 직접 이미지를 가져 오는 시작합니다

서버에 미리로드하는 대신 미리 슬라이드 쇼 코드 앞에 배치했습니다. 프리로드는 Firefox, Internet Explorer 또는 Edge에서 작동하지 않습니다. 나는 사파리를 시도하지 않았다.

<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 요청 헤더.

나는 크롬 개발 도구는 전송 된 데이터의 양이 실제로 애니메이션을 통해 처음 실행 한 후, 최대하지 않을 것을 같이 요청이 캐시를 무시 더 이상 것을 완전히 확실하지 않다. 내가 여기서 누락 된 것은 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 "모두를 HAR로 복사"를 사용했습니다. –

+0

이것은 도움이 될 수 있습니다. http://stackoverflow.com/questions/3712234/caching-dynamically-loaded-images –

답변

0

을 가로 질러왔다. 이미지가 올바르게 캐시됩니다. 그러나 우리가 이야기하는 애니메이션을 보면 DOM 기반의 JavaScript 애니메이션이 최선의 선택이 아닐 수도 있습니다.

Cache-ControlExpires 같은 HTTP 헤더가 응답으로 명시 적으로 최신 정보가 없지만 브라우저는 여전히 발견 적 신선도를 사용하여 캐시합니다. 응답 bodySize이 0이면 캐시에서 온 것입니다. 아마 당신은 (디스크 캐시에서) Chrome Dev Tools Network 탭의 크기 열의 레이블을 볼 수 있습니다. 또한 일부 요청은 List of available images 또는 메모리 캐시에 충돌 할 수 있습니다.

귀하의 경우 이러한 모든 DOM 조작은 단일 애니메이션 GIF 파일 및 단일 img 노드로 대체 될 수 있습니다. 웹에서 애니메이션을 만드는 다른 많은 방법이 있습니다. 그래픽 디자인 스택 교환에 대한 What's the best way to animate an illustration for the web? 토론을 확인하십시오. 자세한 내용 확인을 위해

:

+0

감사합니다. @ 도움 감사합니다. 나는 애니메이션을 gif로 바꿨고 훨씬 더 효과적입니다. –

0

서버 쪽 및 클라이언트 쪽 캐싱을 시도 했습니까? 나는 그들 모두를 들여다 볼 것이다.

DOM은 모든 자바 스크립트가 실행되기 전에 먼저로드됩니다. 따라서 이미지를로드하고 CSS를 사용하여 뷰에서 숨기고 스크립트가 실행될 때 모든 이미지를로드해야합니다.

나는 캐싱에 동적으로로드 된 이미지를 보면서 당신은 네트워크 정보를 잘못 해석 new Image() here