Получение объекта документа iframe
Я пытаюсь получить объект документа iframe, но ни один из примеров, с которыми я столкнулся, похоже, помогает. Мой код выглядит следующим образом:
<html>
<head>
<script>
function myFunc(){
alert("I'm getting this far");
var doc=document.getElementById("frame").document;
alert("document is undefined: "+doc);
}
</script>
</head>
<body>
<iframe src="http://www.google.com/ncr" id="frame" width="100%" height="100%" onload="myFync()"></iframe>
</body>
</html>
Я тестировал, что я могу получить объект iframe, но .document не работает, не делает .contentDocument, и я думаю, что я также проверил некоторые другие параметры, но все они возвращают undefined, даже примеры, которые должны были работать, но они не работают для меня. Таким образом, у меня уже есть объект iframe, теперь все, что я хочу, это объект документа. Я тестировал это на Firefox и Chrome безрезультатно.
Ответы
Ответ 1
Попробуйте выполнить
var doc=document.getElementById("frame").contentDocument;
// Earlier versions of IE or IE8+ where !DOCTYPE is not specified
var doc=document.getElementById("frame").contentWindow.document;
Примечание. AndyE указал, что contentWindow
поддерживается всеми основными браузерами, поэтому это может быть лучший способ.
Примечание2: В этом примере вы не сможете получить доступ к документу с помощью любых средств. Причина в том, что вы не можете получить доступ к документу iframe с другим происхождением, поскольку он нарушает политику безопасности "того же происхождения"
Ответ 2
Это код, который я использую:
var ifrm = document.getElementById('myFrame');
ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
ifrm.document.open();
ifrm.document.write('Hello World!');
ifrm.document.close();
contentWindow vs. contentDocument
- IE (Win) и Mozilla (1.7) вернут объект окна внутри iframe с oIFrame.contentWindow.
- Safari (1.2.4) не понимает этого свойства, но имеет oIframe.contentDocument, который указывает на объект документа внутри iframe.
- Чтобы сделать его еще более сложным, Opera 7 использует oIframe.contentDocument, но он указывает на оконный объект IFrame. Поскольку Safari не имеет прямого доступа к объекту окна элемента iframe через стандартный DOM (или это?), наш полностью код, совместимый с современным кросс-браузером, сможет получить доступ только к документ внутри iframe.
Ответ 3
Для еще большей надежности:
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).targetFunction();
...