2011-04-26 20 views
41

क्या किसी को पता है कि ऐसी कोई चीज़ है या नहीं?jQuery iframe लोड() घटना?

मैं एक iframe कि $.ajax() साथ डाला जा रहा है है और मैं कुछ सामान करना चाहता हूँ के बाद iframe से सामग्री पूरी तरह से लोड कर रहे हैं:

.... 
success: function(html){ // <-- html is the IFRAME (#theiframe) 
      $(this).html(html); // $(this) is the container element 
      $(this).show(); 
      $('#theiframe').load(function(){ 
      alert('loaded!'); 
      } 
.... 

यह काम करता है, लेकिन मैं देख रहा हूँ IFRAME दो बार भरी हुई है (अलर्ट भी दो बार दिखाता है)।

+0

सेट करने का प्रयास यदि ऐसा नहीं है, बस ईवेंट ट्रिगर लाइन विंडो लोड घटना के लिए तो जैसे देते हैं डीओएम में जोड़ने से पहले आईफ्रेम का स्रोत। यह लोड घटना को दो बार फायरिंग से रोकना चाहिए। – Abe

उत्तर

47

यदि संभव हो, तो आप iframe के दस्तावेज़ में load ईवेंट को संभालने और उस दस्तावेज़ में किसी फ़ंक्शन को कॉल करने से बेहतर होंगे। यह सभी ब्राउज़रों में काम करने का लाभ है और केवल एक बार चल रहा है।

मुख्य दस्तावेज़ में:

function iframeLoaded() { 
    alert("Iframe loaded!"); 
} 

आइफ्रेम दस्तावेज़ में:

window.onload = function() { 
    parent.iframeLoaded(); 
} 
+0

अरे यह काम करता है! लेकिन मैं ऐसे दस्तावेज़ को कैसे कॉल कर सकता हूं जो मूल दस्तावेज़ के 'jQuery (दस्तावेज़) .ready' फ़ंक्शन के अंदर है? – Alex

+0

@Alex: आपको यह सुनिश्चित करना होगा कि फ़ंक्शन वैश्विक है, जिसे आप अपने 'तैयार()' फ़ंक्शन के अंदर चर के लिए मान निर्दिष्ट करने से पहले या वैश्विक रूप से वैश्विक दायरे में एक चर के रूप में घोषित करके कर सकते हैं इसे अपने 'तैयार()' फ़ंक्शन के अंदर 'विंडो' की संपत्ति के रूप में असाइन करना। उदाहरण के लिए: '$ (दस्तावेज़) .ready (function() {window.iframeLoaded = function() {चेतावनी (" लोड ");};/* अन्य सामान यहां * /})'; –

+0

ऐसा लगता है कि मेरी डबल लोडिंग समस्या मुझे डीआईवी टैग के बीच आईफ्रेम लपेट रही है। अगर आप ऐसा करते हैं तो कुछ अजीब कारण ब्राउज़र आइफ्रेम को फिर से लोड करते हैं ... – Alex

2

आप iframe की सामग्री प्राप्त करने के लिए jquery's Contents विधि का उपयोग कर सकते हैं।

3

यह वही व्यवहार है जो मैंने देखा है: iframe's load() एक खाली आईफ्रेम पर पहली बार आग लग जाएगा, फिर दूसरी बार जब आपका पृष्ठ लोड हो जाएगा।

संपादित करें: हम्म, दिलचस्प। आप अपने ईवेंट हैंडलर में काउंटर बढ़ा सकते हैं, और ए) पहले load ईवेंट को अनदेखा कर सकते हैं, या बी) किसी भी डुप्लिकेट load ईवेंट को अनदेखा करें।

+0

अगर मैं 'अलर्ट ($ (यह) .attr ('src') जोड़ता हूं; 'लोड फ़ंक्शन के अंदर मुझे दो बार समान मान मिलता है ... – Alex

2

आप इसे अधिक सामान्य और स्वतंत्र होना चाहते हैं, तो आप कुकी का उपयोग कर सकते हैं। Iframe सामग्री एक कुकी सेट कर सकते हैं। Jquery.cookie और टाइमर (या इस मामले में जावास्क्रिप्ट टाइमर) के साथ, आप जांच सकते हैं कि कुकी प्रत्येक सेकेंड या तो सेट है या नहीं।

//token should be a unique random value which is also sent to ifame to get set 
iframeLoadCheckTimer = window.setInterval(function() { 
     cookieValue = $.cookie('iframeToken'); 
     if (cookieValue == token) 
     { 
      window.clearInterval(iframeLoadCheckTimer); 
      $.cookie('iframeToken', null, { 
       expires: 1, 
       path: '/' 
     }); 
     } 
}, 1000); 
6
Tim Down's answer की पंक्तियों के साथ

लेकिन jQuery लाभ (ओ पी ने उल्लेख किया) और शिथिल युक्त पेज और iframe युग्मन, आप निम्न कर सकता है:

iframe में:

<script> 
    $(function() { 
     var w = window; 
     if (w.frameElement != null 
       && w.frameElement.nodeName === "IFRAME" 
       && w.parent.jQuery) { 
      w.parent.jQuery(w.parent.document).trigger('iframeready'); 
     } 
    }); 
</script> 

युक्त पेज में:

<script> 
    function myHandler() { 
     alert('iframe (almost) loaded'); 
    } 
    $(document).on('iframeready', myHandler); 
</script> 

ifra मैं (संभावित रूप से मौजूदा) पैरेंट विंडो के दस्तावेज़ पर एक घटना को आग लगाता हूं - कृपया सावधान रहें कि इस दस्तावेज़ के लिए मूल दस्तावेज़ को स्वयं के jQuery उदाहरण की आवश्यकता है। फिर, पैरेंट विंडो में आप उस ईवेंट पर प्रतिक्रिया करने के लिए एक हैंडलर संलग्न करते हैं।

इस समाधान में ब्रेकिंग का लाभ नहीं है जब युक्त पृष्ठ में अपेक्षित लोड हैंडलर नहीं होता है। आमतौर पर बोलते हुए, यह आसपास के पर्यावरण को जानने के लिए आईफ्रेम की चिंता नहीं होनी चाहिए।

कृपया ध्यान दें, कि हम घटना को आग लगाने के लिए डीओएम तैयार कार्यक्रम का लाभ उठा रहे हैं - जो अधिकांश उपयोग मामलों के लिए उपयुक्त होना चाहिए।कोड के बिना iframe + चेतन में

$(window).on('load', function() { ... }); 
+0

यह एकमात्र समाधान है जो मेरे लिए काम करता है। मैं इसे संभालने के लिए एक कुकी का उपयोग करने से इनकार करता हूं। – veksen

33

उपयोग iframe onload event

$('#theiframe').on("load", function() { 
    alert(1); 
}); 
+3

JQuery 1.7 (नवंबर 2011) के रूप में, आपको '$ ('# theiframe') का उपयोग करना होगा (" लोड ", फ़ंक्शन()) '। – Teepeemm

+5

jQuery v2.1.3 –

+4

के साथ काम नहीं करता है यह ट्रिगर प्रतीत नहीं होता है। – Primus202

2

:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 
<script language="javascript" type="text/javascript"> 

function resizeIframe(obj) { 

    jQuery(document).ready(function($) { 

     $(obj).animate({height: obj.contentWindow.document.body.scrollHeight + 'px'}, 500) 

    }); 

}  
</script> 
<iframe width="100%" src="iframe.html" height="0" frameborder="0" scrolling="no" onload="resizeIframe(this)" >