अगर iframe लोड है या इसकी सामग्री है तो कैसे जांचें?


84

मेरे पास आईडी = "myIframe" के साथ एक iframe है और यहां यह सामग्री लोड करने के लिए मेरा कोड है:

$('#myIframe').attr("src", "my_url");

समस्या कभी-कभी लोडिंग के लिए बहुत लंबी होती है और कभी-कभी यह बहुत जल्दी लोड हो जाती है। इसलिए मुझे "setTimeout" फ़ंक्शन का उपयोग करना चाहिए:

setTimeout(function(){
   if (//something shows iframe is loaded or has content)
   {
       //my code
   }
   else
   {
       $('#myIframe').attr("src",""); //stop loading content
   }
},5000);

सभी मैं जानना चाहता हूं कि यह कैसे पता लगाया जाए कि क्या आईफ्रेम लोड किया गया है या इसमें सामग्री है। का उपयोग करते हुए iframe.contents().find()काम नहीं करेगा। मैं उपयोग नहीं कर सकता iframe.load(function(){})


यदि आप कुछ भी लोड करने के लिए iframe नहीं चाहते हैं, तो इसे लोड करने में 5 सेकंड से अधिक समय लगता है?
skimberk1

आपकी सहायता के लिए धन्यवाद :) । हाँ, मैं iframe को कुछ भी लोड नहीं करना चाहता अगर इसे लोड करने में 5 सेकंड से अधिक समय लगता है। "। पहले से ही ()" का उपयोग करके आप दिखाते हैं कि काम नहीं हो रहा है।
newbie29

यहाँ मेरा जवाब देखें stackoverflow.com/questions/17158932/…
दोस्त

इस उत्तर की जाँच करें - forum.tumult.com/t/detect-iframe-loaded/7588
वर्सन

जवाबों:


89

इसे इस्तेमाल करे।

<script>
function checkIframeLoaded() {
    // Get a handle to the iframe element
    var iframe = document.getElementById('i_frame');
    var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;

    // Check if loading is complete
    if (  iframeDoc.readyState  == 'complete' ) {
        //iframe.contentWindow.alert("Hello");
        iframe.contentWindow.onload = function(){
            alert("I am loaded");
        };
        // The loading is complete, call the function we want executed once the iframe is loaded
        afterLoading();
        return;
    } 

    // If we are here, it is not loaded. Set things up so we check   the status again in 100 milliseconds
    window.setTimeout(checkIframeLoaded, 100);
}

function afterLoading(){
    alert("I am here");
}
</script>

<body onload="checkIframeLoaded();"> 

21
सेटटाइमआउट () के लिए एक स्ट्रिंग पास करने की मांग। एक फंक्शन रेफरेंस पास करना क्लीनर है:setTimeout(checkIframeLoaded, 100);
जेसी हैलट

1
यह "Unsafe JavaScript URL url2 के साथ फ्रेम से url2 डोमेन, प्रोटोकॉल और पोर्ट से मेल खाने के लिए फ्रेम तक पहुँचने का प्रयास करता है।"
मोहम्मद-इब्राहिम

मैं जो पूरा करने की कोशिश कर रहा था, उसके लिए यह सबसे अच्छा समाधान था। मैं iFrame के अंदर AngularJS का उपयोग कर रहा हूं, और एनजी-इनकाउंटर का उपयोग कर रहा हूं, जिसमें शामिल फाइलों को लोड करने में देरी होती है। मैं ऑनरोड घटना पर इफ्रेम की सामग्री को प्रिंट करने की कोशिश कर रहा था, लेकिन यह बहुत जल्द फायरिंग कर रहा था। readyState === "complete"ट्रिक के लिए जाँच करना , क्योंकि यह तब तक नहीं बदलता जब तक सब कुछ लोड नहीं हो जाता।
जेफरी ए। गोचिन

3
मेरा कहना है कि यह एकमात्र समाधान था जिसने मेरे लिए भी काम किया। आप बस एक iframe पर लोड घटना पर भरोसा नहीं कर सकते, क्योंकि यह IE11, क्रोम और एज पर ज्यादातर मामलों में तुरंत iframe.contentDocument.location.hrefदिखाता है about:blank। यह भले ही सच हो रहा है srcके लिए iframeसीधे HTML में निर्दिष्ट किया जाता है।
रैलमैटर

