iframe이 jQuery에서로드를 마쳤을 때 이벤트를 발생시키는 방법은 무엇입니까?


95

페이지 내에서 PDF를로드해야합니다.

이상적으로는 PDF가로드되면 대체되는 로딩 애니메이션 gif를 갖고 싶습니다.

답변:


38

나는 그것을 할 수 없다고 확신합니다.

PDF 이외의 거의 모든 것, 심지어 Flash도 작동합니다. (Safari, Firefox 3, IE 7에서 테스트 됨)

안 됐네요.


FWIW, 그들 모두 (심지어 PDF도) OS X에서 Chrome으로 저를 위해 일했습니다.
pkaeding

예, Chrome에서는 작동하지만 IE에서는 작동하지 않습니다. 응용 프로그램이 웹에있는 경우 IE에서도 작동해야합니다.
로버트 스미스

214

시도해 보셨습니까?

$("#iFrameId").on("load", function () {
    // do something once the iframe is loaded
});

19
+1은 iframe에서 PDF를로드 할 때는 작동하지 않는 것처럼 보이지만 다른 콘텐츠 유형에는 유용하기 때문입니다.
Cory House

3
+1 원래 질문자가 (pdf와 관련하여) 알고 싶어했던 것은 아니지만이 답변은 "iframe이 jQuery에서로드를 마쳤을 때 이벤트를 어떻게 실행합니까?"라는 질문과 일치합니다. . 감사합니다
Harvey Darvey 2012 년

PDF로 이것을 시도하지 않았지만 일반 URL에서 완벽하게 실행됩니다.
Bob-ob

$(function({})프레임이 먼저로드되도록 내부를 사용하고 있습니다 . 그러나 희망하는 결과를 얻지 못하고 있습니다. Chrome 25 Mac
William Entriken 2013 년

iframe에서 pdf를로드 할 때는 작동하지 않습니다. IE 11에서 테스트
로버트 스미스

7

이것은 나를 위해 해냈습니다 (pdf가 아니라 또 다른 " onload저항"내용).

<iframe id="frameid" src="page.aspx"></iframe>
<script language="javascript">
    iframe = document.getElementById("frameid");

    WaitForIFrame();

    function WaitForIFrame() {
        if (iframe.readyState != "complete") {
            setTimeout("WaitForIFrame();", 200);
        } else {
            done();
        }
    }

    function done() {
        //some code after iframe has been loaded
    }
</script>  

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


7
에서는 setTimeout () 캐릭터 라인의 인수는 피해야한다 :setTimeout(WaitForIFrame, 200);
스테판 Majewsky을

7

나는 이것을 시도하고 있고 나를 위해 일하는 것 같습니다 : http://jsfiddle.net/aamir/BXe8C/

더 큰 pdf 파일 : http://jsfiddle.net/aamir/BXe8C/1/


1
@travis의 답변과 크게 다르지 않지만 attr src change 및 css의 우아한 사용 때문에 +1 할 것입니다. 나는 누군가가 그런 식으로 그렇게하는 멋진 로더를 속이는 것을 볼 수 있습니다.
Anthony Hatzopoulos 2012

PDF가 완전히로드되기 전에로드 이벤트가 시작되었습니다.
etlds

최신 Chrome과 첫 페이지로드시 OSX에서 링크를 시도 Loading PDF...했지만 작동하지 않았지만 유지 되었지만 페이지를 새로 고쳤을 때 PDF Loaded!. 그러나 이것은 URL과 함께 작동하는 것 같습니다 :) 그래서 그것은 나에게 매우 유용합니다. 감사!
GabLeRoux 2013 년

파일이 iframe에서 렌더링되는 대신 다운로드로 설정된 경우에는 작동하지 않습니다.
Ring

IE 11에서는 작동하지 않습니다. "PDF로드 중 ..."을 유지합니다. IE 11에서도 작동하는 솔루션을 찾고 있습니다.
Marc

6
$("#iFrameId").ready(function (){
    // do something once the iframe is loaded
});

대신 .ready를 시도 했습니까?


이 방법은 예상대로 작동하지 않습니다. JQuery 문서에서 : ".ready () 메서드는 현재 문서와 일치하는 jQuery 객체에서만 호출 할 수 있으므로 선택기를 생략 할 수 있습니다." 사용되는 선택기에 관계없이 $ (document) 후에 실행되는 것처럼 들립니다.
Cazuma Nii Cavalcanti 2011

나는 이것이 유휴 이론이라고 확신합니다.
Barney

이전 답변의 반복!
SyntaxRules

다른 사람들이 말했듯이 나는 이것을 테스트했지만 작동하지 않았습니다. 준비는 iframe이 아니라 문서 준비시 호출되었습니다.로드시 옵션을 사용하십시오.
Greg

5

나는 이것에 대한 즉각적인 접근 방식을 시도했지만 PDF 콘텐츠에 대해서는 테스트하지 않았지만 일반 HTML 기반 콘텐츠에 대해서는 작동했습니다. 방법은 다음과 같습니다.

1 단계 : Iframe을 div 래퍼로 래핑

2 단계 : div 래퍼에 배경 이미지를 추가합니다.

