2009-10-21 5 views
46

में जावास्क्रिप्ट समारोह मैं इस समस्या जनक पृष्ठ से एक iframe में एक JavaScript फ़ंक्शन बुला है। यहाँ मेरी दो पृष्ठों है:कॉलिंग आइफ्रेम

mainPage.html

<html> 
<head> 
    <title>MainPage</title> 
    <script type="text/javascript"> 
     function Reset() 
     { 
      if (document.all.resultFrame) 
       alert("resultFrame found"); 
      else 
       alert("resultFrame NOT found"); 

      if (typeof (document.all.resultFrame.Reset) == "function") 
       document.all.resultFrame.Reset(); 
      else 
       alert("resultFrame.Reset NOT found"); 
     } 
    </script> 
</head> 
<body> 
    MainPage<br> 
    <input type="button" onclick="Reset()" value="Reset"><br><br> 
    <iframe height="100" id="resultFrame" src="resultFrame.html"></iframe> 
</body> 
</html> 

resultFrame.html

<html> 
<head> 
    <title>ResultPage</title> 
    <script type="text/javascript"> 
     function Reset() 
     { 
      alert("reset (in resultframe)"); 
     } 
    </script> 
</head> 
<body> 
    ResultPage 
</body> 
</html> 

(मुझे पता है कि document.all अनुशंसित नहीं है, लेकिन यह पृष्ठ केवल देखा जाना चाहिए IE के साथ आंतरिक और मुझे लगता है कि समस्या)

जब है नहीं लगता है मैं रीसेट-बटन दबाता हूं, मुझे "परिणामफ्रेम मिला" और "परिणामफ्रेम। रीसेट नहीं मिला"। ऐसा लगता है कि फ्रेम का संदर्भ है लेकिन फ्रेम पर फ़ंक्शन को कॉल नहीं कर सकता है, वह क्यों है?

+1

http://stackoverflow.com/questions/251420/invoking-javascript-in-iframe-from-parent-page –

+0

का डुप्लिकेट [मूल पृष्ठ से आईफ्रेम में जावास्क्रिप्ट कोड को आमंत्रित करना] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/251420/invoking-javascript-code-in-an-iframe-from-the-parent-page) – luk3yx

उत्तर

86

उपयोग:

document.getElementById("resultFrame").contentWindow.Reset(); 

आइफ्रेम

document.getElementById("resultFrame") में समारोह रीसेट तक पहुँचने के लिए अपने कोड में आइफ्रेम मिल जाएगा, और contentWindow iframe में खिड़की वस्तु मिल जाएगा। एक बार आपके पास बाल विंडो हो जाने के बाद, आप उस संदर्भ में जावास्क्रिप्ट का उल्लेख कर सकते हैं।

इसके अलावा bobince से जवाब विशेष रूप से HERE देखते हैं।

+3

हाय जोनाथन, करता है .contentWindow अभी भी काम करता है? मैं 'console.log (document.getElementById ('iframeID') करता हूं। ContentWindow) 'और फ़ायरबग में यह मेरे आईफ्रेम में सही ढंग से मेरा' टेस्ट() 'फ़ंक्शन दिखाता है, लेकिन जब मैं फ़ंक्शन को कॉल करने के लिए जाता हूं तो यह कहता है कि यह कोई फ़ंक्शन नहीं है , लकिन यह है! एफएफ 4 में इसका परीक्षण। –

2

objectframe.contentWindow.Reset() आप पहली फ्रेम में उच्च स्तर घटक के संदर्भ में की जरूरत है।

3

कॉल

window.frames['resultFrame'].Reset(); 
1

आप document.all के माध्यम से resultFrame का उपयोग करते हैं यह केवल एक HTML तत्व, नहीं एक खिड़की के फ्रेम के रूप में यह खींचती है। यदि आपके पास "यह" स्वयं-संदर्भ का उपयोग करके एक फ़्रेम आग लगाना है तो आपको एक ही समस्या मिलती है।

बदलें:

document.all.resultFrame.Reset(); 

के साथ:

window.frames.resultFrame.Reset(); 

या:

document.all.resultFrame.contentWindow.Reset(); 
5

इसके बजाय दस्तावेज़ से फ्रेम होने का, खिड़की वस्तु से फ्रेम हो रही कोशिश करो।

ऊपर के उदाहरण में बदल:

if (typeof (document.all.resultFrame.Reset) == "function") 
    document.all.resultFrame.Reset(); 
else 
    alert("resultFrame.Reset NOT found"); 

को
if (typeof (window.frames[0].Reset) == "function") 
    window.frames[0].Reset(); 
else 
    alert("resultFrame.Reset NOT found"); 

समस्या यह है कि iframe के भीतर जावास्क्रिप्ट के दायरे आइफ्रेम के लिए डोम तत्व के माध्यम से संपर्क में नहीं किया जाता है। केवल खिड़की वस्तुओं में फ्रेम के लिए जावास्क्रिप्ट स्कोपिंग जानकारी होती है।

4

और भी अधिक मजबूती के लिए:

function getIframeWindow(iframe_object) { 
    var doc; 

    if (iframe_object.contentWindow) { 
    return iframe_object.contentWindow; 
    } 

    if (iframe_object.window) { 
    return iframe_object.window; 
    } 

    if (!doc && iframe_object.contentDocument) { 
    doc = iframe_object.contentDocument; 
    } 

    if (!doc && iframe_object.document) { 
    doc = iframe_object.document; 
    } 

    if (doc && doc.defaultView) { 
    return doc.defaultView; 
    } 

    if (doc && doc.parentWindow) { 
    return doc.parentWindow; 
    } 

    return undefined; 
} 

और

... 
var el = document.getElementById('targetFrame'); 

getIframeWindow(el).reset(); 
... 
2

पहला और सबसे महत्वपूर्ण शर्त पूरी किए जाने की जरूरत है कि है कि दोनों माता पिता और iframe एक ही मूल से संबंधित होना चाहिए। एक बार यह हो जाता है बच्चे window.opener पद्धति का उपयोग करके माता-पिता आह्वान कर सकते हैं और माता पिता के रूप में ऊपर

0

उल्लेख आप इसे सीधे उपयोग नहीं कर सकते बच्चे के लिए भी ऐसा ही कर सकते हैं और अगर आप इस त्रुटि का सामना करना: एक फ्रेम अवरोधित क्रॉस-मूल फ्रेम तक पहुंचने से मूल "http://www ..com" मूल के साथ। आप सीधे फ़ंक्शन का उपयोग करने के बजाय postMessage() का उपयोग कर सकते हैं।