Как бороться с динамической настройкой содержимого iframe
У меня есть страница, где мне нужно динамически создать iframe и вставить его в div на странице. Я создаю iframe следующим образом:
var frame = $('<iframe>')
.attr('id', 'myIframe')
.addClass('someClass')
.appendTo($('#someDiv'));
В зависимости от некоторых условий мне нужно: A) установить для iframe src какую-то другую страницу ИЛИ B) динамически добавить HTML в iframe.
У меня есть вариант А, работающий нормально, но вариант Б вызывает ошибки безопасности:
if (someCondition) {
// option A, works fine
frame.attr('src', someURL);
} else {
// option B, blows up with "Access is denied."
$(frame[0].contentWindow.document).find('body').html(someHTML);
}
Нужно ли устанавливать document.domain
на динамический iframe, прежде чем пытаться установить HTML? Как бы я вообще это сделал? Есть ли более простой способ добавить динамический контент в динамический фрейм?
Заранее спасибо.
Правка здесь представляет HTML-код динамического iframe, как и было запрошено:
<div id="someDiv">
<iframe id="myIframe" class="someClass"></iframe>
</div>
3 ответа
Мне удалось использовать исправление, подобное ответу на этот вопрос, чтобы обойти проблему:
var frame = $('<iframe>')
.attr('id', 'myIframe')
.addClass('someClass')
.attr('src', 'javascript:(function () {' +
'document.open();document.domain=\'myDomain.net\';document.close();' +
'})();');
.appendTo($('#someDiv'));
Это хак по всем определениям, но я думаю, что это лучший способ решить проблему.
Извините, но если iframe ссылается на источник URL из другого домена, вы не можете получить к нему доступ.
http://javascript.info/tutorial/same-origin-security-policy
При этом вы можете получить доступ к его телу, если у вас есть либо URL-адрес из того же домена, либо если вы заполните атрибут src "javascript:void(0);". после этого попробуйте получить к нему доступ таким образом:
$($('iframe').contents().get(0)).find('body')
Когда вы создаете iframe, убедитесь, что у него указан src:
src='about:blank'
Или создайте blank.html на сервере и укажите на это