jQuery에서 요소 (이미지)를 다시로드 / 새로 고치는 방법


262

jQuery를 사용하여 서버에서 동일한 파일 이름의 이미지를 다시로드 할 수 있습니까?

예를 들어, 페이지에 이미지가 있지만 실제 이미지는 사용자 작업에 따라 변경 될 수 있습니다. 이는 파일 이름 변경이 아니라 실제 파일 자체를 의미합니다.

즉 :

  • 기본 페이지에서 사용자보기 이미지
  • 사용자가 새 이미지를 업로드
  • 페이지의 기본 이미지가 변경되지 않습니다 (파일 이름이 동일하기 때문에 브라우저가 캐시 된 버전을 사용합니다)

아래 코드가 얼마나 자주 호출되는지에 관계없이 동일한 문제가 지속됩니다.

$("#myimg").attr("src", "/myimg.jpg");

jQuery 문서에서 "로드"함수는 콜백 함수를 요소의 성공 / 완료로드에 바인딩하는 대신 이벤트를 발생시키는 기본 방법이 있다면 완벽합니다.

도움을 주시면 감사하겠습니다.


1
@Alexis, 이미지가 브라우저에 캐시되어 서버에서 변경된 후에 업데이트되지 않는 문제입니까?
jay

1
@ jeerose, 나는 파일이 실제로 변경 (같은 파일 이름)하고 전체 페이지를 새로 고치면 페이지에 반영되므로 이것이 문제라고 생각합니다.
Alexis Abril

답변:


551

브라우저가 이미지를 캐싱하는 것처럼 들립니다 (이제 질문에 썼습니다). 다음과 같은 추가 변수를 전달하여 브라우저가 이미지를 다시로드하도록 할 수 있습니다.

d = new Date();
$("#myimg").attr("src", "/myimg.jpg?"+d.getTime());

1
쿼리 문자열 변수를 추가하면 마음이 완전히 전달되었습니다. 이로 인해 문제가 해결되었으며 요청시 이미지가 다시로드됩니다.
Alexis Abril

45
갱스터 팁, 사랑
Dave Jellison

4
작동하지만 좋은 해결 방법이지만 여전히 해결 방법입니다! 브라우저에게 캐시 된 이미지를 잊어 버리도록 알리는 다른 방법은 없는가?
spuas

매개 변수가 포함 된 정적 이미지 요청을 금지하는 정말 까다로운 웹캠이 있습니다. 어. 그렇지 않으면 훌륭한 솔루션입니다.
dangowans 2013

3
@TomasGonzalez B /가 c를 하다 와의 충돌을 얻기의 기회 random, 그리고 이제까지 안 Date당신이 아니라면 정말 정말 빠른. ; ^) 클라이언트에서 날짜를 얻는 것이 자원 집약적이지 않으므로 한 번에 가져 오는 데 필요한만큼의 이미지를 재사용 할 수 있으므로 4 단계로 진행하십시오.
ruffin

57

아마도 가장 좋은 방법은 아니지만 JavaScript를 사용하여 이미지 URL에 타임 스탬프를 추가하여 과거 에이 문제를 해결했습니다.

$("#myimg").attr("src", "/myimg.jpg?timestamp=" + new Date().getTime());

다음에로드 할 때 타임 스탬프는 현재 시간으로 설정되고 URL이 다르므로 브라우저는 캐시 된 버전을 사용하는 대신 이미지에 대해 GET을 수행합니다.


2
이것은 수년간 나에게 효과가 있었지만 오늘 파일 이름이 정확하지 않으면 내 이미지 서버 (나에 의해 제어되지 않음)가 깨진 링크를 반환하기 시작했습니다. 누구든지 다른 해결 방법이 있다면 대단히 감사하겠습니다. 불행히도이 스레드의 모든 대답은 이것에 대한 변형입니다.
felwithe