24
अगर आइफ्रेम दूसरे डोमेन से आता है तो यह काम नहीं करेगा:VM29320:1 Uncaught DOMException: Blocked a frame with origin "http://localhost:9002" from accessing a cross-origin frame.
ऑगस्टिन रिडिंगर

46

कृपया उपयोग करें:

$('#myIframe').on('load', function(){
    //your code (will be called once iframe is done loading)
});

मानकों के बदलते ही मेरा जवाब अपडेट किया गया।


4
यह दृष्टिकोण बिल्कुल भी काम नहीं करता है क्योंकि घटना तुरंत आग लग जाती है क्योंकि iframeआमतौर पर इसके साथ शुरू होता है src="about:blank", भले ही srcइसे सीधे HTML में निर्दिष्ट किया गया हो या इससे पहले कि iframeनोड को DOM में जोड़ा जाए। मैं के लिए मतदान करके यह परीक्षण किया iframeहै contentDocument.location.hrefपर IE11, क्रोम, और एज एक तंग पाश में। यह भी काम नहीं करता है अगर तैयार की जा रही सामग्री मेटा टैग या जावास्क्रिप्ट के माध्यम से पुनर्निर्देशित करती है।
ralayter 14

17

मेरे पास एक ही मुद्दा था और इसमें जोड़ा गया, मुझे यह जांचने की आवश्यकता है कि क्या आइफ्रेम क्रॉस-डोमेन नीति के बावजूद लोड किया गया है। मैं एक क्रोम एक्सटेंशन विकसित कर रहा था, जो एक वेबपेज पर कुछ स्क्रिप्ट को इंजेक्ट करता है और आईफ्रेम में मूल पृष्ठ से कुछ सामग्री प्रदर्शित करता है। मैंने दृष्टिकोण का अनुसरण करने की कोशिश की और यह मेरे लिए एकदम सही था।
पुनश्च: मेरे मामले में, मेरे पास iframe में सामग्री पर नियंत्रण है, लेकिन मूल साइट पर नहीं है। (Iframe को मेरे स्वयं के सर्वर पर होस्ट किया गया है)

पहले:
इसमें एक data-विशेषता वाला एक iframe बनाएं जैसे (यह हिस्सा मेरे मामले में इंजेक्शन स्क्रिप्ट था)
<iframe id="myiframe" src="http://anyurl.com" data-isloaded="0"></iframe>

अब iframe कोड में, उपयोग करें:

var sourceURL = document.referrer;
window.parent.postMessage('1',sourceURL);



अब मेरे केस के अनुसार इंजेक्टेड स्क्रिप्ट वापस:

setTimeout(function(){
  var myIframe = document.getElementById('myiframe');
  var isLoaded = myIframe.prop('data-isloaded');
  if(isLoaded != '1')
  {
    console.log('iframe failed to load');
  } else {
    console.log('iframe loaded');
  }
},3000);


तथा,

window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
    if(event.origin !== 'https://someWebsite.com') //check origin of message for security reasons
    {
        console.log('URL issues');
        return;
    }
    else {
        var myMsg = event.data;
        if(myMsg == '1'){
            //8-12-18 changed from 'data-isload' to 'data-isloaded
            $("#myiframe").prop('data-isloaded', '1');
        }
    }           
}



यह सवाल का सटीक जवाब नहीं दे सकता है लेकिन यह वास्तव में इस सवाल का एक संभावित मामला है जिसे मैंने इस पद्धति से हल किया है।


आपके कोड में कुछ त्रुटियां हैं, जैसे document.getElement-> s <-ById, लेकिन संपूर्ण विचार उपयोगी है। यह काम करता हैं। धन्यवाद)
जॉनके १६'१

@ जॉन इस ओर इशारा करने के लिए धन्यवाद, मैंने इसे ठीक कर लिया है। यह जानकर खुशी हुई कि यह आपके लिए उपयोगी है।
तुषार शुक्ल

12

सबसे आसान विकल्प:

<script type="text/javascript">
  function frameload(){
   alert("iframe loaded")
  }
</script>

<iframe onload="frameload()" src=...>

10
ठोस समाधान नहीं है क्योंकि यह चेतावनी देता है भले ही यूआरएल टूट गया हो।
bboy

7

loadIframe लोड होने पर प्रतिक्रिया देने के लिए आप iframe की घटना का उपयोग कर सकते हैं ।

document.querySelector('iframe').onload = function(){
    console.log('iframe loaded');
};

