“Доступ запрещен” ошибки JavaScript при попытке получить доступ к объекту документа программно созданного <iframe> (только для IE)

Я когда-то работал над приложением, в котором все изменения, внесенные командой в модель приложения (т.е. CDocument..., мы использовали MFC), были сохранены в конце команды путем обновления полей во внутренней базе данных, сохраняемой в рамках модели. Таким образом, мы не должны были писать отдельный код отмены/восстановления для каждого действия. Стек отмены просто помнил первичные ключи, имена полей и старые значения каждый раз, когда запись была изменена (в конце каждой команды).

80
задан Bungle 11 December 2009 в 08:07
поделиться

4 ответа

если свойство document.domain установлено на родительской странице, Internet Explorer выдает мне сообщение «Доступ запрещен»

Вздох. Да, это проблема IE (ошибка? Трудно сказать, поскольку нет документированного стандарта для такого рода неприятностей). Когда вы создаете iframe без srcless, он получает document.domain от родительского документа location.host вместо его document.domain . На этом этапе вы в значительной степени потеряли, поскольку не можете его изменить.

Ужасный обходной путь - установить src в javascript: URL (ура!):

 iframe.src= "javascript:'<html><body><p>Hello<\/p><script>do things;<\/script>'";

Но по какой-то причине , такой документ не может установить свой собственный document.domain из сценария в IE (старая добрая «неопределенная ошибка»), поэтому вы не можете использовать это, чтобы восстановить мост между родителем (*). Вы можете использовать его для написания всего документа HTML, при условии, что виджету не нужно взаимодействовать со своим родительским документом после его создания.

Однако URL-адреса JavaScript iframe не работают в Safari, поэтому вы Мне все равно понадобится какой-то анализ браузера, чтобы выбрать, какой метод использовать.

*: По какой-то другой причине вы можете в IE установить document.domain из второй документ, документ, написанный первым документом. Так что это работает:

if (isIE)
    iframe.src= "javascript:'<script>window.onload=function(){document.write(\\'<script>document.domain=\\\""+document.domain+"\\\";<\\\\/script>\\');document.close();};<\/script>'";

На данный момент уровень отвратительности для меня слишком высок, я выхожу. Я бы сделал внешний HTML, как сказал Дэвид.

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

*: По какой-то другой причине вы можете в IE установить document.domain из второй документ, документ, написанный первым документом. Так что это работает:

if (isIE)
    iframe.src= "javascript:'<script>window.onload=function(){document.write(\\'<script>document.domain=\\\""+document.domain+"\\\";<\\\\/script>\\');document.close();};<\/script>'";

На данный момент уровень отвратительности для меня слишком высок, я выхожу. Я бы сделал внешний HTML, как сказал Дэвид.

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

*: По какой-то другой причине вы можете в IE установить document.domain из второй документ, документ, написанный первым документом. Так что это работает:

if (isIE)
    iframe.src= "javascript:'<script>window.onload=function(){document.write(\\'<script>document.domain=\\\""+document.domain+"\\\";<\\\\/script>\\');document.close();};<\/script>'";

На данный момент уровень отвратительности для меня слишком высок, я выхожу. Я бы сделал внешний HTML, как сказал Дэвид.

66
ответ дан 24 November 2019 в 10:01
поделиться

Ну да, исключение доступа связано с тем, что document.domain должен совпадать в вашем родительском и вашем iframe, и до того, как они это сделают, вы не сможете программно установить document.domain вашего iframe.

Я думаю, что лучше всего указать страницу на собственный шаблон:

iframe.src = '/myiframe.htm#' + document.domain;

И в myiframe.htm:

document.domain = location.hash.substring(1);
18
ответ дан 24 November 2019 в 10:01
поделиться

Вы пробовали jQuery.contents () ?

1
ответ дан 24 November 2019 в 10:01
поделиться

Кажется, проблема с IE возникает, когда вы пытаетесь получить доступ к iframe через объект document.frames - если вы сохраняете ссылку на созданный iframe в переменной, вы можете получить доступ к внедренному iframe через переменную (my_iframe в код ниже).

Я заставил это работать в IE6 / 7/8

var my_iframe;
var iframeId = "my_iframe_name"
if (navigator.userAgent.indexOf('MSIE') !== -1) {
  // IE wants the name attribute of the iframe set
  my_iframe = document.createElement('<iframe name="' + iframeId + '">');
} else {
  my_iframe = document.createElement('iframe');
}

iframe.setAttribute("src", "javascript:void(0);");
iframe.setAttribute("scrolling", "no");
iframe.setAttribute("frameBorder", "0");
iframe.setAttribute("name", iframeId);

var is = iframe.style;
is.border = is.width = is.height = "0px";

if (document.body) {
  document.body.appendChild(my_iframe);
} else {
  document.appendChild(my_iframe);
}
1
ответ дан 24 November 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: