2012-12-07 79 views
31
可變

iframe的父窗口訪問iframe的父項

<script type="text/javascript" > 
function close() 
{ 
var check=document.getElementById("iframeid").contentDocument.a; 
alert(check) 
} 
</script> 

<script type="text/javascript" > 
var a=5; 
</script> 

劇本我要訪問是從父iframe中定義的變量的腳本。但上面的代碼不能正常工作,任何人都可以提供一個實現這個想法。

+1

跨域限制? –

回答

1

document.getElementById('ID_OF_IFRAME').document.getElementById('f1')

注意,跨域限制仍將適用。

44

使用的contentWindow代替contentDocument作品對我來說:

var check = document.getElementById("iframeid").contentWindow.a; 

此外,還要確保域匹配,並且您正在使用一個網絡服務器來測試(從文件系統進行測試時,我得到了一個協議警告)。 iframe的

+0

Chrome:SecurityError:阻止了源自「http://mydomain.com」的框架訪問跨源框架。 – Yevgen

+1

@Yevgen:你設置了Access-Control-Allow-Origin來設置相同的原點。如果您需要父窗口的信息,請查找postMessage並創建一個消息事件偵聽器。 – jnoreiga

+0

@jnoreiga你可以發佈一個鏈接,以瞭解更多的信息?謝謝! – Qwerty

3

腳本:

var b; 
// you might want to write these into if statements to make sure that e.data[0] is varA if you have multiple messages coming across 
if (typeof window.addEventListener != 'undefined') { 
    window.addEventListener('message', function(e) { 
     b = e.data[1]; 
    }, false); 
} else if (typeof window.attachEvent != 'undefined') { // this part is for IE8 
    window.attachEvent('onmessage', function(e) { 
     b = e.data; // you'll probably have to play around with this part as I can't remember exactly how it comes across in IE8 -- i think it will involve slice() iirc 
    }); 
} 

我的大部分知識對這個課題來源於Ben Vinegar's talk on Seamless iFrames

這是一個跨域 「好」:

var a = 5; 
window.parent.postMessage(['varA', a], '*'); // put this in some sort of function, ready, or whatever - you can call it multiple times if you need to as the code in the parent is an eventListener 

父窗口的腳本處理這些東西的方法。我確定有一些安全漏洞,就像網絡上的任何東西一樣。

+0

幾個小時後你救了我的男人,我確實找到了一個postMessage的解決方案,但不知道從iframe傳遞''*',因爲域名在file:/// –

1

看看這對你的作品:

我創造了這個parent.html頁面,並把一個iframe中它與文本輸入,將展示從IFRAME窗口傳遞的值:

<html> 
    <head> 
    <title>IFrame Example</title> 
    <script language="javascript"> 
      function hello(string){ 
       var name=string 
       document.getElementById('myAnchor').value=name; 
      } 
    </script> 
    </head> 
    <body> 
     <iframe namne="iframe" id="iframe_id" src="inputForm.html" height="150" > 
     </iframe> 
     Name: <input type="text" id="myAnchor" > 
     </body> 
</html> 

iframe content頁面:

<html> 
    <head> 
    <title>IFrame Child Example</title> 
    </head> 
    <body> 
    <form name="frm2" > 
     <h1><font color="#000099">Input Form</font></h1> 
     <p>Name : </p><input type="text" name="resp" id="input" value=""/> 
     <input type="button" onclick="parent.hello(this.form.resp.value);" value="Submit" /> 
    </form> 
</body> 
</html> 

點擊按鈕我得到我的父窗口中的值。

玩這個,如果你有這個東西。

12

一直以來我一直可靠地工作的一種方法是讓iFrame在第一次加載時爲其父窗口提供對其自己窗口的引用。父母可以通過該引用訪問所有變量。這確實需要在iFrame之前加載父項,但對於我來說通常是這種情況。

var iFrameWin; 

然後在某個點上的iFrame

所以之後它加載並定居下來

parent.iFrameWin = window; //parent now has a ref to the iframe's window 

然後,在父,當它想從一個全局變量內容iFrame

alert(iFrameWin.ivar); // shows value if the global 'ivar' in the iFrame 
0

這就是SharePoint在從父風傳遞參數值時的工作方式通過iframe。這很簡單,但它的工作原理。

<html> 
<body> 
    <iframe id="iframe1"></iframe> 
    <script type="text/javascript"> 
    var ifr = window.document.getElementById("iframe1"); 
    ifr.dialogArgs = "Hello from the other side."; 
    ifr.src = "iframeContent.html" 
    </script> 
</body> 
</html> 

內部iframeContent.html

<html> 
<body> 
    <input type="button" value="Click Me!" onclick="alert(window.frameElement.dialogArgs);" /> 
</body> 
</html> 

周圍的其他方法也適用(具有其通過的IFRAME文件修改值之後訪問ifr.dialogArgs從父窗口)。