@felwithe,이 서버는 쿼리가 끝날 때만 확장을 찾고 있습니까? 그래서 당신은이 방법을 테스트하기 위해 시도 할 수 있습니다 : imagename.jpg?t=1234567&q=.jpgimagename.jpg#t1234567.jpg
FlameStorm

26

이것은 당신이 언급 한 두 가지 문제 중 하나 일 수 있습니다.

  1. 서버가 이미지를 캐시하고 있습니다
  2. jQuery가 실행되지 않거나 적어도 속성을 업데이트하지 않습니다

솔직히 말하면 2 위라고 생각합니다. 더 많은 jQuery를 볼 수 있다면 훨씬 쉬울 것입니다. 그러나 시작하려면 먼저 속성을 제거한 다음 다시 설정하십시오. 그것이 도움이되는지 확인하십시오.

$("#myimg").removeAttr("src").attr("src", "/myimg.jpg");

이것이 작동하더라도 최적이 아니기 때문에 일부 코드를 게시하십시오 (imo :-)


@ Kordonme, 누군가가 "bad"jQuery에 대해 언급하는 곳입니까? (농담이야, 농담이야);)
jay

@ Kordonme, 이것은 실제로 이벤트 핸들러에 보관되며 현재 유일한 코드 줄입니다. 이벤트가 실제로 발생하는지 확인하기 위해이 줄 바로 앞에 경고를 추가했습니다. 오류없이 이벤트가 발생합니다.
Alexis Abril

3
매개 변수가 포함 된 정적 이미지 요청을 금지하는 정말 까다로운 웹캠이 있습니다. 어. 이것은 내 독특한 사례에 대한 훌륭한 솔루션입니다. 감사.
dangowans 2013

잔차 매개 변수를 원하지 않거나 필요로하지 않는 경우에 가장 적합한 답변입니다.
RafaSashi

감사합니다.이 기능이 도움이되었습니다 (Chrome에서만 캐시했습니다)
Daniel Resch

14

이미지 src를 자바 스크립트로 하드 코딩하는 것에 대해 걱정하지 않고 한 줄로 (아이디어에 대한 jeerose 감사) :

$("#myimg").attr("src", $("#myimg").attr("src")+"?timestamp=" + new Date().getTime());

13
URL 끝에 더 많은 문자를 무한정 추가 할 수 있으므로주의하십시오
Alfo

9

바이 패스 캐싱 이미지 URL에 무한 타임 스탬프를 추가하지, 새로운 하나를 추가하기 전에 이전의 타임 스탬프를 제거, 이것은 내가했던 방법이다.

//refresh the image every 60seconds
var xyro_refresh_timer = setInterval(xyro_refresh_function, 60000);

function xyro_refresh_function(){
//refreshes an image with a .xyro_refresh class regardless of caching
    //get the src attribute
    source = jQuery(".xyro_refresh").attr("src");
    //remove previously added timestamps
    source = source.split("?", 1);//turns "image.jpg?timestamp=1234" into "image.jpg" avoiding infinitely adding new timestamps
    //prep new src attribute by adding a timestamp
    new_source = source + "?timestamp="  + new Date().getTime();
    //alert(new_source); //you may want to alert that during developement to see if you're getting what you wanted
    //set the new src attribute
    jQuery(".xyro_refresh").attr("src", new_source);
}

6

이것은 잘 작동합니다! 그러나 src를 여러 번 다시로드하면 타임 스탬프도 URL에 연결됩니다. 나는 그것을 처리하기 위해 허용 된 답변을 수정했습니다.

$('#image_reload_button').on('click', function () {
    var img = $('#your_image_selector');
    var src = img.attr('src');
    var i = src.indexOf('?dummy=');
    src = i != -1 ? src.substring(0, i) : src;

    var d = new Date();
    img.attr('src', src + '?dummy=' + d.getTime());
});

3

이미지 컨테이너 html을 재설정 해 보셨습니까? 물론 캐싱하는 브라우저라면 도움이되지 않습니다.

