iframe을 다시로드 / 새로 고치는 가장 좋은 방법은 무엇입니까?


242

<iframe>JavaScript를 사용하여 다시로드하고 싶습니다 . 지금까지 내가 찾은 가장 좋은 방법은 iframe의 src속성 자체 로 설정 되었지만 매우 깨끗하지는 않습니다. 어떤 아이디어?


4
src속성을 자체적으로 설정 하지 않는 이유 가 있습니까? 브라우저에서와 도메인에서 작동하는 유일한 해결책이 될 것 같다
mirhagk

src를 대상으로하는 다른 링크가있는 경우 속성을 자체로 설정 하면 문제가 발생합니다 <iframe>. 그런 다음 프레임에 원래 디자인 된대로 초기 페이지가 표시됩니다.
E. van Putten

답변:


222
document.getElementById('some_frame_id').contentWindow.location.reload();

Firefox에서는 window.frames[]id로 색인 할 수 없지만 이름 또는 색인으로 색인을 생성해야합니다.


26
실제로이 방법은 Chrome에서 작동하지 않았습니다. 'contentWindow'속성이 없습니다. document.getElementById ( 'some_frame_id'). location.reload ();를 사용하는 것이 가능했지만 FF와 Chrome 모두에서 작동하는 방법은 document.getElementById ( 'iframeid'). src = document.getElementById ( 'iframeid'). src
Mike Bevz

1
@MikeBevz는 location.reload도 Jquery selector를 사용하여 액세스 할 수 있습니까?
Jitender Mahlawat

2
== 같은 도메인 기원 정책에 절대 그것의 작동하지만 붙어
바비 Stenly

6
frames[1].location.href.reload()그리고 window.frames['some_frame_id'].location.href.reload()도 사용할 수 있습니다
다니엘 W. 크롬 턴에게

1
iframe 윈도우에 접근 할 수 없다면 iframe 태그의 src 속성을 변경해야합니다.
Maciej Krawczyk 2016 년

195
document.getElementById('iframeid').src = document.getElementById('iframeid').src

iframe도메인 전체 에서을 다시로드 합니다! IE7 / 8, Firefox 및 Chrome에서 테스트되었습니다.


68
document.getElementById('iframeid').src += '';또한 작동합니다 : jsfiddle.net/Daniel_Hug/dWm5k
Web_Designer

3
iframe의 소스가 페이지에 추가 된 후 변경된 경우 어떻게해야합니까 ?
Niet the Dark Absol

Chrome ver33에서 작동합니다! 우리가 단순히 사용할 수 reload는 없지만 이것이 허용됩니다.
Luke

