2012-03-28 13 views
7

Sto cercando di ottenere la larghezza di un contenitore div per impostare un altro attributo css in un altro div alla larghezza del primo, che so dopo che la pagina è stata completamente caricato e reso.jQuery: ottieni div-width dopo che il documento è pronto e reso

ho questo codice:

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

Il problema è che il pronto viene chiamato prima la pagina viene visualizzata e quindi attributo width non è impostato (o "indefinito"). Come posso determinare la larghezza attuale?

EDIT: Dopo modifiche suggerite Ho questa fiddle ma il codice non ci sta lavorando, ma nella mia applicazione reale non lo è. Quindi il problema è da qualche altra parte, immagino :(

+0

hai dimenticato la parola chiave 'document'. 'Quello è $ (documento) .ready (funzione ...)' –

+2

@aschuler. Controlla l'API. hai torto. anche se è deprecato. – gdoron

+0

Potresti fornire una fonte? Se leggo http://api.jquery.com/ready/, vedo '$(). Ready (handler) (questo non è raccomandato)' –

risposta

12

Usa load aspettare per tutte le immagini/contenuto esterno per caricare così, in quanto potrebbero alterare le dimensioni dell'elemento:

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

Quindi per ottenere la larghezza calcolata, utilizzare width:

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

l'uso del carico può causare problemi di rendering visibili potrebbe voler utilizzare una combinazione di entrambi a seconda di cosa sta facendo –

+0

grazie, avere un violino funzionante ora (vedi EDIT in post) ma il mio vero codice non lo è ancora. – lzdt

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


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

Non voglio sapere la larghezza dell'attributo css, poiché non è impostata e la larghezza è dinamica. Voglio conoscere le dimensioni effettive del rendering nella finestra del browser. – lzdt

+1

di quanto si desideri usare .css ("width") o outerWidth() o innerWidth() potrebbe anche essere necessario attendere l'attivazione degli eventi di caricamento. Alla fine della giornata non abbiamo molte informazioni da seguire, potresti voler pubblicare un codice pertinente in un violino JS per mostrarci e possiamo spiegare meglio come risolvere il tuo problema. –

+0

Ho aggiunto il violino funzionante nella mia domanda originale. Come posso "aspettare" fino a quando viene caricato un evento? (scusa se è una domanda stupida, sono nuovo per questo). – lzdt

0

Usa:

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

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

Questo non vi aiuterà se la larghezza è controllata da un'immagine, come le immagini non possono essere resi quando il documento è pronto. Se questo non funziona, abbiamo bisogno di più contesto.

+1

Penso che usare .css ('width') sia una scelta migliore pure –

+1

Qual è il problema risolto? Non vedo alcuna differenza. – gdoron

+0

Non c'è differenza per quanto ho capito tra $(). SomeFunction (...) e $ (document) .someFunction (...). Entrambe le varianti verranno chiamate nel mio codice ma la mia larghezza è ancora "indefinita". – lzdt

2

un div avrà nessun attributo di width. si può avere una proprietà di stile CSS di width, che è possibile recuperare utilizzando .css('width'), ma si potrebbe anche essere inte riposato in outerWidth() o innerWidth() o width() che restituiscono la larghezza calcolata da JavaScript.

Una buona spiegazione di come i suddetti metodi differiscono width possono essere letti nella documentazione, ma semplicemente;

  1. outerWidth() tiene conto padding + margine
  2. width() tiene imbottitura conto
  3. innerWidth() tiene né in considerazione.
+1

Può essere necessario aggiornare $() -> $ (documento) –

1

Aveva un problema simile (offsetWidth era 0 perché l'elemento non era ancora stato reso). Ho fatto un semplice:

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

E sembra funzionare perfettamente sul mio caso. Questo in sostanza chiede di essere richiamato ogni volta che il callstack attuale di javascript è vuoto.

Immagino che se si crea un elemento DOM in javascript e la sua larghezza è definita in CSS esterno di essere "100%", il offsetWidth (e offsetHeight) di questo oggetto non verrà calcolato prima di tutto Javascript deve correre finito .

Utilizzando setTimeout(callback, 0), sembra essere chiamato dopo che il browser ha terminato la chiamata in javascript corrente E ha avuto il tempo di applicare tutti i CSS ai nuovi elementi DOM.

Problemi correlati