0

我对 JavaScript 很陌生。我正在尝试为某些元素设置相等的高度。除了将函数移到“addEvent”声明之外,我设法做了所有事情。

换句话说,这段代码有效:

window.addEvent('domready', function() {  
    var elements = $$( 'div#leftcolumn div.module_menu' );  
    if( elements && elements.length > 1 ) {  
        var heights = [];  
        elements.each( function( el ) {  
            heights.push( el.getStyle('height').toInt() );  
        });
        maxHeight = Math.max.apply( Math, heights ) + "px";
        elements.each( function( el ) {
            el.setStyle('height', maxHeight );
        });
        delete(heights);  
    }
}
);

虽然此代码不起作用:

function matchHeight( selector ) { 
var elements = $$( selector );  
if( elements && elements.length > 1 ) {  
    var heights = [];  
    elements.each( function( el ) {  
        heights.push( el.getStyle('height').toInt() );  
    });
    maxHeight = Math.max.apply( Math, heights ) + "px";
    elements.each( function( el ) {
        el.setStyle('height', maxHeight );
    });
    delete(heights);  
  }
}
window.addEvent( 'domready', matchHeight( 'div#leftcolumn div.module_menu' ) );

我已经用更简单的功能进行了测试,它可以工作,例如:

window.addEvent('domready', function() { alert('test'); } )

相当于

function giveMessage() { alert('test'); }
window.addEvent( 'domready', giveMessage())

这是为什么?

4

3 回答 3

5

这是因为您需要删除括号;函数是一个对象,你需要传递函数,而不是它的返回值。所以,对于你的第一个例子,你应该有:

window.addEvent('domready', function() { matchHeight('div#leftcolumn div.module_menu'); } );

反而。对于您的第二个示例,它是:

function giveMessage() { alert('test'); }
window.addEvent( 'domready', giveMessage)

同样,您传递 object giveMessage,而不是调用它后获得的结果。

于 2011-05-20T19:42:06.807 回答
1

你忘了把你的matchHeight电话放在一个闭包中。将最后一行更改为:

window.addEvent( 'domready', function(){matchHeight( 'div#leftcolumn div.module_menu' )} );
于 2011-05-20T19:41:47.813 回答
1

K 以便该链接正在寻找指向该函数的指针。当您向它传递一个匿名函数(如#1)时,该函数被创建/存储在内存中,并且该位置被传入。但您的第二种情况,JS 执行该函数(因为您的括号+参数)然后通过结果作为指针......这不是你想要的。

你需要做的是:

function setup() {
  matchHeight( 'div#leftcolumn div.module_menu');
}
window.addEvent('domready',setup);

或者仍然使用匿名函数:

window.addEvent('domready',
  function() {matchHeight( 'div#leftcolumn div.module_menu');});

FWIWwindow.addEvent并非完全跨浏览器兼容,另请参阅window.attachEvent

于 2011-05-20T19:42:45.300 回答