यह आपको नहीं बताएगा कि क्या सही सामग्री भरी हुई है: यह जाँचने के लिए, आप निरीक्षण कर सकते हैं contentDocument

document.querySelector('iframe').onload = function(){
    var iframeBody = this.contentDocument.body;
    console.log('iframe loaded, body is: ', body);
};

जांच की जा रही contentDocumentहै, तो आइफ्रेम काम नहीं करेगा src, जहां अपने कोड चल रहा है से भिन्न डोमेन के लिए अंक।


2
कृपया अपने कोड को संपादित करने पर विचार करें कि आपका कोड क्या करता है और यह समस्या का समाधान क्यों करेगा, इसके बारे में अधिक विवरण जोड़ने के लिए। एक उत्तर जो ज्यादातर सिर्फ कोड होता है (भले ही यह काम कर रहा हो) आमतौर पर ओपी को उनकी समस्या को समझने में मदद नहीं करेगा।
SuperBiasedMan

5

मुझे यकीन नहीं है कि क्या आप यह पता लगा सकते हैं कि यह लोड है या नहीं, लेकिन लोडिंग के पूरा होने पर आप किसी ईवेंट को आग लगा सकते हैं:

$(function(){
    $('#myIframe').ready(function(){
        //your code (will be called once iframe is done loading)
    });
});

EDIT: जैसा कि जेसी हैलट ने बताया है, यह हमेशा iframeलोड होने पर भी फायर करेगा , भले ही यह पहले से ही हो। इसलिए अनिवार्य रूप से, यदि iframeपहले से लोड किया गया है, तो कॉलबैक तुरंत निष्पादित होगा।


2
इस विधि के बारे में अच्छी बात यह है कि jQuery की 'रेडी' घटना आग लग जाएगी, भले ही आप इसे आईफ्रेम पूरी तरह से लोड होने के बाद बांध दें। इसलिए यह जांचने का एक अच्छा तरीका है कि क्या iframe में पहले से ही सामग्री है या सामग्री मिलने पर आपको सूचित करना है।
जेसी हैलट

1
यह इफ्रेम के लिए केवल एक बार आग लगती है। हालाँकि, यदि आपके iframe में लिंक हैं, जिसके परिणामस्वरूप iframe में सामग्री पुनः लोड की जा सकती है, तो यह ईवेंट फिर से फायर नहीं करेगा। यदि यह आपका मामला है, तो @pratikabu -$('#myIframe').load(function(){ })
ragamufin

@ skimberk1 हाय, इस उत्तर के अनुसार आपका समाधान अभ्यस्त काम करता है, क्योंकि jquery यह याद रखने के लिए एक चर रखती है कि क्या DOM लोड किया गया है और onley वर्तमान फ्रेम की DOM की जाँच करता है, तो iframe का DOM नहीं।
मार्को मेड्रानो

हां, आप घटनाओं को आग लगा सकते हैं, एक वीडियो दिखा सकते हैं, एक बार संगीत खेल सकते हैं, यह बहुत ही जानकारीपूर्ण है ....
गिरिधर कार्णिक

इस टिकट के अनुसार: dev.jquery.com/ticket/5511ready एक iframe पर उपयोग करने से हमेशा फ़ंक्शन को तुरंत निष्पादित करेगा, क्योंकि यह अन्य दस्तावेज़ों के लिए समर्थित नहीं है फिर फ्रेम जिसमें jQuery चल रहा है।
दोस्त

5

मेरे मामले में यह एक क्रॉस-ऑरिजनल फ्रेम था और कभी-कभी लोड नहीं हो रहा था। समाधान जो मेरे लिए काम करता है: यदि यह सफलतापूर्वक लोड हो जाता है तो यदि आप इस कोड को आज़माते हैं:

var iframe = document.getElementsByTagName('iframe')[0];
console.log(iframe.contentDocument);

यह आपको contentDocumentक्रॉस-ऑरिजनल एरर को एक्सेस करने और फेंकने की अनुमति नहीं देगा, लेकिन यदि फ्रेम सफलतापूर्वक लोड नहीं होता है तो ऑब्जेक्ट contentDocumentवापस कर देगा#document


2

जब एक iFrame लोड होता है, तो शुरू में इसमें #document शामिल होता है, इसलिए लोड स्थिति की जांच करने से यह पता चल सकता है कि अब क्या है।

