iframe contentWindow выдает ошибку отказа в доступе после сокращения документа.домен

Я создаю IFRAME динамически следующим образом:

var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';
wrapUpIframe.src = 'WrapUpDialog.html';    
document.body.appendChild(wrapUpIframe);

после динамического создания my document.domain сокращается с Servername.dc.com только dc.com,

но когда я пытаюсь получить доступ к contentWindow я получил доступ запрещен ошибка:

document.getElementById("WrapUpDialog3").contentWindow.SomeFunction();

Примечание: когда я определяю IFRAME статически в HTML, он отлично работает.
Я также попытался изменить свой IFRAME document.domain следующим образом:

WrapUpDialog3.document.domain = dc.com;

Я проверил оба document.domain и мой домен IFRAME, и они оба идентичны.

что я могу сделать?

Я работаю с IE9.

3 ответов


сначала взгляните на правильный ответ из этого в должности. Мне кажется, это может быть твоей проблемой.

если не это, то, возможно, этот быстрый Хак я видел из другого в должности может помочь.

 var frame = $('<iframe>')
.attr('id', 'myIframe')
.addClass('someClass')
.attr('src', 'javascript:(function () {' +'document.open();document.domain=\'myDomain.net\';document.close();' + '})();');
.appendTo($('#someDiv'));

не уверен, что это актуально, но я также нашел это в интернете ссылке.

OK, чтобы ответить на ваш комментарий. Функция javascript не назначает источник, она устанавливает домен документа, который по-видимому, не делается правильно В I. E.

зацените ссылке для другого примера и объяснения.

так что я бы попробовал что-то вроде этого ...

var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';    
wrapUpIframe.src = setSrc();
document.body.appendChild(wrapUpIframe);

function setSrc(){document.open();document.domain=\'dc.com\';document.close();return 'WrapUpDialog.html';}

возможно, вам придется поиграть с тем, как вернуть фактический url для iframe после запуска функции, которая устанавливает домен документа. Но из того, что я вижу, это может сработать для вас.

у меня была аналогичная проблема, но не совсем та же проблема вот почему я не могу дать вам точную информацию. Функция, задающая домен документа, помогла мне преодолеть ошибку отказа в доступе.

вы также можете добавить это в свой основной документ, чтобы действительно убедиться, что домены совпадают.

 <script type="text/javascript">
    document.domain = 'dc.com';
  </script>

Я также хотел добавить ссылке для некоторых объяснений по явной настройке документа.домен, который я использовал раньше. Это было полезно для меня в прошлом. Особенно эта цитата ...

явно установка значения указывает на намерение "сотрудничать" с скрипт на другом поддомене (под тем же родительским доменом).

Дор, у вас может быть проблема со временем. Я нашел код (здесь), который я только что тестировал, который работает для меня. Он гарантирует, что iframe загружен, прежде чем вы попытаетесь получить доступ к contentWindow.

var iframe = document.createElement("iframe");
iframe.src = "WrapUpDialog.html";

if (iframe.attachEvent){
    iframe.attachEvent("onload", function(){
        alert("Local iframe is now loaded.");
    });
} else {
    iframe.onload = function(){
        alert("Local iframe is now loaded.");
    };
}

document.body.appendChild(iframe);

var iframeWindow = iframe.contentWindow || iframe.contentDocument.parentWindow;

как вы обслуживаете свои файлы? Вы видите file:/// в адресной строке? Если да, попробуйте обслуживать свой код с помощью веб-сервера.

Google Chrome дает ошибку отказа в доступе, если я попробую ваш код с помощью file:///, но это работает, когда подается с локального веб-сервера (т. е. адрес начинается с http://localhost/).


так как вы еще не приняли ни один из ответов, вы, вероятно, все еще есть проблема.

попробуйте document.domain явно на обеих HTML-страницах (вы, похоже, делаете это только на одной странице). Это означает, что, как предложил @Vic, вам нужно добавить следующий код javascript в HTML, который включает iframe:

document.domain = 'dc.com';

это означает, что ваш код будет выглядеть так:

document.domain = 'dc.com';
var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';
wrapUpIframe.src = 'WrapUpDialog.html';    
document.body.appendChild(wrapUpIframe);

затем в (не на главной странице, потому что тогда вы обойдете систему безопасности!) вам нужно установить document.domain а также:

document.domain = dc.com;

так что эта ваша строка не будет работать:

WrapUpDialog3.document.domain = 'dc.com';

, потому что WrapUpDialog.html сам должен предоставить разрешение на свою "родительскую" страницу для выполнения своего javascript.

на этой странице есть дополнительная информация:что же документа.домен = документ.домен делать?.

окончательный совет: попробуйте свой код с помощью разных браузеров: IE9, Firefox, Google Chrome. Это может помочь вы определяете, возможно ли, что вы имеете дело с причудой одного конкретного браузера.