«Alert» и «if» изменяют поведение dom-копирования с iframe на div - PullRequest
0 голосов
/ 15 марта 2010

Пытался сделать небольшой скрипт старой школы ajax (iframe-javascript). Немного mootools используется для навигации DOM

Описание

HTML:

1 iframe называется "буфер"

1 div называется "display"

JAVASCRIPT: (коротко: скопировать содержимое iframe в div на странице)

1) onLoad на iframe запускает обработчик (), счетчик гарантирует, что он запускается только один раз (это потому, что в противном случае Firefox перейдет в цикл обратной связи. Я думаю, что это произойдет: iframe on load> handler ()> copyBuffer> change src of iframe, и firefox снова примет это за загрузку)

2) вызывается copybuffer (), он устанавливает src iframe, затем копирует содержимое iframe в div, а затем стирает содержимое iframe

КОД:


count=0;
function handler(){

if (count==0){
copyBuffer();
count++;
}

}

function copyBuffer(){


$('buffer').set('src','http://www.somelink.com/');

if (window.frames['buffer'] && $('display') ) { 

$('display').innerHTML = window.frames['buffer'].document.body.innerHTML;
window.frames['buffer'].document.body.innerHTML="";
}

}

проблемы

ВОПРОС 1) ничего не происходит, содержимое не загружается в div. Но если я либо:

A) удалите счетчик и дайте сценарию запуститься в цикле обратной связи: содержимое внезапно копируется в div, но, конечно, происходит цикл обратной связи, вы можете видеть, что он продолжает загружаться в строке состояния.

OR

B) вставить предупреждение в функцию copyBuffer. Содержимое копируется без обратной связи.

почему это происходит?

ВОПРОС 2) Если обернуто вокруг кода копирования, который я получил от источника в Интернете. Я не уверен, что это делает? Если я удаляю его, код не работает в: Safari и Chrome.

Заранее большое спасибо!


UPDATE:

Как и в ответах на вопросы, я создал обработчик событий. Они использовали jQuery, я сделал один в mootools :

window.addEvent('domready', function() {

    $('buffer').addEvent('load', function(){

        $('display').set('html',window.frames['buffer'].document.body.innerHTML) 
        window.frames['buffer'].document.body.innerHTML="";

    }).set('src','somelink');

});

Бонусный вопрос:

3) Я новичок в stackoverflow (что за удивительное место!), Лучше ли мне создавать новые темы для последующих вопросов?

Ответы [ 2 ]

0 голосов
/ 15 марта 2010

B) вставить предупреждение в copyBuffer функция. Содержание копируется, без обратной связи.

Согласно вашему описанию существует некоторая задержка, необходимая для правильного выполнения вашего кода, и оповещение просто дает необходимую задержку.
Точнее, мне кажется, что промежуток времени между $('buffer').set('src','http://www.somelink.com/'); и $('display').innerHTML = window.frames['buffer'].document.body.innerHTML; не достаточен для полной загрузки буфера.

Вам следует подумать о том, как обработать соответствующее событие, чтобы быть уверенным, что все уже загружено до запуска вашего кода.

Например, вы можете переписать свой код следующим образом:

function handler(){    
    $('buffer').load( function(){
        if (count==0){
            copyBuffer();
            count++;
        }
    }).attr('src','http://www.somelink.com/');    
}

function copyBuffer(){

    //$('buffer').set('src','http://www.somelink.com/');

    if (window.frames['buffer'] && $('display') ){    
        $('display').innerHTML = window.frames['buffer'].document.body.innerHTML;
        window.frames['buffer'].document.body.innerHTML="";
    }    
}
0 голосов
/ 15 марта 2010

iframe не загрузил страницу при попытке доступа к ней, поэтому он не может получить содержимое ..

Я полагаю, что следующее сработает, добавив обработчик загрузки в iframe и сделав копию внутри него ..

function handler(){
   $('buffer').load( function(){copyBuffer();} ).attr('src','http://www.somelink.com/');
}

function copyBuffer(){
   if (window.frames['buffer'] && $('display') ) 
    { 
       $('display').innerHTML = window.frames['buffer'].document.body.innerHTML;
       window.frames['buffer'].document.body.innerHTML="";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...