IFrames загружаются асинхронно? Если нет, то почему возникает эта ошибка? - PullRequest
1 голос
/ 25 сентября 2011

РЕДАКТИРОВАТЬ: Из тестов выясняется, что кадры загружаются асинхронно (хотя и не полностью уверены). Я исправил это, вызвав функцию после периода 700 миллисекунд, и это работает. Так что это заставляет меня думать, что они асинхронные. Я делаю это:

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

Конец редактирования

У меня есть что-то странное с моим iframe на моей веб-странице. Моя функция ищет в моем iframe все элементы HTML с классом «обновляемый» и преобразует эти элементы в текстовые области.

Моя проблема: Если я вызываю функцию сразу после вставки некоторого HTML-кода в iframe, то функция не находит ни одного из обновляемых элементов (если они есть в iframe)

НО

Если я задержу выполнение функции, показывая предупреждение (); прежде чем искать в iframe обновляемые элементы, я нахожу и преобразую все элементы в iframe.

Это заставляет меня думать, что iframes загружаются асинхронно, это правильно? Если нет, что идет не так? Есть ли способ обновить 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 Ответ

2 голосов
/ 25 сентября 2011

Да, загрузка iframe, и фактически все, что загружается в ваш браузер, является асинхронным. Считайте, что все, что даже пахнет как событие в js, асинхронно, и ваша жизнь станет намного проще.

Забудьте о setTimeouts, вместо этого привязайте к событиям, в этом случае событие load в объекте iframe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...