Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   onload на iframe срабатывает дважды (https://javascript.ru/forum/events/4520-onload-na-iframe-srabatyvaet-dvazhdy.html)

hogart 30.07.2009 14:00

onload на iframe срабатывает дважды
 
Стоит задача — менять баннеры по AJAX-переходу (таргетируем баннеры по разным разделам на сайте).
C сервера дергаем вот такую ручку, передавая ей кодовое имя баннера (верхний/боковой) и URL.
function reloadBanner(which, url)
    {
        var div = document.createElement('div');

        div.style.position = 'absolute';
        div.style.top = '-10000px';
        div = document.body.appendChild(div);
        
        div.innerHTML = banners[which].template;
        var iframe = div.firstChild; 
        iframe.ondblclick = function() {return which};
        
        function frmLoad (evt) {
            var which = this.ondblclick()
            var olddiv = $(banners[which].selector)[0];

            olddiv.replaceChild(this, olddiv.firstChild)
        }

        iframe.addEventListener('load', frmLoad, false)
        iframe.src = url;
    }


Функция frmLoad вызывается дважды.
Помогите, что делать, кто виноват?

Сразу скажу: пробовал делать return false и iframe.addEventListener('load', frmLoad, true). eventPhase в обоих случаях одинаковый.

По поводу кроссбраузерности будем думать потом:)

palermo 09.12.2009 14:31

и чем закончилось?

subzey 09.12.2009 16:20

Внутри frmLoad алертните-ка evt.srcElement, все должно встать на свои места.

Gvozd 09.12.2009 18:09

Цитата:

Сообщение от hogart
Функция frmLoad вызывается дважды.

зря. это не единственная браузеро-зависимая проблема которая встанет сейчас перед вами
данная проблема наблюдается только в опере
суть в том, что при динамическом создании iframe-а в опере onload возникает сперва на загрузку пустого доркумента(url=about:blank), а потом столько на загрузку указанного
/*
 * вот сам недавно написал, кроссбразуерный вариант(это только кусок лругого кода, поэтому переменные вынесены в глобальную область)
*/
var handler=function()
	{
	if(iframe_obj.contentWindow.location.href!='about:blank')
		{
		var elem=document.getElementById(elemId);
		elem.innerHTML=iframe_obj.contentWindow.document.body.innerHTML;
		iframe_obj.parentNode.parentNode.removeChild(iframe_obj.parentNode);
		}
	}
var iframe_obj=div_elem.getElementsByTagName('iframe')[0];
if (iframe_obj.addEventListener)
	iframe_obj.addEventListener('load', handler, false);
else if (iframe_obj.attachEvent)
	iframe_obj.attachEvent('onload', handler);
else
	iframe_obj.onload=handler;


Часовой пояс GMT +3, время: 08:59.