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