8
iframe src에 해시가있는 경우 (예 http://example.com/#something:) 프레임을 다시로드하지 않습니다. ?v2해시 이전의 URL 과 같은 버리기 쿼리 매개 변수를 추가하는 방법을 사용했습니다 .
user85461

그러면 iframe이 맨 위로 스크롤됩니다.
MrTux

60

jQuery를 사용하는 경우 작동하는 것 같습니다.

$('#your_iframe').attr('src', $('#your_iframe').attr('src'));

나는 그것이 스택 오버 플로우에 너무 추악하지 않기를 바랍니다.


6
이것은 jQuery없이 : var iframe = document.getElementById("your_iframe"); iframe.src = src;
Seagrass

미래의 모든 사람들에게이 플랫폼 (및 일반 js 솔루션)은 크로스 플랫폼이며 도메인간에 작동하므로 사용하기에 가장 좋습니다.
mirhagk

13
@Seagrass 나는 당신이 생각하는 것 :var iframe = document.getElementById("your_iframe"); iframe.src = iframe.src;
maxisme

15

빈 공간을 추가하면 iFrame이 자동으로 다시로드됩니다.

document.getElementById('id').src += '';


8

때문에의 동일 출처 정책 다른 도메인에 iframe을 가리키는 수정할 때,이 작동하지 않습니다. 최신 브라우저를 타겟팅 할 수 있으면 HTML5의 문서 간 메시징 사용을 고려하십시오 . 이 기능을 지원하는 브라우저는 http://caniuse.com/#feat=x-doc-messaging 에서 볼 수 있습니다 .

HTML5 기능을 사용할 수없는 경우 http://softwareas.com/cross-domain-communication-with-iframes에 설명 된 트릭을 따를 수 있습니다 . 해당 블로그 항목은 문제를 정의하는데도 효과적입니다.


7

방금 크롬 에서이 문제를 해결했으며 iframe을 제거하고 교체하는 것이 유일한 방법이었습니다. 예:

$(".iframe_wrapper").find("iframe").remove();
var iframe = $('<iframe src="' + src + '" frameborder="0"></iframe>');
$.find(".iframe_wrapper").append(iframe);

꽤 간단하고 다른 답변에서는 다루지 않습니다.


4

새 URL

location.assign("http:google.com");

assign () 메소드는 새 문서를로드합니다.

새로 고침

location.reload();

reload () 메소드는 현재 문서를 다시로드하는 데 사용됩니다.


4

src새 페이지가로드 될 때까지 이전 내용을 볼 수 있기 때문에 iframe 요소 의 속성을 바꾸는 것만으로 는 만족스럽지 않았습니다. 즉각적인 시각적 피드백을 제공하려는 경우 더 효과적입니다.

var url = iframeEl.src;
iframeEl.src = 'about:blank';
setTimeout(function() {
    iframeEl.src = url;
}, 10);

방금 동일한 접근 방식을 테스트했지만 setTimeout이 없었습니다. 실제로, 단지 iframe.setAttribute ( 'src', iframe.getAttribute ( 'src'))
bonbonez

3

yajra의 게시물에 대한 개선 ... 나는 생각을 좋아하지만 브라우저 감지의 아이디어를 싫어합니다.

브라우저 감지 대신 객체 감지 사용에 대한 ppk의 견해를 취합니다 ( http://www.quirksmode.org/js/support.html ). 실제로 브라우저의 기능을 테스트하고 그에 따라 행동하기 때문에 그 당시 브라우저가 할 수 있다고 생각하는 것. 또한 추악한 브라우저 ID 문자열 구문 분석이 필요하지 않으며 사용자가 모르는 완벽하게 작동하는 브라우저를 제외하지 않습니다.

따라서 navigator.AppName을 보는 대신 실제로 사용하는 요소를 테스트하면서 이와 같은 작업을 수행하지 않는 이유는 무엇입니까? (당신이 더 화려하게하고 싶다면 try {} 블록을 사용할 수 있지만 이것은 나를 위해 일했습니다.)

function reload_message_frame() {
    var frame_id = 'live_message_frame';
    if(window.document.getElementById(frame_id).location ) {  
        window.document.getElementById(frame_id).location.reload(true);
    } else if (window.document.getElementById(frame_id).contentWindow.location ) {
        window.document.getElementById(frame_id).contentWindow.location.reload(true);
    } else if (window.document.getElementById(frame_id).src){
        window.document.getElementById(frame_id).src = window.document.getElementById(frame_id).src;
    } else {
        // fail condition, respond as appropriate, or do nothing
        alert("Sorry, unable to reload that frame!");
    }
}

이런 식으로 자바 스크립트 오류를 ​​발생시키지 않고 원하는만큼이나 다른 순열을 시도하고 다른 모든 것이 실패 할 경우 현명한 작업을 수행 할 수 있습니다. 사용하기 전에 객체를 테스트하는 것이 조금 더 많은 작업이지만 IMO는 더 안전하고 더 안전한 코드를 만듭니다.

Windows의 IE8, Firefox (15.0.1), Chrome (21.0.1180.89 m) 및 Opera (12.0.2)에서 저에게 효과적이었습니다.

실제로 재로드 기능을 테스트하여 더 잘 할 수는 있지만 지금은 충분합니다. :)


3

이제 크롬 66 에서이 작업을 수행하려면 다음을 시도하십시오.

const reloadIframe = (iframeId) => {
    const el = document.getElementById(iframeId)
    const src = el.src
    el.src = ''
    setTimeout(() => {
        el.src = src
    })
}

2

.Net을 사용하는 IE8에서는 iframe.src처음으로 설정하는 것이 좋지만 iframe.src두 번째로 설정 page_load하면 iframed 페이지가 증가하지 않습니다 . 그것을 해결하기 위해 나는 사용했다 iframe.contentDocument.location.href = "NewUrl.htm".

jQuery thickBox를 사용하고 thickbox iframe에서 동일한 페이지를 다시 열려고하면 그것을 발견하십시오. 그런 다음 열린 이전 페이지를 표시했습니다.


2

IE에는 reload를 사용하고 다른 브라우저에는 src를 설정하십시오. IE 7,8,9 및 Firefox에서 테스트 한 (FF에서 재로드가 작동하지 않음)

if(navigator.appName == "Microsoft Internet Explorer"){
    window.document.getElementById('iframeId').contentWindow.location.reload(true);
}else {
    window.document.getElementById('iframeId').src = window.document.getElementById('iframeId').src;
}

2

Jquery를 사용하는 경우 한 줄 코드가 있습니다.

$('#iframeID',window.parent.document).attr('src',$('#iframeID',window.parent.document).attr('src'));

같은 부모와 함께 일하는 경우

$('#iframeID',parent.document).attr('src',$('#iframeID',parent.document).attr('src'));

1

위의 모든 방법이 효과가없는 경우 :

window.location.reload();

이것은 어떤 이유로 전체 스크립트 대신 내 iframe을 새로 고쳤습니다. 다른 프레임에서 프레임을 새로 고치려고 할 때 모든 getElemntById 솔루션이 작동하는 동안 프레임 자체에 배치 되었기 때문일 수 있습니다.

또는 나는 이것을 완전히 이해하지 못하고 횡설수설을합니다. 어쨌든 이것은 매력처럼 나를 위해 일했습니다 :)


