2009-04-15 4 views
72

मैं यह पता लगाने की कोशिश कर रहा हूं कि एक आईफ्रेम और इसकी सामग्री लोड हो गई है लेकिन बहुत भाग्य नहीं है। मेरा एप्लिकेशन पैरेंट विंडो में टेक्स्ट फ़ील्ड्स में कुछ इनपुट लेता है और आईफ्रेम को 'लाइव पूर्वावलोकन' प्रदान करने के लिए अपडेट करता हैआईफ्रेम सामग्री लोड होने पर पता लगाना (क्रॉस ब्राउज़र)

मैंने आईफ़्रेम लोड ईवेंट होने पर पता लगाने के लिए निम्न कोड (वाईयूआई) से शुरुआत की।

$E.on('preview-pane', 'load', function(){ 
    previewBody = $('preview-pane').contentWindow.document.getElementsByTagName('body')[0]; 
} 

'पूर्वावलोकन-फलक' मेरे आईफ्रेम की आईडी है और मैं ईवेंट हैंडलर को संलग्न करने के लिए वाईयूआई का उपयोग कर रहा हूं। हालांकि, मेरे कॉलबैक (आईफ्रेम लोड पर) में शरीर तक पहुंचने का प्रयास करने में विफल रहता है, मुझे लगता है क्योंकि ईवेंट हैंडलर तैयार होने से पहले आईफ्रेम लोड होता है। यह कोड काम करता है अगर मैं php स्क्रिप्ट बनाकर iframe लोडिंग में देरी करता हूं जो इसे नींद उत्पन्न करता है।

मूल रूप से, मैं क्या ब्राउज़रों में सही दृष्टिकोण जब आइफ्रेम लोड होते ही पता लगाने के लिए है और इसकी दस्तावेज़ तैयार है पूछ रहा हूँ?

+1

YUI के साथ बाहर शुरू एक बुरा विचार (और साथ ही किसी भी अन्य जे एस पुस्तकालय) है। क्यूं कर? क्योंकि आप सिर्फ यह नहीं जान सकते कि लाइब्रेरी क्या जादू कर रही है। अगर वे पूरी तरह से "लोड" का समर्थन नहीं कर सकते हैं, तो आप बेहतर और पठनीय जावास्क्रिप्ट में इसे बेहतर तरीके से करेंगे। – Christian

+2

आप लाइब्रेरी @ क्रिस्टियन के स्रोत कोड को अक्सर पढ़ सकते हैं। मुझे लगता है कि यह आमतौर पर आपको अपने कार्यान्वयन का उपयोग करने के बावजूद खुद को कैसे करना है इस बारे में बहुत अच्छी युक्तियां देता है। – AJP

+0

@AJP आपने मेरे बिंदु को गलत समझा। यदि आप कुछ कर रहे हैं, तो आप निश्चित नहीं हैं, कम कोड होना बेहतर है इसलिए त्रुटियों के लिए कम जगह है। – Christian

उत्तर

58

जब आइफ्रेम लोड होते ही पता लगाने के लिए और उसके दस्तावेज़ में जोड़ने के लिए तैयार है?

यह आदर्श है अगर आप फ्रेम के अंदर एक स्क्रिप्ट से खुद को बताने के लिए iframe प्राप्त कर सकते हैं। उदाहरण के लिए यह सीधे माता-पिता को यह बताने के लिए कह सकता है कि यह तैयार है। क्रॉस-फ्रेम कोड निष्पादन के साथ हमेशा देखभाल की आवश्यकता होती है क्योंकि चीजें ऐसी क्रम में हो सकती हैं, जिसकी आप अपेक्षा नहीं करते हैं। एक और विकल्प 'var isready = true;' को अपने दायरे में सेट करना है, और 'contentWindow.isready' के लिए अभिभावक स्क्रिप्ट स्नीफ है (और यदि नहीं हो तो ऑनलोड हैंडलर जोड़ें)।

किसी कारण यह iframe दस्तावेज़ सहयोग के लिए व्यावहारिक नहीं है के लिए, यदि आप पारंपरिक लोड दौड़ समस्या मिल गया है, तो अर्थात् है कि भले ही तत्व सही एक दूसरे के बगल हैं:

<img id="x" ... /> 
<script type="text/javascript"> 
    document.getElementById('x').onload= function() { 
     ... 
    }; 
</script> 

इस बात की कोई गारंटी नहीं है कि स्क्रिप्ट निष्पादित होने तक आइटम पहले ही लोड नहीं होगा।

लोड दौड़ से बाहर तरीके हैं:

  1. IE पर, आप अगर कुछ पहले से ही भरी हुई है देखने के लिए 'readyState' संपत्ति का उपयोग कर सकते हैं;

  2. यदि आइटम केवल जावास्क्रिप्ट सक्षम के साथ उपलब्ध है, तो यह स्वीकार्य है, आप इसे गतिशील रूप से बना सकते हैं, स्रोत सेट करने और पृष्ठ में जोड़ने से पहले 'ऑनलोड' ईवेंट फ़ंक्शन सेट कर सकते हैं। इस मामले में कॉलबैक सेट होने से पहले इसे लोड नहीं किया जा सकता है;

  3. मार्कअप में शामिल की ओल्ड-स्कूल रास्ता:

    <img onload="callback(this)" ... />

इनलाइन 'onsomething' HTML में संचालकों लगभग हमेशा गलत बात कर रहे हैं और परहेज किया जाता है, लेकिन इस में कभी-कभी यह कम से कम खराब विकल्प होता है।

+0

धन्यवाद। मेरा समाधान तैयारस्टेट (यदि मौजूद है) की जांच करता है, तो बॉडी तत्व आंतरिक HTML लंबाई को यह देखने के लिए देखता है कि यह लोड हो गया है या नहीं। यदि नहीं, तो लोड इवेंट हैंडलर को जोड़ता है। ठीक काम करने लगता है –

+7

-1 - इनलाइन घटनाएं "खराब" नहीं हैं, यह केवल वर्तमान फ़ैड है। वास्तव में, इनलाइन घटनाओं को डीबग करना और समझना आसान होता है, उनके जादू समकक्षों के विपरीत (जो दूसरी तरफ, संलग्न करना, ढेर करना और सहजता से उपयोग करना आसान होता है)। – Christian

+0

@ क्रिस्टियन, इनलाइन घटनाएं भी सबसे अच्छी विकल्प हैं जब आपको एक बहुत लंबी सूची के प्रत्येक तत्व को एक ईवेंट संलग्न करने की आवश्यकता होती है। चूंकि आप सर्वर पक्ष पर सूची बनाने के लिए पहले से ही लूपिंग कर रहे हैं, इसलिए इनलाइन-इवेंट को भी संलग्न करना अधिक कुशल है। – haknick

43

this ब्लॉग पोस्ट देखें। यह jQuery का उपयोग करता है, लेकिन अगर आप इसका उपयोग नहीं कर रहे हैं तो भी आपको इसकी मदद करनी चाहिए।

मूल रूप से आप अपने document.ready()

$('iframe').load(function() { 
    RunAfterIFrameLoaded(); 
}); 
+0

दिलचस्प है, लेकिन मेरे पास समस्या लोड घटनाओं और समय के साथ है। मैं उस लेख द्वारा सलाह दी गई लोड इवेंट के लिए सुन रहा हूं। –

+0

मैंने इसे 'console.log' के साथ आजमाया है। iframe लोड होने के बाद यह लॉग हो जाता है। – shorif2000

1

प्रतिक्रिया का उपयोग करने वालों के लिए, एक ही मूल iframe लोड ईवेंट का पता लगाने के रूप में iframe तत्व पर onLoad ईवेंट श्रोता सेट करने जितना आसान है।

<iframe src={'path-to-iframe-source'} onLoad={this.loadListener} frameBorder={0} />

1

एंबर का उपयोग कर किसी के लिए, यह काम करना चाहिए के रूप में उम्मीद:

<iframe onLoad={{action 'actionName'}} frameborder='0' src={{iframeSrc}} />