Иерархия событий Javascript в структуре прототипов

есть ли какое-либо событие, которое должно обрабатываться между dom: loaded и load с использованием инфраструктуры Prototype javascript?
Я реализовал предварительный загрузчик, используя прототип, который выглядит следующим образом:

Event.observe(window,"load",preload);
function preload(){
    if($('wrapper'))
        $('wrapper').setStyle({"display":"block"});
    if($('loading'))
        setTimeout('$("loading").fade({duration: 5.0});',4000);
}

то у меня есть другой обработчик, использующий для фиксации высоты столбца:

Event.observe(window,"load",function(){ 
    var bottomExtraOffset = (Prototype.Browser.IE) ? 100 : 130;
    if(parseInt($$('.col1')[0].getStyle('height')) > parseInt($$('.col2')[0].getStyle('height')))
        $('wrapper').setStyle({'height' : parseInt($$('.col1')[0].getStyle('height'))+bottomExtraOffset+'px'}); 
    else
        $('wrapper').setStyle({'height' : parseInt($$('.col2')[0].getStyle('height'))+bottomExtraOffset+'px'});
});//observe    

Он отлично работает в любом браузере, кроме IE! Кажется, что IE не добавляет второй обработчик в список обработчиков onload, поэтому, когда первый пытается получить высоту любого из столбцов, он возвращает 0, потому что он все еще отображается как none.

есть ли другое событие, кроме load и dom: loaded, которое нужно обработать и вытащить меня отсюда !?


person Community    schedule 30.03.2009    source источник


Ответы (2)


Нет такого события AFAIK, и даже событие dom: loaded реализовано разработчиками прототипов, а это не событие по умолчанию в JS. Возможно, вы захотите использовать помощник, чтобы задержать выполнение второго обработчика, поэтому первый будет выполнен первым:

function foo(){ 
    var bottomExtraOffset = (Prototype.Browser.IE) ? 100 : 130;
    if (parseInt($$('.col1')[0].getStyle('height')) > parseInt($$('.col2')[0].getStyle('height'))) {
        $('wrapper').setStyle({'height' : parseInt($$('.col1')[0].getStyle('height')) + bottomExtraOffset + 'px'}); 
    }
    else {
        $('wrapper').setStyle({'height' : parseInt($$('.col2')[0].getStyle('height')) + bottomExtraOffset + 'px'});
    }
}

function bar() {
  // One msec delay.
  setTimeout(foo, 1);
}

Event.observe(window, "load", bar); // or window.observe("load",bar);

Кроме того, вы можете проверить, является ли пользовательский агент чем-то вроде IE, а затем использовать этот метод, а в противном случае - тот, который вы сказали.

person sepehr    schedule 30.03.2009
comment
Вау! Большое спасибо, это работает как шарм ^ о ^ вы знаете, вы только что ответили на мой предыдущий вопрос, который мы обсуждали ранее, без такого решения, требуется 3 дня, чтобы найти проблему, в любом случае спасибо. - person ; 30.03.2009

Можете ли вы просто вызвать вторую функцию после завершения preload ()?

Или, если вы не хотите напрямую вызывать его после preload (), вы можете сделать что-то вроде установки флага, а затем установить тайм-аут в функции раздела, чтобы дождаться, пока не будет выполнено первое выполнение.

Если порядок важен, вам необходимо общаться между функциями.

person Ryan Watkins    schedule 30.03.2009
comment
Я не могу напрямую вызвать вторую после первой из-за всего алгоритма скрипта. Я работаю над твоим предложением, спасибо Райан. - person ; 30.03.2009