Доступ к переменной iframe из родительского
Сценарий iframe
<script type="text/javascript" >
var a=5;
</script>
скрипт родительского окна
<script type="text/javascript" >
function close()
{
var check=document.getElementById("iframeid").contentDocument.a;
alert(check)
}
</script>
Я хочу получить доступ к переменной, которая определена внутри iframe от родителя. Но приведенный выше код не работает должным образом, может кто-нибудь дать идею для реализации этого.
6 ответов
С помощью contentWindow
вместо contentDocument
работает для меня:
var check = document.getElementById("iframeid").contentWindow.a;
Кроме того, убедитесь, что домены совпадают и что вы используете веб-сервер для тестирования (я получил предупреждение протокола при тестировании из файловой системы).
Один метод, который всегда работал для меня надежно, заключается в том, чтобы iFrame давал своему родителю ссылку на свое собственное окно при первой загрузке. Затем родитель может получить доступ ко всем переменным через эту ссылку. Это требует, чтобы родительский файл загружался до iFrame, но для меня это обычно так.
Так в родительском
var iFrameWin;
Затем в iFrame в какой-то момент после того, как он загрузился и расположился
parent.iFrameWin = window; //parent now has a ref to the iframe's window
Затем в родительском, когда он хочет глобальное содержимое var от iFrame
alert(iFrameWin.ivar); // shows value if the global 'ivar' in the iFrame
Скрипт iframe:
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
скрипт родительского окна:
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
});
}
Большая часть моих знаний по этой теме получена из выступления Бена Винегара о бесшовных кадрах
Это междоменный метод "хорошо", чтобы справиться с этим. Я уверен, что есть некоторые дыры в безопасности, как и в Интернете.
Посмотрите, работает ли это для вас:
я создал это 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>
нажав на кнопку, я получаю значение в моем родительском окне.
Поиграйте с этим, если вы что-то получите с этим.
Это то, как 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>
Другой способ (доступ к ifr.dialogArgs из родительского окна после изменения его значения в документе iframe) также работает.
document.getElementById('ID_OF_IFRAME').document.getElementById('f1')
Обратите внимание, что междоменные ограничения будут по-прежнему применяться.