Иерархия событий Javascript в платформе прототипа - PullRequest
1 голос
/ 30 марта 2009

есть ли какое-либо событие, которое должно быть обработано между dom: загружен и загружен с использованием инфраструктуры прототипа 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 не добавляет второй обработчик в список обработчиков загрузки, поэтому, когда первый пытается получить высоту любого из столбцов, он возвращает 0, потому что он все равно отображается как none.

Есть ли какое-либо другое событие, кроме load & dom: загружен для обработки и вытащить меня из этого!?

Ответы [ 2 ]

0 голосов
/ 30 марта 2009

Нет такого события AFAIK, и даже событие dom: загружено реализовано разработчиками прототипа, и это не событие по умолчанию в 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, а затем использовать этот метод и ваш упомянутый в противном случае.

0 голосов
/ 30 марта 2009

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

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

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

...