Невозможно установить document.body.innerHTML IFrame в Firefox - PullRequest
6 голосов
/ 20 октября 2011

Я искал кросс-браузерный способ программной установки innerHTML IFrame.(Как и в http://roneiv.wordpress.com/2008/01/18/get-the-content-of-an-iframe-in-javascript-crossbrowser-solution-for-both-ie-and-firefox/)., я написал некоторый пример кода (ниже), и я могу заставить его работать в Safari и Chrome, но не в Firefox. Может кто-нибудь помочь мне понять, что мне нужно сделать вместо этого (впортативный способ)?

<html>
<body>

<div name=FRAME2div id=FRAME2div style="position:absolute; background-color:blue; color:black; border-color:black;border-width:0; left:100px; top:40px; width:200px; height:200px; overflow:scroll; display:block; " >
</div>

<script type="text/javascript">
document.getElementById("FRAME2div").innerHTML = '<iframe border=0 id=IFRAME2 name=IFRAME2 ></iframe>';
document.getElementById("IFRAME2").contentWindow.document.body.innerHTML = '<html><body><p>NETSCAPE</p></body></html>';
</script>

</body>
</html>

Ответы [ 3 ]

13 голосов
/ 20 октября 2011

Вы устанавливаете innerHTML, пока в фрейме есть загрузка about:blank в полете.Когда это завершит загрузку, он заменит документ, который вы изменили.

Если вы сделаете свою модификацию вне загрузки iframe, она будет работать во всех браузерах.

9 голосов
/ 20 октября 2011

В Firefox содержимое фрейма, похоже, не распознается, если не было задано начальное содержимое.Самый простой способ решения этой проблемы показан в приведенном ниже коде:

//Note: ID is not necessary for this example
document.getElementById("FRAME2div").innerHTML = '<iframe id=IFRAME2 name=IFRAME2 ></iframe>';
var doc = frames["IFRAME2"].document;

//Trigger a page "load".
doc.open();
doc.close();
//Set innerHTML of the body tag.
doc.body.innerHTML = '<p>NETSCAPE</p>';

Другой метод состоит в установке для свойства src значения javascript:"&nbsp;" и регистрации обработчика событий одноразовой загрузки.Этот метод немного сложнее, поэтому я не буду описывать его более подробно.

Доступ к объекту окна каждого кадра можно получить через объект frame по имени.

Итак, я рекомендую использовать следующий код:

frames['IFRAME2'].document.documentElement.innerHTML = "<body>...</body>";

document.documentElement относится ккорневой элемент документа, обычно <html>.Возможно, свойство body для document еще не готово, когда вы вызываете текущий код.Обращаясь к корневому элементу, эту проблему можно обойти.

2 голосов
/ 16 декабря 2011

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

<html> 
<head>
<script type="text/javascript"> 
var Fill_Iframe=function(){document.getElementById("IFRAME2").contentWindow.document.body.innerHTML = '<p>testo</p>';}; 
</script>
</head>

<body onload="Fill_Iframe()"> 

<iframe name="IFRAME2" id="IFRAME2" > 
</iframe> 

</body> 
</html>
...