Не удается изменить содержимое iFrame в Firefox 4 / IE

#javascript #iframe

#javascript #iframe

Вопрос:

У меня есть следующий код:

 <html>
<head>
</head>
<body>
    <script type="text/javascript">
        var frame = document.createElement('iframe');
        frame.id = 'myFrame';
        document.getElementsByTagName('body')[0].appendChild(frame);
        var context = frame.contentWindow.document;
        context.body.innerHTML = 'testing';
    </script>
</body>
</html>
  

Это создает простой iframe, содержащий мой текст: ‘testing’.

Это отлично работает в Chrome, но Firefox и IE отображают пустой iframe.

Есть идеи, что я делаю не так?

Ответ №1:

Вы можете сделать что-то вроде этого:

 var frame = document.createElement('iframe');
frame.id = 'myFrame';
document.getElementsByTagName('body')[0].appendChild(frame);

frame = (frame.contentWindow) ? frame.contentWindow : (frame.contentDocument.document) ? frame.contentDocument.document : frame.contentDocument;
frame.document.open();
frame.document.write('testing');
frame.document.close();
  

Javascript интерпретируется по-разному всеми браузерами, так что это просто вопрос использования общего подхода. Это должно работать во всех браузерах.

Попробуйте.

Комментарии:

1. Я также пробовал это перед публикацией и после прочтения вашего ответа (просто чтобы убедиться!). Проблема не в этом…

2. TNC — Новый код отлично работает в разных браузерах. Спасибо. Есть ли возможность добавить динамические элементы (например, создать скрипт и поместить его в <head>)? У меня все еще возникают некоторые проблемы на этом фронте…

3. Можете ли вы подробнее рассказать о том, что вы пытаетесь сделать? Я не против помочь с немного большим контекстом.

Ответ №2:

Некоторые браузеры явно запрещают подобные вещи, поэтому вы не можете, например, загрузить веб-сайт чьего-либо банка во фрейме и взаимодействовать с ним в Javascript. Эта ссылка:

http://spyder.wordpress.com/2006/05/31/hacking-around-firefox-security-in-order-to-actually-accomplish-something/

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

http://www.iframehtml.com/iframe-security.html

содержит некоторые ресурсы для того, как с ними справиться.

Комментарии:

1. Это даже близко не к тому, в чем проблема. Это находится в том же домене и на той же странице, если на то пошло.

2. Я знаю об ограничениях XSS, но iframe создается на этой странице, как мне контролировать его содержимое? это не должно быть ограничено, потому что это «того же происхождения», верно?

3. Вовсе нет, это междоменная ссылка, и она даже не относится к конкретному iframe. Ваша проблема связана с правильным использованием javascript.

4. Кажется, что первая ссылка говорит о проблеме с пустыми iframe элементами в Firefox, которая звучит так, как будто это повлияет на ваш пример. Вы это проверили?

Ответ №3:

Переписанная последняя строка innerHTML кажется единственной в Chrome.

 <script type="text/javascript">        
    var frame = document.createElement('iframe');        
    frame.id = 'myFrame';        
    document.getElementsByTagName('body')[0].appendChild(frame);        
    var context = frame.contentWindow.document;        
    context.write('testing');    
</script>
  

JS fiddle здесь подтверждает, что он работает в IE, Chrome и Firefox:

http://jsfiddle.net/thebeebs/mDMaj/