IFrames异步加载?如果不是为什么会出现此错误?

时间:2011-09-25 08:17:42

标签: javascript jquery html iframe

编辑:从测试开始,iframe会异步加载(尽管不完全确定)。我通过在700毫秒&之后调用该函数来修复它。这样可行。所以它让我觉得它们是同步的。我这样做:

insertHTMLIntoIFrame( HTML ); //$("#updaterIframe").contentWindow.location.reload(true); 
setTimeout("convertToUpdatable()", 700);  

结束修改

我的网页上的iframe发生了一些奇怪的事情。我的函数在我的iframe中搜索所有带有“可更新”类的HTML元素。将这些元素转换为textareas。

我的问题:如果我在将一些HTML插入iframe之后立即调用该函数,那么该函数找不到任何可更新元素(当它们在iframe中时)< / p>

BUT

如果我通过显示alert()来延迟函数执行;在搜索iframe的可更新元素之前,我确实找到了&amp;转换iframe中的所有元素。

这让我觉得iframe加载异常,这是正确的吗?如果不是出了什么问题?有没有办法刷新iframe或确保在整个iframe加载之前我不调用我的函数?

// I call the functions in the following order:
insertHTMLIntoIFrame( "blah");
convertToUpdatable();

function convertToUpdatable()
{
    // Post: Convert all HTML elements (with the class 'updatable') to textarea HTML elements
    //       and store their HTML element type in the class attribute
    // EG:   Before: <p class="updatable Paragraph1"/> Hello this is some text 1 </p>
    //       After : <p class='updatableElementTitle'>Paragraph1</p><textarea class="updatable Paragraph1 p"/> Hello this is some text 1 </textarea>

    if (STATE != 1 ) { return; }

    // if I dont have this line then I cant find any updatable elements in the iframe
    alert("Displaying website with updatable regions");

    $("#updaterIframe").contents().find(".updatable").each(function()
        {
            var className = this.className;
            var nodeName  = this.nodeName;
            var title     = getTitleName( this );
            $(this).replaceWith("<p class='updatableElementTitle'>"+title+"</p><textarea class='"+ className + " " + nodeName +"'>"+$(this).html() +"</textarea>");
        });

     STATE = 0; 
}

    function insertHTMLIntoIFrame( htmlSrc )
{
    try
    {
        var ifrm = document.getElementById("updaterIframe");
        ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
        ifrm.document.open();
        ifrm.document.write( htmlSrc );
        ifrm.document.close();
    }
    catch (ex) { alert("In insertHTMLIntoIFrame(): "+ex); }
}

1 个答案:

答案 0 :(得分:2)

是iframe加载,实际上浏览器中的任何加载都是异步的。考虑大多数甚至闻起来像js中的事件的东西都是异步的,你的生活会变得更容易。

忘记setTimeouts,改为绑定事件,在这种情况下是iframe对象上的load事件。