jQuery로 iframe 다시로드


151

한 페이지에 두 개의 iframe이 있고 하나는 다른 하나를 변경하지만 다른 iframe은 새로 고칠 때까지 변경 사항을 표시하지 않습니다. 이 iframe을 jQuery로 쉽게 새로 고칠 수 있습니까?

<div class="project">
  <iframe id="currentElement" class="myframe" name="myframe" src="http://somesite.com/something/new"></iframe>
</div>

3
iframe 문서가 다른 도메인에 있습니까?
Pekka

iFrame에 나타나는 사이트 코드에 액세스 할 수 있습니까?
매트 애즈 베리

더 많은 코드-iFrames의 HTML 및 변경에 사용하는 자바 스크립트 코드 표시 지금까지 포함한 내용 만보고 문제를 파악하기는 어렵습니다.
벤 리

코드에 액세스 할 수 있으며 iframe이 다른 도메인에 있습니다.
Matt Elhotiby

@Matt, 프레임은 다른 도메인의 프레임 내용을 변경할 수 없습니다. 이 도메인 간 스크립팅 제한을 해결하는 방법에 대한 예는 다음을 참조하십시오. softwareas.com/cross-domain-communication-with-iframes
Ben Lee

답변:


174

iframe이 다른 도메인에 있지 않은 경우 다음과 같이 할 수 있습니다.

document.getElementById(FrameID).contentDocument.location.reload(true);

그러나 iframe이 다른 도메인 contentDocument에 있으므로 동일한 출처 정책 에 따라 iframe의 속성에 대한 액세스가 거부됩니다 .

그러나 코드가 iframe의 상위 페이지에서 실행 중이면 src 속성을 자체로 설정하여 크로스 도메인 iframe을 강제로 다시로드 할 수 있습니다. 이처럼 :

// hackishly force iframe to reload
var iframe = document.getElementById(FrameId);
iframe.src = iframe.src;

다른 iframe을에서 iframe이를 다시로드하려는 경우, 당신은 운이있다 입니다 하지 가능합니다.


19
그의 질문은 자바 스크립트가 아닌 jQuery로 이것을 달성하는 방법이었습니다. 올바른 jQuery 답변은 아래 Sime Vidas의 게시물을 참조하십시오.
FastTrack

2
내 IE9에서 스크립트가 작동 하지 않습니다 (다른 버전은 확인하지 않음). contentDocumentcontentWindow로 변경 하면 IE9에서 작동합니다. document.getElementById(FrameID).contentWindow.location.reload(true);
Han He

3
이것은 나를 위해 작동하지 않았지만 iframe.contentDocument.location=iframe.src; 대신 큰 효과를 낸 것과 같은 일을했습니다.
glitchyme

3
이 Jquery는 저에게 매력처럼 작용했습니다.$('#map_iframe').attr('src', $('#map_iframe').attr('src'));
Topher Hunt

234
$( '#iframe' ).attr( 'src', function ( i, val ) { return val; });

2
ID에 대한 하나의 참조 만있는 경우 +1, 하나는 변경 될 가능성은 적지 만 다른 하나는 잊어
Matthew Lock

1
@NicolaeSurdu 또한, 이것 :(function (elem) { elem.src = elem.src; }($('#iframe')[0]));
Šime Vidas

1
다른 iframe 내에서 한 iframe을 다시로드하려면 $ ( '# iframe', window.parent.document) .attr ( 'src', function (i, val) {return val;});
Tillito

Internet Explorer에서와 같은 자바 스크립트 솔루션 document.getElementById(FrameID).contentWindow.location.reload(true);이 제대로 작동하지 않습니다. 이 대답은 더 잘 작동합니다.
BeyazKaplan

55

jquery를 사용할 수도 있습니다. Alex가 JQuery를 사용하여 제안한 것과 동일합니다.

 $('#currentElement').attr("src", $('#currentElement').attr("src"));

3
이 솔루션의 장점은 가독성입니다. Vidas의 답변만큼 효율적이지는 않지만 무슨 일이 일어나고 있는지 분명합니다.
Robert Egginton

또한이 솔루션의 가독성을 선호하는 경향이 있습니다.
Yonatan Naor

var f = $('#iframeX') ; f.attr( 'src', f.attr( 'src' ))유지하고 읽는 것이 더 강력 할 수 있습니다
Andreas Dietrich

9

jQuery로 iframe 다시로드

iframe 안에 링크를 만들어 id = "reload"라고 말한 후 다음 코드를 사용하십시오.

$('#reload').click(function() {
    document.location.reload();
});

모든 브라우저를 사용하는 것이 좋습니다.

HTML을 사용하여 iframe을 다시로드하십시오 (Java Script 필요 없음)

더 간단한 솔루션이 있습니다 : (FF, Webkit)에서 javaScript없이 작동합니다.

iframe에 고정하십시오

   <a href="#" target="_SELF">Refresh Comments</a>

이 앵커를 클릭하면 iframe을 새로 고칩니다.

그러나 iframe에 매개 변수를 보내면 다음과 같이하십시오.

  <a id="comnt-limit" href="?id=<?= $page_id?>" target="_SELF">Refresh Comments</a>

-> target = "_ SELF"때문에 페이지 URL이 필요하지 않습니다.


9

jquery로 이것을 사용할 수 있습니다 :

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

현재 iframe을 새로 고치려면이 솔루션을 사용하십시오. 정말 고마워!
DaemonHK

5

알렉스의 대답을 왕복하지만 jQuery로

var currSrc = $("#currentElement").attr("src");
$("#currentElement").attr("src", currSrc);

4

다른 방법이 있습니다

$( '#iframe' ).attr( 'src', function () { return $( this )[0].src; } );

1
$( '#iframe' ).attr('src', $( '#iframe' ).attr('src'));
zanderwar

3

위의 모든 예제는 현재 URL이 아닌 원래 src로 iframe 만 다시로드한다고 확신합니다.

$('#frameId').attr('src', function () { return $(this).contents().get(0).location.href });

현재 URL을 사용하여 다시로드해야합니다.


2

교차 도메인 인 경우 단순히 src를 동일한 URL로 다시 설정해도 위치 해시가 변경 되더라도 항상 다시로드를 트리거하지는 않습니다.

트위터 버튼 iframe을 수동으로 구성하는 동안이 문제가 발생했습니다 .URL을 업데이트해도 새로 고쳐지지 않습니다.

트위터와 같은 버튼의 형태는 다음과 같습니다. .../tweet_button.html#&_version=2&count=none&etc=...

Twitter는 URL에 문서 조각을 사용하기 때문에 해시 / 조각을 변경해도 소스가 다시로드되지 않았고 버튼 대상에 새로운 아약스로로드 된 내용이 반영되지 않았습니다.

재로드를 강제하기 위해 쿼리 문자열 매개 변수를 추가 할 수 있습니다 (예 : "?_=" + Math.random() 그러나 특히 트위터의 접근 방식이 캐싱을 활성화하려는 경우이 예에서는 대역폭이 낭비됩니다).

해시 태그로만 변경되는 것을 다시로드하려면 요소를 제거하거나을 변경 src하고 스레드가 종료 될 때까지 기다렸다가 다시 할당해야합니다. 페이지가 여전히 캐시되어 있으면 네트워크 히트가 필요하지 않지만 프레임 재로드가 트리거됩니다.

 var old = iframe.src;
 iframe.src = '';
 setTimeout( function () {
    iframe.src = old;
 }, 0);

업데이트 :이 방법을 사용하면 원하지 않는 기록 항목이 생성됩니다. 대신 매번 iframe 요소를 제거하고 다시 생성하면이 back () 버튼이 예상대로 작동합니다. 타이머가없는 것도 좋습니다.


2

Alex의 대답을 왕복하지만 jQuery를 사용하면됩니다.

var e = $('#myFrame');
    e.attr("src", e.attr("src"));

또는 작은 기능을 사용할 수 있습니다.

function iframeRefresh(e) {
    var c = $(e);
        c.attr("src", c.attr("src"));
}

도움이 되길 바랍니다.


2
$('IFRAME#currentElement').get(0).contentDocument.location.reload()

waterfox 2019.10에서 작동하지 않았습니다
Andreas Dietrich

1

간단한 JavaScript로 가능합니다.

  • iFrame1에서 body 태그 onload에서 호출되는 JavaScript 함수를 만듭니다. 내가 설정 한 서버 측 변수를 확인 했으므로 iframe1에서 특정 조치를 취하지 않으면 iframe2에서 JavaScript 함수를 실행하려고 시도하지 않습니다. 버튼을 누르거나 iframe1에서 원하는 기능으로 이것을 설정할 수 있습니다.
  • 그런 다음 iframe2에는 아래에 나열된 두 번째 기능이 있습니다. iframe1의 함수는 기본적으로 부모 페이지로 이동 한 다음 window.frames구문을 사용하여 iframe2에서 JavaScript 함수를 실행합니다. 를 사용 하지 말고 iframe2 의 id/ 를 사용 name하십시오 src.
//function in iframe1
function refreshIframe2()
{
    if (<cfoutput>#didValidation#</cfoutput> == 1)
    {   
         parent.window.frames.iframe2.refreshPage();
    }
}

//function in iframe2
function refreshPage()
{   
    document.location.reload();
}

1

// 페이지의 모든 iframe을 새로 고침

var f_list = document.getElementsByTagName('iframe');

 for (var i = 0, f; f = f_list[i]; i++) {
                            f.src = f.src;
                        }

0
    ifrX =document.getElementById('id') //or 
    ifrX =frames['index'];

크로스 브라우저 솔루션은 다음과 같습니다.

    ifrX.src = ifrX.contentWindow.location

이것은 <iframe>이 <form>의 대상 일 때 특히 유용합니다.


왜 jQuery인가?! 간단한 js가있을 때
bortunac

0

해결! 나는 적어도 당신에게 작동하는 유일한 솔루션 (적어도 ASP.NET/IE/FF/Chrome에서)을 공유하기 위해 stockoverflow에 등록합니다! 아이디어는 div의 innerHTML 값을 현재 innerHTML 값으로 바꾸는 것입니다.

다음은 HTML 스 니펫입니다.

<div class="content-2" id="divGranite">
<h2>Granite Purchase</h2>
<IFRAME  runat="server" id="frameGranite" src="Jobs-granite.aspx" width="820px" height="300px" frameborder="0" seamless  ></IFRAME>
</div>

그리고 내 자바 스크립트 코드 :

function refreshGranite() {           
   var iframe = document.getElementById('divGranite')
   iframe.innerHTML = iframe.innerHTML;
}

도움이 되었기를 바랍니다.


이 답변의 여러 오류 : 1. ASP.NET 구성 요소 runat="server"가 아니므로 적용 할 수 없습니다. 2. 왜 모든 캡 IFRAME? 3. 차원 속성 값에는 단위가 없습니다. 4. frameborder더 이상 사용되지 않습니다
Raptor

0

당신은 사용해야합니다

[0] .src

iframe의 소스와 해당 URL을 찾으려면 부모의 동일한 도메인에 있어야합니다.

setInterval(refreshMe, 5000);
function refreshMe() {
    $("#currentElement")[0].src = $("#currentElement")[0].src;   
}

0

당신은 이렇게 할 수 있습니다

$('.refrech-iframe').click(function(){
        $(".myiframe").attr("src", function(index, attr){ 
            return attr;
        });
    });

-5

아래 솔루션이 확실히 작동합니다.

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