2012-02-21 16 views
5

Tengo un código incluido en $(document).ready(function(){ /*code*/ });, y todo funciona bien, excepto una línea. El código de arriba funciona bien, el código debajo funciona bien, no recibo ningún error en mi consola.

$('.main-right.category').height($('.footer').height() + $('.main-right.category').height()); 

Eso no dispara. Sin embargo, si pego eso exactamente en la consola de desarrollador y presiono enter después de que la página se cargó, funciona. Todos los elementos existen en la carga de la página (es decir, ninguno está creado dinámicamente a través de javascript). Mismo resultado en cromo, firefox, IE.

¿Alguna idea?

editar: Debo añadir que mi css está cargado antes de mi javascript, y he hecho otros ajustes relacionados con CSS en este mismo archivo de javascript que han funcionado bien.

Además, si console.log $ ('. Main-right.category'). Height() y $ ('. Footer'). Height() justo encima de esa línea de código, ambos dan no- valores enteros cero como yo esperaría.

+0

¿No hay ningún error en la consola? ¿Puedes publicar un enlace a la página? –

+1

Sin el resto del código, lo único que se me ocurre es que el elemento DOM al que se dirige no se ha cargado en el DOM en el momento en que se ejecuta esta instrucción. Cuando llegas a la consola, por supuesto, está allí y esta afirmación funciona. –

+0

Publicar un jsFiddle? – j08691

Respuesta

5

Se desencadena el evento listos cuando el DOM está listo para trabajar. Difiere del evento de carga que se activa cuando todos los activos (css, javascript, imágenes, ...) están cargados.

Supongo que cuando se ejecuta el código, los elementos que intenta obtener la altura ya tienen una altura calculada, por lo que parece que no pasa nada.

Cuando ejecutó su código en la consola, todo está cargado, por lo que el comportamiento es el esperado.

Para enlazar al evento de carga, verifique el método .load().

+0

El enlace no es el correcto, debería ser http://api.jquery.com/load-event/ –

+0

$ (ventana) .load funcionó, pero no entiendo por qué. Si console.log $ ('. Main-right.category'). Height() y $ ('. Footer'). Height() justo encima de la línea de código que no funcionó dentro de $ (document) .ready(), ambos dan valores enteros distintos de cero como esperaba y los mismos valores que obtengo ejecutando la misma línea de código a través de la consola de desarrollador. – LOLapalooza

0

lo general establecer la altura con:

var height = $('.footer').height() + $('.main-right.category').height(); 
$('.main-right.category').css('height',height+'px'); 
+0

Intenté eso también, no funcionó. Extraño, porque si console.log $ ('. Main-right.category'). Height() y $ ('. Footer'). Height() justo encima de esas líneas de código, ambos dan valores enteros distintos de cero como lo esperaría – LOLapalooza

+0

@RickM Esto se debe a que cuando utiliza la consola para inyectar código, la página ha terminado de cargarse pero no ha terminado de cargarse cuando se desencadena el evento 'document.ready'. Cuando se desencadena el evento 'window.load', se han cargado todos los elementos del documento. – Jasper

+0

@Jasper Ya veo, gracias por la información. Pensé que al colocar console.log (var) en el archivo javascript, se registraría cualquier var que estuviera en el momento de la ejecución. – LOLapalooza

3

$ (documento). Se dispara cuando la estructura DOM está disponible por completo, en este momento la representación usualmente no está terminada, por lo que las dimensiones de los elementos pueden ser desconocidas y height() devolverá valores incorrectos.

Use $(window).load() en su lugar.

0

Debe usar console para depurar los selectores y ver las alturas de los elementos;

$(document).ready(function() { 

    var $footer = $('.footer'); 
    var $category = ('.main-right.category'); 

    console.log($category, $footer); 
    console.log($category.height(), $footer.height()); 
    console.log('New height =', ($category.height() + $footer.height())); 

}); 
Cuestiones relacionadas