【问题标题】:Javascript Event Hierarchy in Prototype frameworkPrototype 框架中的 Javascript 事件层次结构
【发布时间】:2011-12-28 21:13:28
【问题描述】:

dom:loadedload 之间是否有任何事件需要使用 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 因为它仍然显示为无。

除了 loaddom:loaded 之外,还有其他事件需要处理并让我摆脱这个!?

【问题讨论】:

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


    【解决方案1】:

    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 一样地狱,然后使用此方法,否则使用您所说的方法。

    【讨论】:

    • 哇!非常感谢,它就像一个魅力 ^o^ 你知道,你刚刚回答了我之前讨论过的问题,没有这样的解决方案,花了 3 天时间才找到问题,无论如何,谢谢。
    【解决方案2】:

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

    或者如果你不想在 preload() 之后直接调用它,那么你可以做一些事情,比如设置一个标志,然后在 section 函数中设置一个超时,等待第一个完成执行。

    如果顺序很重要,您需要在函数之间进行通信。

    【讨论】:

    • 由于整个脚本算法,我无法在第一个之后直接调用第二个。我正在根据你的建议工作,谢谢 Ryan。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2016-03-29
    • 2021-12-11
    • 2010-10-19
    相关资源
    最近更新 更多