Подтвердить что ты не робот

Получение объекта документа 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 безрезультатно.

4b9b3361

Ответ 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();
...