Почему отдельно определенная функция не работает с событием «domready» в JavaScript? - PullRequest
0 голосов
/ 20 мая 2011

Я совершенно новичок в 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())

почему это так?

Ответы [ 3 ]

5 голосов
/ 20 мая 2011

Это потому, что вам нужно убрать скобки;функция - это объект, и вам нужно передать функцию, а не ее возвращаемое значение.Итак, для вашего первого примера вы должны иметь:

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

Вместо этого.Для вашего второго примера это:

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

Опять вы передаете объект giveMessage, а не результат, полученный после его вызова.

1 голос
/ 20 мая 2011

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');});

FWIW window.addEvent не полностью кросс-браузерно совместим, см. Также window.attachEvent

1 голос
/ 20 мая 2011

Вы забыли положить свой matchHeight звонок на закрытие. Измените свою последнюю строку на:

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