2012-03-28 17 views
7

Estoy tratando de obtener el ancho de un contenedor div para establecer otro atributo css en otro div al ancho del primero, que sé después de que la página fue completamente cargado y renderizado.jQuery: obtener div-width después de que el documento esté listo y renderizado

tengo este código:

$().ready(function() { 
    doLayout(); 
} 
function doLayout() { 
    var $width = $("#sidebar").attr("width"); 
    $("#content").css("left", width); 
} 

El problema es que la lista se llama antes de que la página se representa y por lo tanto no se establece el atributo de anchura (o "indefinido"). ¿Cómo puedo determinar el ancho actual?

EDIT: Después de los cambios sugeridos que tienen este fiddle pero el código no está trabajando, pero en mi aplicación real no lo es. Así que el problema está en otra parte, supongo :(

+0

has olvidado la palabra clave 'document'. 'Eso es $ (documento) .Ready (función ...)' –

+2

@aschuler. Verifica la API. te equivocas. aunque está en desuso – gdoron

+0

¿Podría proporcionar una fuente? Si leo http://api.jquery.com/ready/ Veo '$(). Ready (controlador) (esto no se recomienda)' –

Respuesta

12

Uso load que esperar a que todas las imágenes/contenido externo para cargar así, ya que podrían alterar las dimensiones de los elementos:

$(window).load(function() { 
    doLayout(); 
}); 

luego a que la anchura calculada, utilice width:

$("#content").width(); // width in px 
+1

el uso de la carga puede causar problemas visibles de representación, puede que desee utilizar una combinación de ambos dependiendo de lo que esté haciendo –

+0

gracias, tenga un violín activo ahora (vea EDITAR en publicación) pero mi código real todavía no es. – lzdt

1
$(document).ready(function() { 
    doLayout(); 
} 


function doLayout() { 
     var width = $("#sidebar").css("width"); 
     $("#content").css("left", width); 
    } 
+0

No quiero saber el ancho del atributo css, ya que no está configurado y el ancho es dinámico. Quiero saber el tamaño real prestado en la ventana del navegador. – lzdt

+1

de lo que desea utilizar .css ("ancho") o outerWidth() o innerWidth() también puede necesitar esperar hasta que se active el evento de carga. Al final del día no tenemos mucha información para continuar, puede publicar un código relevante en un violín de JS para mostrarnos y podemos explicarle mejor cómo resolver su problema. –

+0

He agregado violín funcional en mi pregunta original. ¿Cómo puedo "esperar" hasta que se active el evento de carga? (lo siento si es una pregunta estúpida, soy nuevo en esto). – lzdt

0

Uso:

$(document).ready(function() { 
    doLayout(); 
} 

function doLayout() { 
    var width = $("#sidebar").css("width"); 
    $("#content").css("left", width); 
} 

Esto no le ayudará si el ancho es controlado por una imagen, ya que las imágenes no se pueden representar cuando el documento está listo. Si esto no funciona, necesitamos más contexto.

+1

Creo que usar .css ('ancho') sería una mejor opción también –

+1

¿Cuál es el problema que ha solucionado? No veo ninguna diferencia. – gdoron

+0

No hay diferencia en cuanto a entiendo que entre $(). SomeFunction (...) y $ (document) .someFunction (...). Ambas variantes recibirán una llamada en mi código pero mi ancho aún está "indefinido". – lzdt

2

un div tendrá ningún atributo de width. puede tener una propiedad de estilo CSS de width, que se puede recuperar usando .css('width'), pero también puede ser inte descansa en outerWidth() o innerWidth() o width() que devuelve el ancho calculado por JavaScript.

Una buena explicación de cómo los mencionados anteriormente width métodos difieren se puede leer en la documentación, sino simplemente;

  1. outerWidth() tiene en cuenta el relleno + margen
  2. width() toma en cuenta el relleno
  3. innerWidth() toma ni en cuenta.
+1

Puede ser necesario actualizar $() -> $ (documento) –

1

Tenía un problema similar (offsetWidth era 0 porque el elemento aún no se había procesado). Hice un simple:

setTimeout(function() { 
... do stuff that needed final width of object ... 
}, 0) 

Y parece funcionar sin problemas en mi caso. Básicamente, esto pide que se le devuelva la llamada cuando javascript current callstack esté vacío.

supongo que si crea un elemento DOM en javascript y su anchura se define en CSS externo a ser "100%", el offsetWidth (y offsetHeight) de este objeto no quede calculada antes de que todo Javascript en marcha terminado .

Al usar setTimeout(callback, 0), parece que se invoca después de que el navegador finaliza la llamada actual de JavaScript Y se toma el tiempo de aplicar todo el CSS a los nuevos elementos DOM.

Cuestiones relacionadas