1

의미없는 쿼리 문자열 매개 변수를 URL에 추가하는 것을 고려 했습니까?

<iframe src="myBaseURL.com/something/" />

<script>
var i = document.getElementsById("iframe")[0],
    src = i.src,
    number = 1;

//For an update
i.src = src + "?ignoreMe=" + number;
number++;
</script>

안전하지 않은 매개 변수를 알고 있다면 괜찮습니다.


1

또 다른 해결책.

const frame = document.getElementById("my-iframe");

frame.parentNode.replaceChild(frame.cloneNode(), frame);

단점은 루트 문서 DOM 트리를 수정하여 다시 그리기를 유발한다는 것입니다. 내가 사용var url = ifr.src; ifr.src = null; ifr.src = url;
Pocketsand

iframe을 다시로드하면 사용 된 코드에 관계없이 항상 다시 페인트가 발생한다고 생각합니다.
Vasile Alexandru Peşte

1

를 사용 self.location.reload()하면 iframe이 새로 고침됩니다.

<iframe src="https://vivekkumar11432.wordpress.com/" width="300" height="300"></iframe>
<br><br>
<input type='button' value="Reload"  onclick="self.location.reload();" />


1
즉, 전체 메인 윈도우 다시로드
pery 미몬

0
<script type="text/javascript">
  top.frames['DetailFrame'].location = top.frames['DetailFrame'].location;
</script> 

1
내가 선택할 선택은 아니지만 그렇게 할 것입니다. 추가 할 수있는 코드가 추가되었습니다.
transilvlad

0

다른 제안을 모두 시도 했는데도 제대로 작동하지 않는 경우 (여러분이 할 수 없었던 것처럼) 여기 유용한 방법이 있습니다.

HTML