function imageUploadComplete () {
    $("#image_container").html("<img src='" + newImageUrl + "'>");
}

2

때로는 실제로 같은 솔루션-

$("#Image").attr("src", $('#srcVal').val()+"&"+Math.floor(Math.random()*1000));

또한 src를 올바르게 새로 고치지 말고 시도해보십시오.

$("#Image").attr("src", "dummy.jpg");
$("#Image").attr("src", $('#srcVal').val()+"&"+Math.floor(Math.random()*1000));

1

"#"을 구분자로 사용하면 유용 할 수 있습니다.

내 이미지는 "www"위의 "숨겨진"폴더에 보관되므로 로그인 한 사용자 만 액세스 할 수 있습니다. 이런 이유로 나는 평범한 것을 사용할 수 없지만 <img src=/somefolder/1023.jpg>서버에 요청을 <img src=?1023>보내고 이름 '1023'으로 유지 된 이미지를 다시 보내 응답합니다.

응용 프로그램은 이미지 자르기에 사용되므로 이미지를 자르기 위해 Ajax 요청을 한 후에는 서버의 컨텐츠로 변경되지만 원래 이름은 유지됩니다. 자르기 결과를 확인하기 위해 Ajax 요청이 완료된 후 첫 번째 이미지가 DOM에서 제거되고 같은 이름으로 새 이미지가 삽입됩니다 <img src=?1023>.

현금 인출을 피하기 위해 "#"앞에 "time"태그가 추가되어 요청에 추가됩니다 <img src=?1023#1467294764124>. 서버는 요청의 해시 부분을 자동으로 걸러 내고 '1023'으로 유지 된 이미지를 다시 보내 올바르게 응답합니다. 따라서 항상 많은 서버 측 디코딩없이 이미지의 마지막 버전을 얻습니다.


1
왜 이미지를 제공하기 위해 모든 문제를 해결해야합니까? 의미없는 번거 로움
lucasreta

0

이미지 소스를 여러 번 다시로드해야 할 수도 있습니다. Lodash 에서 나에게 잘 맞는 솔루션을 찾았 습니다.

$("#myimg").attr('src', _.split($("#myimg").attr('src'), '?', 1)[0] + '?t=' + _.now());

기존 타임 스탬프가 잘리고 새 타임 스탬프로 바뀝니다.


-1

@kasper Taeymans의 답변을 기반으로합니다.

u 이미지를 다시로드 해야하는 경우 (src를 smth new로 바꾸지 마십시오) 다음을 시도하십시오.

$(function() {
  var img = $('#img');

  var refreshImg = function(img) {
    // the core of answer is 2 lines below
    var dummy = '?dummy=';
    img.attr('src', img.attr('src').split(dummy)[0] + dummy + (new Date()).getTime());

    // remove call on production
    updateImgVisualizer();
  };


  // for display current img url in input
  // for sandbox only!
  var updateImgVisualizer = function() {
    $('#img-url').val(img.attr('src'));
  };

  // bind img reload on btn click
  $('.img-reloader').click(function() {
    refreshImg(img);
  });

  // remove call on production
  updateImgVisualizer();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<img id="img" src="http://dummyimage.com/628x150/">


<p>
  <label>
    Current url of img:
    <input id="img-url" type="text" readonly style="width:500px">
  </label>
</p>

<p>
  <button class="img-reloader">Refresh</button>
</p>


-2

나는 단순히 html로 이것을한다 :

<script>
    $(document).load(function () {
        d = new Date();
        $('#<%= imgpreview.ClientID %>').attr('src','');
    });
</script>

그리고 코드 뒤에 이미지를 다음과 같이 다시로드하십시오.

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        image.Src = "/image.jpg"; //url caming from database
    }

}


1
asp.NET WebForms에서 페이지를 다시로드하고 설정하는 것은 실제로 여기 주제가 아닙니다.
조나스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.