ฉันจะเริ่มเหตุการณ์ได้อย่างไรเมื่อ iframe โหลดใน jQuery เสร็จแล้ว


95

ฉันต้องโหลด PDF ภายในหนึ่งหน้า

ตามหลักการแล้วฉันต้องการโหลด gif แบบเคลื่อนไหวซึ่งจะถูกแทนที่เมื่อ PDF โหลดแล้ว

คำตอบ:


38

ฉันค่อนข้างมั่นใจว่ามันไม่สามารถทำได้

สวยอย่างอื่นมากกว่างาน PDF แม้แต่ Flash (ทดสอบบน Safari, Firefox 3, IE 7)

เลวร้ายเกินไป.


FWIW พวกเขาทั้งหมด (แม้แต่ PDF) ทำงานให้ฉันกับ Chrome บน OS X
pkaeding

ใช่มันทำงานใน Chrome แต่ไม่ใช่ใน IE หากแอปพลิเคชันอยู่บนเว็บจะต้องทำงานใน IE ด้วย
Robert Smith

214

คุณได้ลอง:

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

19
+1 เนื่องจากแม้ว่าสิ่งนี้จะไม่สามารถใช้งานได้กับการโหลด PDF ใน iframe แต่ก็มีประโยชน์สำหรับเนื้อหาประเภทอื่น ๆ
Cory House

3
+1 ไม่ใช่สิ่งที่ผู้ถามดั้งเดิมต้องการทราบ (เกี่ยวกับ pdf) แต่คำตอบนี้ตรงกับคำถาม "ฉันจะเริ่มเหตุการณ์เมื่อ iframe โหลดใน jQuery เสร็จได้อย่างไร" . ขอบคุณ
Harvey Darvey

ยังไม่ได้ลองใช้กับ PDF แต่จะทำงานได้อย่างสมบูรณ์แบบสำหรับ URL ปกติ
Bob-ob

ฉันใช้สิ่งนี้ภายใน$(function({})เพื่อให้เฟรมโหลดก่อน แต่ฉันไม่ได้รับความหวังสำหรับผลลัพธ์ Chrome 25 Mac
William Entriken

สิ่งนี้ใช้ไม่ได้กับการโหลด pdf ใน iframe ทดสอบใน IE 11
Robert Smith

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);
Stefan Majewsky

7

ฉันกำลังลองสิ่งนี้และดูเหมือนว่าจะได้ผลสำหรับฉัน: http://jsfiddle.net/aamir/BXe8C/

ไฟล์ pdf ที่ใหญ่ขึ้น: http://jsfiddle.net/aamir/BXe8C/1/


1
ไม่แตกต่างจากคำตอบของ @travis มากนัก แต่ฉันจะ +1 เนื่องจากการใช้งานการเปลี่ยนแปลง attr src และ css ที่สวยงาม อย่างน้อยฉันก็เห็นใครบางคนแกล้งทำเป็นว่ารถตักดินทำแบบนั้น
Anthony Hatzopoulos

เหตุการณ์การโหลดเริ่มทำงานก่อนที่ PDF จะโหลดอย่างสมบูรณ์
etlds

พยายามเชื่อมโยงของคุณใน OSX ล่าสุด Chrome และในการโหลดหน้าแรกก็ไม่ได้ทำงานเก็บไว้แต่เมื่อฉันรีเฟรชหน้ากล่าวว่าLoading PDF... PDF Loaded!แต่ดูเหมือนว่าจะใช้ได้กับ urls :) ดังนั้นมันจึงมีประโยชน์มากสำหรับฉัน ขอบคุณ!
GabLeRoux

จะใช้ไม่ได้หากตั้งค่าให้ดาวน์โหลดไฟล์แทนที่จะแสดงผลใน iframe
แหวน

สิ่งนี้ใช้ไม่ได้ใน IE 11 ให้ "กำลังโหลด PDF ... " ฉันกำลังมองหาโซลูชันที่ใช้งานได้ใน IE 11
Marc

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

คุณลองแล้วหรือยัง


วิธีนี้ไม่ได้ผลตามที่คาดไว้ จากเอกสาร JQuery: "เมธอด .ready () สามารถถูกเรียกบนวัตถุ jQuery ที่ตรงกับเอกสารปัจจุบันเท่านั้นดังนั้นจึงสามารถละตัวเลือกได้" ดูเหมือนว่าจะถูกไล่ออกหลังจาก $ (เอกสาร) ไม่ว่าจะใช้ตัวเลือกใดก็ตาม
Cazuma Nii Cavalcanti

ฉันค่อนข้างมั่นใจว่านี่เป็นทฤษฎีที่ไม่ได้ใช้งาน
Barney

ทำซ้ำคำตอบก่อนหน้านี้!
SyntaxRules

ตามที่คนอื่น ๆ ระบุไว้ฉันทดสอบแล้ว แต่ก็ไม่ได้ผล Ready ถูกเรียกบนเอกสารพร้อมไม่ใช่ iframe ... ใช้ตัวเลือก On Load
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 ของ ur ALLOWTRANSPARENCY="false"

แนวคิดคือการแสดงภาพเคลื่อนไหวการโหลดใน wrapper div จนกว่า iframe จะโหลดหลังจากโหลด iframe จะครอบคลุมภาพเคลื่อนไหวการโหลด

ให้มันลอง.


4

การใช้ทั้ง jquery Load และ Ready ดูเหมือนจะไม่ตรงกันจริงๆเมื่อ iframe พร้อมใช้งานจริง

จบลงด้วยการทำอะไรแบบนี้

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

โดย #loader คือ div ที่อยู่ในตำแหน่งที่แน่นอนเหนือ iframe ด้วย spinner gif


2

@ Alex Aw นั่นเป็นคนเกียจคร้าน จะเกิดอะไรขึ้นถ้าในของiframeคุณคุณมีเอกสาร html ที่ดูเหมือน:

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

แน่นอนแฮ็ค แต่อาจใช้ได้กับ Firefox แม้ว่าฉันจะสงสัยว่าเหตุการณ์โหลดจะเริ่มทำงานเร็วเกินไปในกรณีนั้น


นั่นคือสิ่งที่ฉันกำลังมองหา :(
Aamir Afridi

1

ฉันต้องแสดงตัวโหลดในขณะที่ pdf ใน iFrame กำลังโหลดดังนั้นสิ่งที่ฉันคิดขึ้น:

    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 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

ดัชนี z ของ iframe ควรเป็น (z-index + 1 ของการโหลด) หรือสูงกว่านั้น

ตัวอย่างเช่น:

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

หวังว่านี่จะช่วยได้หากไม่มีโซลูชัน javaScript ฉันคิดว่า CSS เป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับสถานการณ์เหล่านี้

ขอแสดงความนับถืออย่างสูง.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.