Błąd „Odmowa dostępu” podczas próby uzyskania dostępu do obiektu dokumentu programowo utworzonej <ramka> (tylko IE)

Mam projekt, w którym muszę utworzyć element <iframe> za pomocą JavaScript i dodać go do DOM. Potem muszę wstawić trochę treści do <iframe>. To widżet, który zostanie osadzony w witrynach innych firm.

Nie ustawiam atrybutu „src” <iframe>, ponieważ nie chcę ładować strony; jest raczej używany do izolowania / piaskowania treści, które do niej wstawiam, aby nie wpływać na konflikty CSS lub JavaScript ze stroną nadrzędną. Używam JSONP, aby załadować jakąś treść HTML z serwera i wstawić ją w tej <ramce>.

Mam to działające, z jednym poważnym wyjątkiem - jeśli właściwość document.domain jest ustawiona na stronie nadrzędnej (co może być w niektórych środowiskach, w których ten widget jest wdrożony), Internet Explorer (prawdopodobnie wszystkie wersje, ale mam potwierdzone w 6, 7 i 8) daje mi błąd „Odmowa dostępu”, gdy próbuję uzyskać dostęp do obiektu dokumentu, który stworzyłem. Nie dzieje się tak w innych przeglądarkach, w których testowałem (wszystkie większe nowoczesne).

Ma to sens, ponieważ zdaję sobie sprawę, że program Internet Explorer wymaga ustawienia dokumentu.domena wszystkich okien / ramek, które będą się komunikować ze sobą do tej samej wartości. Nie wiem jednak, jak ustawić tę wartość w dokumencie, do którego nie mam dostępu.

Czy ktoś wie, jak to zrobić - w jakiś sposób ustaw właściwość document.domain tego dynamicznie tworzonej <iframe>? Czy nie patrzę na to pod odpowiednim kątem - czy istnieje inny sposób na osiągnięcie tego, do czego zmierzam, bez uciekania się do tego problemu? W każdym razie potrzebuję użyć <iframe>, ponieważ okno izolowane / piaskowe ma kluczowe znaczenie dla funkcjonalności tego widgetu.

Oto mój kod testowy:

<!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>

Hostowałem go pod adresem:

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

Jak zobaczysz, jeśli załadujesz tę stronę w IE, w momencie, w którym wywołam alert (), mam uchwyt na obiekcie okna <iframe>; Po prostu nie mogę zagłębić się w jego obiekt dokumentu.

Bardzo dziękuję za pomoc lub sugestie! Będę wdzięczny każdemu, kto pomoże mi znaleźć rozwiązanie tego problemu.

questionAnswers(11)

yourAnswerToTheQuestion