<a class="refresh-this-frame" rel="#iframe-id-0">Refresh</a>
<iframe src="" id="iframe-id-0"></iframe>

JS

$('.refresh-this-frame').click(function() {
    var thisIframe = $(this).attr('rel');
    var currentState = $(thisIframe).attr('src');
    function removeSrc() {
        $(thisIframe).attr('src', '');
    }
    setTimeout (removeSrc, 100);
    function replaceSrc() {
        $(thisIframe).attr('src', currentState);
    }
    setTimeout (replaceSrc, 200);
});

처음에는 RWD 및 크로스 브라우저 테스트로 시간을 절약하려고 노력했습니다. 나는 많은 iframe을 담은 빠른 페이지를 만들고 싶었고 원하는대로 표시하거나 숨길 그룹으로 구성했습니다. 논리적으로 주어진 프레임을 쉽고 빠르게 새로 고칠 수 있기를 원합니다.

현재 테스트중인이 테스트 베드에서 사용중인 프로젝트는 색인이 생성 된 위치가있는 한 페이지 사이트입니다 (예 : index.html # home). 그것은 특정 프레임을 새로 고칠 다른 솔루션을 얻을 수없는 이유와 관련이있을 수 있습니다.

나는 그것이 세상에서 가장 깨끗한 것이 아니라는 것을 알고 있지만 그것은 내 목적을 위해 작동합니다. 이것이 누군가를 돕기를 바랍니다. 이제 iframe 내부에 애니메이션이있을 때마다 iframe이 부모 페이지를 스크롤하지 못하게하는 방법을 알 수 있다면 ...

편집 : 나는 이것이 원하는 것처럼 iframe을 "새로 고치지 않는다"는 것을 깨달았습니다. 그래도 iframe의 초기 소스를 다시로드합니다. 여전히 다른 옵션을 사용할 수없는 이유를 여전히 알 수 없습니다.

업데이트 : 다른 방법으로 작동하지 않는 이유는 Chrome에서 테스트하고 있기 때문에 Chrome에서 iframe의 콘텐츠에 액세스 할 수 없기 때문입니다 (설명 : Chrome의 향후 릴리스가 contentWindow를 지원할 가능성이 있습니까? icontent 가 동일한 위치에서 시작되지 않은 경우 iframe이 로컬 html 파일에서 로컬 html 파일을로드 할 때 / contentDocument? ) 추가 테스트를 수행하면 FF의 contentWindow에도 액세스 할 수 없습니다.

수정 된 JS

$('.refresh-this-frame').click(function() {
    var targetID = $(this).attr('rel');
    var targetSrc = $(targetID).attr('src');
    var cleanID = targetID.replace("#","");     
    var chromeTest = ( navigator.userAgent.match(/Chrome/g) ? true : false );
    var FFTest = ( navigator.userAgent.match(/Firefox/g) ? true : false );      
    if (chromeTest == true) {
        function removeSrc() {
            $(targetID).attr('src', '');
        }
        setTimeout (removeSrc, 100);
        function replaceSrc() {
            $(targetID).attr('src', targetSrc);
        }
        setTimeout (replaceSrc, 200);
    }
    if (FFTest == true) {
        function removeSrc() {
            $(targetID).attr('src', '');
        }
        setTimeout (removeSrc, 100);
        function replaceSrc() {
            $(targetID).attr('src', targetSrc);
        }
        setTimeout (replaceSrc, 200);
    }       
    if (chromeTest == false && FFTest == false) {
        var targetLoc = (document.getElementById(cleanID).contentWindow.location).toString();
        function removeSrc() {
            $(targetID).attr('src', '');
        }
        setTimeout (removeSrc, 100);
        function replaceSrc2() {
            $(targetID).attr('src', targetLoc);
        }
        setTimeout (replaceSrc2, 200);
    }
});

0

디버깅을 위해 콘솔을 열고 실행 컨텍스트를 새로 고치려는 프레임으로 변경하고 수행 할 수 있습니다 document.location.reload()

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.