एक iframe से पैरेंट विंडो फ़ंक्शन को कॉल करना


281

मैं एक iframe से एक मूल विंडो जावास्क्रिप्ट फ़ंक्शन को कॉल करना चाहता हूं।

<script>
    function abc()
    {
        alert("sss");
    }
</script>

<iframe id="myFrame">
    <a onclick="abc();" href="#">Call Me</a>
</iframe>

1
मैं अभी (२०१६) कुछ भी नहीं दिखा पाऊंगा, मुझे नहीं पता कि पुराना बोवर किसी भी तरह का समर्थन करेगा
वेइजिंग जे लिन

जवाबों:


438
<a onclick="parent.abc();" href="#" >Call Me </a>

विंडो देखें

वर्तमान विंडो या सबफ़्रेम के जनक का संदर्भ देता है।

यदि विंडो में माता-पिता नहीं है, तो इसकी मूल संपत्ति अपने आप में एक संदर्भ है।

जब एक विंडो को एक <iframe>, <object>या <frame>, में लोड किया जाता है , तो इसका अभिभावक विंडो को एम्बेड करने वाले तत्व के साथ विंडो होता है।


17
हमेशा ध्यान रखें कि मूल दस्तावेज़ और iframe दस्तावेज़ को प्रोटोकॉल और डोमेन नाम से मेल खाना चाहिए। यदि ऐसा नहीं होता है, तो आपको सुरक्षा त्रुटि मिलेगी क्योंकि यह क्रॉस डोमेन स्क्रिप्टिंग की अनुमति नहीं देता है।
a4bike

एम बस सोच रहा है कि दोनों में से कौन सा एक alertआह्वान किया जाएगा; माता-पिता का alertकार्य या iframe का alertकार्य, अगर parent.abc();iframe कहा जाता है?
प्रखर मिश्रा

@PrakharMishra भ्रमित न हों। जनक का अर्थ होता है माता-पिता।
साहू वी कुमार

3
ऐसे परिदृश्यों के लिए @ a4bike, window.postMessage()(या window.parent.postMessage()) मौजूद है। @Andrii उत्तर की
Fr0zenFyr

81

मुझे हाल ही में यह पता लगाना था कि यह काम क्यों नहीं किया।

आप जिस बच्चे को आइफ्रेम से बुलाना चाहते हैं उसे माता-पिता के सिर में होना चाहिए। यदि यह शरीर में है, तो स्क्रिप्ट वैश्विक दायरे में उपलब्ध नहीं है।

<head>
    <script>
    function abc() {
        alert("sss");
    }
    </script>
</head>
<body>
    <iframe id="myFrame">
        <a onclick="parent.abc();" href="#">Click Me</a>
    </iframe>
</body>

आशा है कि यह किसी को भी मदद करता है जो इस मुद्दे पर फिर से ठोकर खाता है।


1
इस पोस्ट में बताई गई कोई भी तकनीक क्रोम पर काम नहीं करती है। इसके लिए कोई उपाय?
कुमार कुश

3
अगर मुझे सही से याद है, तो मुझे यह उम्मीद के मुताबिक काम नहीं मिल सकता है अगर आईफ्रेम के पास माता-पिता के लिए एक अलग डोमेन है। क्षमा करें यह कोई समाधान नहीं है, लेकिन यह समझा सकता है कि यह काम क्यों नहीं कर रहा है।
ऐश क्लार्क

1
हाँ। मुझे पता है कि यह विभिन्न डोमेन के कारण है, लेकिन क्या इसके आसपास काम करने का कोई तरीका नहीं है?
कुमार कुश

1
मैंने अभी पोस्ट किया है कि आपकी समस्या का समाधान क्या हो सकता है। दूसरे जवाब पर एक नजर।
ऐश क्लार्क

1
समान मूल नीति निर्धारण नियमों के अनुसार (देखें: en.wikipedia.org/wiki/… ), उप डोमेन को एक डोमेन के उप डोमेन के लिए एक अलग होस्टनाम माना जाता है। यदि आप पहले से ही नहीं है, तो आप उपडोमेन में सिर्फ document.domain सेट करने की कोशिश कर सकते हैं?
ऐश क्लार्क

72

Window.postMessage ()

यह विधि सुरक्षित रूप से cross-originसंचार को सक्षम बनाती है।