if ($('iframe').contents().find('body').children().length > 0) {
    // is loaded
} else {
    // is not loaded
}

6
यह विफल होगा अगर यह एक अलग डोमेन पर है
फंककोडैट

यह गलत है, क्योंकि एक iframe लोडिंग की प्रक्रिया (पूरी तरह से लोड नहीं) में हो सकता है।
माइक शियान

1

मुझे निम्नानुसार काम करने की एक ट्रिक मिली: [क्रॉस-ब्राउज़र का परीक्षण नहीं किया है!]

परिभाषित iframe के onload घटना हैंडलर के रूप में परिभाषित किया गया है

$('#myIframe').on('load', function() {
    setTimeout(function() {
        try {
            console.log($('#myIframe')[0].contentWindow.document);
        } catch (e) {
            console.log(e);
            if (e.message.indexOf('Blocked a frame with origin') > -1 || e.message.indexOf('from accessing a cross-origin frame.') > -1) {
                alert('Same origin Iframe error found!!!');
                //Do fallback handling if you want here
            }
        }
    }, 1000);

});

अस्वीकरण: यह केवल SAME ORIGIN IFRAME दस्तावेजों के लिए काम करता है।


0

वास्तव में एक शानदार तरीका jQuery AJAX का उपयोग है। मूल फ्रेम इस तरह दिखेगा:

<iframe src="iframe_load.php" style="width: 100%; height: 100%;"></iframe>

Iframe_load.php फ़ाइल jQuery लाइब्रेरी और एक जावास्क्रिप्ट पैकेज में गंतव्य URL को लोड करने का प्रयास करने वाले जावास्क्रिप्ट को लोड करेगी:

var the_url_to_load = "http://www.your-website.com" ;
$.ajax({
            type: "GET",
            url: the_url_to_load,
            data: "",
            success: function(data){
                // if can load inside iframe, load the URL
                location.href = the_url_to_load ;
            },
            statusCode: {
                500: function() {
                    alert( 'site has errors' ) ;
                }
            },
            error:function (xhr, ajaxOptions, thrownError){
                // if x-frame-options, site is down or web server is down
                alert( 'URL did not load due to x-frame-options' ) ;
            } });

महत्वपूर्ण गंतव्य में "पहुँच-नियंत्रण-अनुमति-उत्पत्ति" शीर्षक होना चाहिए। PHP में उदाहरण:

HEADER( "Access-Control-Allow-Origin: *" ) ;

0

यदि आपको यह जानने की जरूरत है कि आईफ्रेम कब हेरफेर करने के लिए तैयार है, तो एक अंतराल का उपयोग करें। इस स्थिति में, मैं हर 250 ms की सामग्री को "पिंग" करता हूं और यदि लक्ष्य iframe के अंदर कोई सामग्री है, तो "पिंग" को रोकें और कुछ करें।

var checkIframeLoadedInterval = setInterval( checkIframeLoaded, 250 );

function checkIframeLoaded() {
    var iframe_content = $('iframe').contents();

    if (iframe_content.length > 0) {
        clearInterval(checkIframeLoadedInterval);

        //Apply styles to the button
        setTimeout(function () {
            //Do something inside the iframe 
            iframe_content.find("body .whatever").css("background-color", "red");
        }, 100); //100 ms of grace time
    }
}

0

यदि आप पृष्ठ और iframe को एक ही डोमेन पर होस्ट कर रहे हैं, तो आप iframe की Window.DOMContentLoadedघटना सुन सकते हैं । आपको मूल पृष्ठ को DOMContentLoadedपहले फायर करने के लिए इंतजार करना होगा , फिर इफ्रेम पर एक DOMContentLoadedईवेंट श्रोता को संलग्न करना होगा Window

आपको निम्नानुसार एक आइफ्रेम दिया गया है,

<iframe id="iframe-id" name="iframe-name" src="..."></iframe>

अगले स्निपेट आपको iframe की DOMContentLoadedघटना में हुक करने की अनुमति देगा :

document.addEventListener('DOMContentLoaded', function () {
    var iframeWindow = frames['iframe-name'];
    // var iframeWindow = document.querySelector('#iframe-id').contentWindow
    // var iframeWindow = document.getElementById('iframe-id').contentWindow

    iframeWindow.addEventListener('DOMContentLoaded', function () {
        console.log('iframe DOM is loaded!');
    });
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.