«Отказано в доступе» Ошибка JavaScript при попытке доступа к объекту документа созданного программным способом <iframe> (только для IE)

У меня есть проект, в котором мне нужно создать элемент <iframe> с помощью JavaScript и добавить его в DOM. После этого мне нужно вставить некоторый контент в <iframe>. Это виджет, который будет встроен в сторонние сайты.

Я не устанавливаю атрибут "src" в <iframe>, так как не хочу загружать страницу; скорее, он используется для изоляции / песочницы содержимого, которое я вставляю в него, чтобы я не столкнулся с конфликтами CSS или JavaScript с родительской страницей. Я использую JSONP для загрузки некоторого содержимого HTML с сервера и вставки его в этот <iframe>.

У меня это работает нормально, с одним серьезным исключением - если свойство document.domain установлено на родительской странице (что может быть в определенных средах, в которых развернут этот виджет), Internet Explorer (возможно, во всех версиях, но я подтверждено в 6, 7 и 8), при попытке получить доступ к объекту документа созданного мною <iframe> выдает ошибку «Отказано в доступе». Это не происходит ни в каких других браузерах, в которых я тестировал (все основные современные).

Это имеет некоторый смысл, так как я знаю, что Internet Explorer требует, чтобы вы установили для document.domain всех окон / фреймов, которые будут взаимодействовать друг с другом, одинаковое значение. Однако я не знаю, как установить это значение в документе, к которому у меня нет доступа.

Кто-нибудь знает способ сделать это - каким-то образом установить свойство document.domain этого динамически создаваемого <iframe>? Или я не смотрю на это с правильной стороны - есть ли другой способ достичь того, к чему я иду, не сталкиваясь с этой проблемой? Мне действительно нужно использовать <iframe> в любом случае, так как изолированное / изолированное окно имеет решающее значение для функциональности этого виджета.

Вот мой тестовый код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Document.domain Test</title>
    <script type="text/javascript">
      document.domain = 'onespot.com'; // set the page's document.domain
    </script>
  </head>
  <body>
    <p>This is a paragraph above the &lt;iframe&gt;.</p>
    <div id="placeholder"></div>
    <p>This is a paragraph below the &lt;iframe&gt;.</p>
    <script type="text/javascript">
      var iframe = document.createElement('iframe'), doc; // create <iframe> element
      document.getElementById('placeholder').appendChild(iframe); // append <iframe> element to the placeholder element
      setTimeout(function() { // set a timeout to give browsers a chance to recognize the <iframe>
        doc = iframe.contentWindow || iframe.contentDocument; // get a handle on the <iframe> document
        alert(doc);
        if (doc.document) { // HEREIN LIES THE PROBLEM
          doc = doc.document;
        }
        doc.body.innerHTML = '<h1>Hello!</h1>'; // add an element
      }, 10);
    </script>
  </body>
</html>

Я принимал это по адресу:

http://troy.onespot.com/static/access_denied.html

Как вы увидите, загружаете ли вы эту страницу в IE, в момент, когда я вызываю alert (), у меня есть дескриптор объекта окна <iframe>; Я просто не могу углубиться в объект документа.

Большое спасибо за любую помощь или предложения! Я буду в долгу перед тем, кто поможет мне найти решение этой проблемы.

Ответы на вопрос(11)

Ваш ответ на вопрос