Получение объекта документа из iframe - PullRequest
45 голосов
/ 27 сентября 2011

Я пытаюсь получить объект документа 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, и я думаю, что я также протестировал некоторые другие опции, но все они возвращают неопределенные, даже примеры, которые должны были работать, но они не работают для меня. Итак, у меня уже есть объект iframe, теперь все, что мне нужно, это объект документа. Я проверил это на Firefox и Chrome безрезультатно.

Ответы [ 3 ]

68 голосов
/ 27 сентября 2011

Попробуйте следующее

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 с другим источником, потому что он нарушает политику безопасности "Same Origin"

6 голосов
/ 03 августа 2012

Для еще большей прочности:

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');

var frame_win = getIframeWindow(el);

if (frame_win) {
  frame_win.targetFunction();
  ...
}
...
6 голосов
/ 27 сентября 2011

Это код, который я использую:

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 против 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...