Prototype框架中的Javascript事件层次结构

时间:2009-03-30 13:44:25

标签: javascript internet-explorer events event-handling prototypejs

是否有使用Prototype javascript框架在 dom:loaded load 之间处理的事件?
我使用原型实现了一个预加载器,看起来像这样:

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

然后我有一个另一个处理程序用于列高度fixatioan:

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因为它仍然显示为无。

除了加载&之外还有其他事件吗? dom:loaded 要处理并让我离开这个!?

2 个答案:

答案 0 :(得分:0)

你可以在完成preload()之后调用第二个函数吗?

或者,如果您不想在preload()之后直接调用它,那么您可以执行类似设置标志的操作,然后在section函数中设置超时以等待第一个执行完毕。

如果订单很重要,您需要在各个功能之间进行沟通。

答案 1 :(得分:0)

没有这样的事件AFAIK,甚至 dom:loaded 事件都是由Prototype开发人员实现的,而且这不是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一样,然后使用此方法和您说的方法。