प्रसंग
मुझे वेब-एक्सटेंशन के संदर्भ में स्वयं ऐसा करना पड़ा। यह वेब-एक्सटेंशन प्रत्येक पृष्ठ में UI के कुछ टुकड़े को इंजेक्ट करता है, और यह UI अंदर रहता है iframe
। अंदर की सामग्री iframe
गतिशील है, इसलिए मुझे इसकी चौड़ाई और ऊंचाई को फिर से पढ़ना पड़ाiframe
।
मैं रिएक्ट का उपयोग करता हूं लेकिन यह अवधारणा हर लाइब्रेरी पर लागू होती है।
मेरा समाधान (यह मानता है कि आप पृष्ठ और iframe दोनों को नियंत्रित करते हैं)
अंदर iframe
मैंने body
वास्तव में बड़े आयामों के लिए शैलियों को बदल दिया । यह अंदर के तत्वों को सभी आवश्यक स्थान का उपयोग करके बिछाने की अनुमति देगा। बनाना width
और height
100% मेरे लिए काम नहीं किया (मुझे लगता है क्योंकि iframe एक डिफ़ॉल्ट है width = 300px
और height = 150px
)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
फिर मैंने एक div के अंदर सभी iframe UI को इंजेक्ट किया और इसे कुछ स्टाइल दिया
#ui-root {
display: 'inline-block';
}
इसके अंदर अपने ऐप को रेंडर करने के बाद #ui-root
( रिएक्ट में मैं ऐसा करता हूं componentDidMount
) मैं इस डिव के आयामों की गणना करता हूं और उन्हें मूल पृष्ठ पर window.postMessage
निम्न के साथ सिंक करता हूं :
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
मूल फ्रेम में मैं कुछ इस तरह से करता हूं:
window.addEventListener('message', (ev) => {
if(ev.data.type && ev.data.type === 'resize-iframe') {
iframe.style.width = ev.data.payload.width + 'px'
iframe.style.height = ev.data.payload.height + 'px'
}
}, false)