Я когда-то работал над приложением, в котором все изменения, внесенные командой в модель приложения (т.е. CDocument..., мы использовали MFC), были сохранены в конце команды путем обновления полей во внутренней базе данных, сохраняемой в рамках модели. Таким образом, мы не должны были писать отдельный код отмены/восстановления для каждого действия. Стек отмены просто помнил первичные ключи, имена полей и старые значения каждый раз, когда запись была изменена (в конце каждой команды).
если свойство 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, как сказал Дэвид.
Ну да, исключение доступа связано с тем, что document.domain
должен совпадать в вашем родительском и вашем iframe, и до того, как они это сделают, вы не сможете программно установить document.domain
вашего iframe.
Я думаю, что лучше всего указать страницу на собственный шаблон:
iframe.src = '/myiframe.htm#' + document.domain;
И в myiframe.htm:
document.domain = location.hash.substring(1);
Кажется, проблема с 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);
}