.wrapperdiv{
  background-image:url(img/loading.gif);
  background-repeat:no-repeat;
  background-position:center center; /*Can place your loader where ever you like */
}

3 단계 : iframe 태그 추가 ALLOWTRANSPARENCY="false"

아이디어는 iframe이로드 된 후 iframe이로드 애니메이션을 덮을 때까지 래퍼 div에로드 애니메이션을 표시하는 것입니다.

시도 해봐.


4

jquery Load와 Ready를 모두 사용하면 iframe이 진정으로 준비되었을 때 실제로 일치하지 않는 것 같습니다.

나는 이런 식으로 결국

$('#iframe').ready(function () {
    $("#loader").fadeOut(2500, function (sender) {
        $(sender).remove();
    });
});

#loader는 스피너 gif가있는 iframe 위에 절대적으로 배치 된 div입니다.


2

@Alex aw 그거 부끄럽다. 다음 iframe과 같은 html 문서가 있다면 어떨까요?

<html>
  <head>
    <meta http-equiv="refresh" content="0;url=/pdfs/somepdf.pdf" />
  </head>
  <body>
  </body>
</html>

확실히 해킹이지만 Firefox에서는 작동 할 수 있습니다. 이 경우 load 이벤트가 너무 빨리 시작되는지 궁금합니다.


그게 내가 찾고있는 것입니다 :(
Aamir Afridi

1

iFrame의 pdf가로드되는 동안 로더를 표시해야 했으므로 다음과 같은 결과를 얻었습니다.

    loader({href:'loader.gif', onComplete: function(){
            $('#pd').html('<iframe onLoad="loader.close();" src="pdf" width="720px" height="600px" >Please wait... your report is loading..</iframe>');
    }
    });

로더를 보여주고 있습니다. 고객이 내 로더를 볼 수 있다고 확신하면 iframe을로드하는 onCompllet 로더 메서드를 호출합니다. Iframe에는 "onLoad"이벤트가 있습니다. PDF가로드되면 로더를 숨기고있는 onloat 이벤트가 트리거됩니다. :)

중요한 부분 :

iFrame에는 필요한 작업을 수행 할 수있는 "onLoad"이벤트가 있습니다 (로더 숨기기 등).


0

모든 작업에 대해 수행하는 작업은 다음과 같습니다. Firefox, IE, Opera 및 Safari에서 작동합니다.

<script type="text/javascript">
  $(document).ready(function(){
    doMethod();
  });
  function actionIframe(iframe)
  {
    ... do what ever ...
  }
  function doMethod()
  {   
    var iFrames = document.getElementsByTagName('iframe');

    // what ever action you want.
    function iAction()
    {
      // Iterate through all iframes in the page.
      for (var i = 0, j = iFrames.length; i < j; i++)
      {
        actionIframe(iFrames[i]);
      }
    }

    // Check if browser is Safari or Opera.
    if ($.browser.safari || $.browser.opera)
    {
      // Start timer when loaded.
      $('iframe').load(function()
      {
        setTimeout(iAction, 0);
      }
      );

      // Safari and Opera need something to force a load.
      for (var i = 0, j = iFrames.length; i < j; i++)
      {
         var iSource = iFrames[i].src;
         iFrames[i].src = '';
         iFrames[i].src = iSource;
      }
    }
    else
    {
      // For other good browsers.
      $('iframe').load(function()
      {
        actionIframe(this);
      }
      );
    }
  }
</script>

0

다운로드가 완료된 후 브라우저의 열기 / 저장 인터페이스가 사용자에게 팝업 될 것으로 예상 할 수 있다면 다운로드를 시작할 때 다음을 실행할 수 있습니다.

$( document ).blur( function () {
    // Your code here...
});

페이지 상단에 대화 상자가 나타나면 흐림 이벤트가 트리거됩니다.


0

pdf 파일이로드 된 후 iframe 문서에 새 DOM 요소 <embed/>가 있으므로 다음과 같이 확인할 수 있습니다.

    window.onload = function () {


    //creating an iframe element
    var ifr = document.createElement('iframe');
    document.body.appendChild(ifr);

    // making the iframe fill the viewport
    ifr.width  = '100%';
    ifr.height = window.innerHeight;

    // continuously checking to see if the pdf file has been loaded
     self.interval = setInterval(function () {
        if (ifr && ifr.contentDocument && ifr.contentDocument.readyState === 'complete' && ifr.contentDocument.embeds && ifr.contentDocument.embeds.length > 0) {
            clearInterval(self.interval);

            console.log("loaded");
            //You can do print here: ifr.contentWindow.print();
        }
    }, 100); 

    ifr.src = src;
}

0

이 상황에 적용한 솔루션은 DOM에 절대 로딩 이미지를 배치하는 것입니다.이 이미지는 iframe이로드 된 후 iframe 레이어에 포함됩니다.

iframe의 Z- 색인은 (로드 중 Z- 색인 + 1) 이상이어야합니다.

예를 들면 :

.loading-image { position: absolute; z-index: 0; }
.iframe-element { position: relative; z-index: 1; }

자바 스크립트 솔루션이 없다면 도움이되기를 바랍니다. CSS가 이러한 상황에 가장 적합하다고 생각합니다.

친애하는.

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