और अगर आपके पास पैरेंट पेज कोड तक पहुंच है, तो किसी भी पैरेंट विधि के साथ-साथ किसी भी डेटा को सीधे पास किया जा सकता है Iframe। यहाँ एक छोटा सा उदाहरण है:

मूल पृष्ठ:

if (window.addEventListener) {
    window.addEventListener("message", onMessage, false);        
} 
else if (window.attachEvent) {
    window.attachEvent("onmessage", onMessage, false);
}

function onMessage(event) {
    // Check sender origin to be trusted
    if (event.origin !== "http://example.com") return;

    var data = event.data;

    if (typeof(window[data.func]) == "function") {
        window[data.func].call(null, data.message);
    }
}

// Function to be called from iframe
function parentFunc(message) {
    alert(message);
}

आईफ्रेम कोड:

window.parent.postMessage({
    'func': 'parentFunc',
    'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *

अद्यतन:

सुरक्षा नोट:

हमेशा एक विशिष्ट टारगेट प्रदान करें। नहीं *, यदि आप जानते हैं कि अन्य विंडो का दस्तावेज़ कहाँ स्थित होना चाहिए। एक विशिष्ट लक्ष्य प्रदान करने में विफल रहने से आप किसी भी इच्छुक दुर्भावनापूर्ण साइट पर डेटा भेजते हैं ( ZalemCitizen द्वारा टिप्पणी )।

संदर्भ:


1
मैं दूसरों पर इसका इस्तेमाल करना पसंद करता हूं। विशेष रूप से क्योंकि यह क्रॉस ओरिजिन डॉक्स पर आईफ्रेम का उपयोग करने के लिए अधिक समझ में आता है (हालांकि प्रोग्रामर आइफ्रेम का अधिक बार उपयोग नहीं करते हैं) और ब्राउज़रों पर इस फ़ंक्शन के लिए व्यापक समर्थन दिया।
Fr0zenFyr

1
धन्यवाद! मुझे हमेशा एक घंटे या उससे अधिक समय बिताना पड़ता है और शोध करना पड़ता है कि मैसेजिंग को जटिल, क्रियात्मक उदाहरणों के साथ कैसे किया जाए। इसने 60 सेकंड में काम किया। एक उदाहरण के लिए धन्यवाद जो रसीला और बिंदु तक है।
RandallTo

2
उस मूल्य को बढ़ाने के लिए ( एमडीएन वेब डॉक्स से ): हमेशा एक विशिष्ट टारगेटऑर्गिन प्रदान करें, न कि *, यदि आप जानते हैं कि दूसरी विंडो का दस्तावेज कहां स्थित होना चाहिए। एक विशिष्ट लक्ष्य प्रदान करने में विफल रहने पर आप किसी भी इच्छुक दुर्भावनापूर्ण साइट पर भेजे गए डेटा का खुलासा करते हैं
ZalemCitizen

20

मैंने इसे एक अलग उत्तर के रूप में पोस्ट किया है क्योंकि यह मेरे मौजूदा उत्तर से असंबंधित है।

इस मुद्दे ने हाल ही में एक उपडोमेन के संदर्भ में एक iframe से माता-पिता तक पहुंचने के लिए फिर से क्रॉप किया और मौजूदा फिक्सेस काम नहीं किया।

इस बार उत्तर माता-पिता पृष्ठ के document.domain को संशोधित करने और iframe समान होने के लिए था। यह एक ही मूल नीति की जांच को बेवकूफ बना देगा, यह सोचकर कि वे एक ही डोमेन पर मौजूद हैं (उप डोमेन को एक अलग मेजबान माना जाता है और एक ही मूल नीति जांच विफल हो जाती है)।

<head>पेरेंट डोमेन से मेल करने के लिए iframe में पेज पर निम्नलिखित को सम्मिलित करें (अपने सिद्धांत के लिए समायोजित करें)।

<script>
    document.domain = "mydomain.com";
</script>

कृपया ध्यान दें कि यह लोकलहोस्ट डेवलपमेंट पर एक एरर फेंक देगा, इसलिए एरर से बचने के लिए निम्नलिखित जैसे चेक का उपयोग करें:

if (!window.location.href.match(/localhost/gi)) {
    document.domain = "mydomain.com";
} 

और स्थानीयहोस्ट में इसके परीक्षण के बारे में क्या? उस के लिए कोई समाधान?
उमेश अवस्थी

देखें: "कृपया ध्यान दें कि यह लोकलहोस्ट डेवलपमेंट पर एक एरर फेंक देगा, इसलिए एरर से बचने के लिए निम्नलिखित जैसे चेक का उपयोग करें"
ऐश क्लार्क

2
यह ध्यान देने योग्य है कि (कम से कम Google क्रोम में) दोनों, माता-पिता और बच्चे को MET SET document.domain चाहिए, भले ही उनमें से एक पहले से ही "सही" हो! उदाहरण: जनक example.comiframe है abc.example.com, तो माता-पिता और iframe दोनों को कॉल करना होगाdocument.domain = "example.com"
KillerX

हां, यह सही है, मैंने यहां एक टाइपो बनाया है: "पेज टू द आइफ्रेम टू बी द सेम" होना चाहिए "पृष्ठ और iframe समान होना चाहिए।" ..... धन्यवाद!
ऐश क्लार्क

if () के लिए आप बस क्यों नहीं उपयोग करेंगे यदि (document.domain! = "mydomain.com"? इसके अलावा, मैं उलझन में हूं, क्या <script> पैरेंट विंडो या iFrame में जाती है? साथ ही, सेटिंग? document.domain में iFrame जेनरेट करता है "'डोमेन' प्रॉपर्टी को 'डॉक्यूमेंट' पर सेट करने में विफल: 'लोकलहोस्ट' 'sc-localhost' का प्रत्यय नहीं है।
user2568374

18

आप उपयोग कर सकते हैं

window.top

निम्नलिखित देखें।

<head>
    <script>
    function abc() {
        alert("sss");
    }
    </script>
</head>
<body>
    <iframe id="myFrame">
        <a onclick="window.top.abc();" href="#">Click Me</a>
    </iframe>
</body>

जब माता-पिता को कॉल करने की कोशिश कर रहे हैं। कस्टम_फंक्शन (); एक iframe से काम नहीं करता है आप window.top.custom_function () पा सकते हैं; काम करेगा। किसी विषम कारण के लिए मेरे लिए काम करता है। पैरेंट विंडो पर मेरे javascripts सभी पाद लेख में एम्बेड किए गए हैं, मैंने कहीं पढ़ा है कि पाद लेख में जावास्क्रिप्ट फ़ाइलों सहित समस्या parent.custom_function () काम नहीं कर रही है।
फ्रिसो होर्स्टमैन

@Vinothkumar, एक प्रश्न कृपया, जो कि "window.top.abc ()" को "abc ()" कहने के बजाय, अग्रिम धन्यवाद =) के बीच का अंतर है
Zilev av

@Zilev av इस थ्रेड का पूरा बिंदु एक पेरेंट डॉक्यूमेंट में एक चाइल्ड iframe से कॉल कर रहा है। यही अंतर है। कॉलिंग abc()केवल तभी काम करेगी जब मूल पृष्ठ पर विरोध के रूप में iframe मेंfunction abc() घोषित किया गया होwindow.top.abc()मूल दस्तावेज़ में iframe से बाहर निकलता है।
शॉन केंडल

3

उन लोगों के लिए एक और इसके अतिरिक्त जिन्हें इसकी आवश्यकता है। ऐश क्लार्क का समाधान काम नहीं करता है यदि वे विभिन्न प्रोटोकॉल का उपयोग कर रहे हैं, तो सुनिश्चित करें कि यदि आप एसएसएल का उपयोग कर रहे हैं, तो आपका आईफ्रेम एसएसएल का उपयोग कर रहा है या यह फ़ंक्शन को तोड़ देगा। उनका समाधान स्वयं डोमेन के लिए काम करता था, हालांकि इसके लिए धन्यवाद।


2

उपमहाद्वीपों के लिए ऐश क्लार्क द्वारा दिया गया समाधान बहुत अच्छा काम करता है, लेकिन कृपया ध्यान दें कि आपको document.domain = "mydomain.com" शामिल करना होगा; iframe पेज के प्रमुख और पैरेंट पेज के प्रमुख दोनों में, जैसा कि लिंक उसी मूल पॉलिसी चेक में कहा गया है

जावास्क्रिप्ट डोम एक्सेस के लिए लागू की गई समान मूल नीति के लिए एक महत्वपूर्ण विस्तार (लेकिन समान-मूल चेक के अन्य जायके के लिए नहीं) यह है कि एक सामान्य शीर्ष-स्तरीय डोमेन साझा करने वाली दो साइटें "समान होस्ट" को विफल करने के बावजूद संवाद करने का विकल्प चुन सकती हैं। अपने संबंधित दस्तावेज़.डोमेन डोम संपत्ति को अपने वर्तमान होस्ट नाम के समान योग्य, दाहिने हाथ के टुकड़े से परस्पर सेट करके चेक करें। उदाहरण के लिए, यदि http://en.example.com/ और http://fr.example.com/ दोनों ने document.domain को "example.com" पर सेट किया है, तो वे उसी बिंदु पर होंगे जो समान-मूल माना जाता है डोम हेरफेर का उद्देश्य।


हां, यह सही है, मैंने यहां एक टाइपो बनाया है: "पेज टू द आइफ्रेम टू बी द सेम" होना चाहिए "पृष्ठ और iframe समान होना चाहिए।" ..... धन्यवाद!
ऐश क्लार्क

कैसे स्थानीय कंप्यूटर में फ़ाइलों को चलाने के बारे में? का मूल्य क्या है document.domain?
रैप्टर

यह localhostमशीन (आमतौर पर 127.0.0.1) का आईपी पता होगा , जो इस बात पर निर्भर करता है कि यूआरएल एड्रेस बार में क्या है।
ऐश क्लार्क

2

parent.abc () केवल सुरक्षा उद्देश्यों के कारण एक ही डोमेन पर काम करेगा। मैंने इस समाधान की कोशिश की और मेरा काम पूरी तरह से काम कर गया।

<head>
    <script>
    function abc() {
        alert("sss");
    }

    // window of the iframe
    var innerWindow = document.getElementById('myFrame').contentWindow;
    innerWindow.abc= abc;

    </script>
</head>
<body>
    <iframe id="myFrame">
        <a onclick="abc();" href="#">Click Me</a>
    </iframe>
</body>

उम्मीद है की यह मदद करेगा। :)


यह भी वास्तव में केवल iframe के दस्तावेज़ के लिए कोई उपयोग है, अगर आपको माता-पिता के रूप पर नियंत्रण को संदर्भित करने की आवश्यकता है, तो बड़े पैमाने पर जटिलताओं को जोड़ना।
पॉल

1

फ़ायरफ़ॉक्स और क्रोम के साथ आप उपयोग कर सकते हैं:

<a href="whatever" target="_parent" onclick="myfunction()">

यदि iffame और माता-पिता दोनों में myfunction मौजूद है, तो माता-पिता को बुलाया जाएगा।


यह काम नहीं करता है। यहाँ मेरा डेमो है: dotku.github.io/tech/html/iframe/iframe_function_container.html
जय लिन

जैसा कि ऐश क्लार्क द्वारा कहा गया है, आप जिस बच्चे को आइफ्रेम से बुलाना चाहते हैं, उसे माता-पिता के सिर में होना चाहिए।
स्नोफ्लेक

स्वीकृत उत्तर को स्क्रिप्ट के सिर में होने की आवश्यकता नहीं है। अगर इस समाधान को भी स्क्रिप्ट के सिर में होने या न होने की आवश्यकता नहीं है, तो मैंने परीक्षण नहीं किया।
गाइ शल्नत

0

हालांकि इनमें से कुछ समाधान काम कर सकते हैं, उनमें से कोई भी सर्वोत्तम प्रथाओं का पालन नहीं करता है। कई ग्लोबल वैरिएबल असाइन करते हैं और आप अपने आप को कई पेरेंट वैरिएबल्स या फंक्शन्स के लिए कॉल कर सकते हैं, जो एक अव्यवस्थित, कमजोर नाम स्थान पर ले जाते हैं।

इससे बचने के लिए, एक मॉड्यूल पैटर्न का उपयोग करें। मूल विंडो में:

var myThing = {
    var i = 0;
    myFunction : function () {
        // do something
    }
};

var newThing = Object.create(myThing);

फिर, iframe में:

function myIframeFunction () {
    parent.myThing.myFunction();
    alert(parent.myThing.i);
};

यह क्रॉकफोर्ड के सेमिनल टेक्स्ट के इनहेरिटेंस चैप्टर में वर्णित पैटर्न के समान है, "जावास्क्रिप्ट: द गुड पार्ट्स।" आप जावास्क्रिप्ट के सर्वोत्तम अभ्यासों के लिए w3 के पृष्ठ पर और भी जान सकते हैं। https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.