Странное поведение Firefox при работе с JavaScript на iframe - PullRequest
2 голосов
/ 15 июля 2010

Я встретил странное поведение в Firefox с помощью этого простого скрипта:

    <html>
      <head>
        <script type="text/javascript">
            window.setTimeout(function(){
                var ifr=document.createElement("iframe");
                ifr.src="about:blank";
                document.body.appendChild(ifr);
                var doc=ifr.contentDocument || ifr.contentWindow.document,
                    div=doc.createElement("div");
                div.innerHTML="test";
                window.setTimeout(function(){
                    doc.body.appendChild(div);
                },500);
            },500);
        </script>
    </head>
  </html>

Этот фрагмент кода создает пустой iframe и добавляет его в тело текущей страницы, затем создает элемент div, содержащий простой текст, и добавляет его в тело iframe.

В каждом браузере (IE, Safari, Chrome, Opera) это работает, но в Firefox (я использую версию 3.6.3) div не появляется внутри iframe и не выдает никакой ошибки.

Я думаю, что где-то должна быть какая-то глупая ошибка, но я не могу ее найти, у вас есть идея?

PS: эти window.setTimeout - это простой способ убедиться, что dom загружен на странице и в iframe.

Ответы [ 2 ]

4 голосов
/ 15 июля 2010

Вам нужно обернуть поиск документа iframe в тайм-аут.

        window.setTimeout(function(){
            var doc=ifr.contentWindow.document || ifr.contentDocument;
            var div=doc.createElement("div");
            div.innerHTML="test";
            doc.body.appendChild(div);
        },500);

См. http://jsfiddle.net/xeGSe/1/

2 голосов
/ 15 июля 2010

Похоже, проблема с синхронизацией, что ваши setTimeout звонки не ловят.Вам лучше использовать onload события, чтобы гарантировать, что элементы действительно доступны (DOMReady будет лучше, но не так просто в IE).Попробуйте это:

document.body.onload = function() {
    var iframe = document.createElement("iframe");
    iframe.src = "about:blank";
    iframe.onload = function() {
        var doc = iframe.contentDocument || iframe.contentWindow.document,
            div = doc.createElement("div");
        div.innerHTML="test";
        doc.body.appendChild(div);
    }
    document.body.appendChild(iframe);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...