2012-03-28 19 views
7

Próbuję uzyskać szerokość kontenera div, aby ustawić inny atrybut css w innym dziale na szerokość pierwszego, który znam po stronie w pełni załadowany i renderowany.jQuery: get div-width, gdy dokument jest gotowy i renderowany

mam ten kod:

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

Problem polega na tym, gotowy jest wywoływana przed strona jest renderowane, a tym samym szerokość atrybut nie jest ustawiony (lub „nieokreślone”). Jak mogę określić aktualną szerokość?

EDIT: Po proponowanych zmianach mam ten fiddle ale kod nie działa, ale w moim rzeczywistej aplikacji nie jest. Więc problem jest gdzieś indziej, myślę :(

+0

zapomniałeś słowa kluczowego "document". 'To jest $ (dokument) .ready (funkcja ...)' –

+2

@aschuler. Sprawdź interfejs API. jesteś w błędzie. choć jest przestarzałe. – gdoron

+0

Czy możesz podać źródło? Jeśli czytam http://api.jquery.com/ready/ widzę '$(). Ready (handler) (nie jest to zalecane)' –

Odpowiedz

12

Zastosowanie load czekać na wszystkich obrazów/treść zewnętrznych załadować jak dobrze, że mogą one zmieniać wymiary elementu:

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

Następnie, aby uzyskać obliczoną szerokość, użyj width:

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

użycie obciążenia może spowodować widoczne problemy z renderowaniem może chcieć użyć kombinacji obydwu w zależności od tego, co to robi –

+0

dziękuję, teraz masz działające skrzypce (zobacz EDYCJA w post), ale mój prawdziwy kod nadal nie jest. – lzdt

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


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

Nie chcę znać szerokości atrybutu css, ponieważ nie jest ona ustawiona, a szerokość hte jest dynamiczna. Chcę poznać rzeczywisty renderowany rozmiar w oknie przeglądarki. – lzdt

+1

, niż chcesz użyć .css ("width") lub outerWidth() lub innerWidth(), możesz również potrzebować czekać aż się uruchomi zdarzenie load. Pod koniec dnia nie mamy zbyt wielu informacji, możesz opublikować odpowiedni kod w skrzypce JS, aby nam pokazać, a my możemy lepiej wyjaśnić, jak rozwiązać twój problem. –

+0

Dodałem działające skrzypce w moim oryginalnym pytaniu. Jak mogę "zaczekać" do momentu uruchomienia zdarzenia ładowania? (Przepraszam, jeśli to głupie pytanie, jestem nowy w tym). – lzdt

0

Zastosowanie:

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

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

to nie pomoże, jeśli szerokość jest kontrolowana przez obraz, jak obrazy nie mogą być renderowane, gdy dokument jest gotowy. Jeśli to nie pomoże, musimy więcej kontekstu.

+1

Myślę, że używanie .css ("szerokość") byłoby lepszym wyborem również –

+1

Jaki problem rozwiązałeś? Nie widzę żadnej różnicy. – gdoron

+0

Nie ma różnicy, o ile rozumiem, między $(). SomeFunction (...) a $ (document) .someFunction (...). Oba warianty zostaną wywołane w moim kodzie, ale moja szerokość jest nadal "nieokreślona". – lzdt

2

div nie będą miały atrybut width. może mieć właściwość stylu CSS width, który można pobrać za pomocą .css('width'), ale może również być inte wypoczęty w outerWidth() lub innerWidth() lub width(), które zwracają szerokość obliczoną przez JavaScript.

dobre wyjaśnienie, w jaki sposób powyższe width metody różnią można przeczytać w dokumentacji, ale po prostu;

  1. outerWidth() uwzględnia wyściółką + marża
  2. width() trwa wyściółka pod uwagę
  3. innerWidth() bierze ani pod uwagę.
+1

Może być zaktualizowany $() -> $ (dokument) –

1

Miał podobny problem (offsetWidth był 0, ponieważ element nie został jeszcze wyrenderowany). Zrobiłem prosty:

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

I wydaje się działać bezbłędnie w mojej sprawie. W zasadzie prosi się o oddzwonienie, gdy aktualny stan wywołania javascript jest pusty.

myślę, że po utworzeniu elementu DOM w JavaScript, a jego szerokość jest zdefiniowane w zewnętrznym CSS być „100%”, to offsetWidth (i offsetHeight) tego obiektu nie zostanie obliczony przed wszystkim javascript zakończeniu działania .

Używając setTimeout(callback, 0), wydaje się być wywoływana po tym, jak przeglądarka zakończy bieżące wywołanie javascript I poświęciła czas na zastosowanie całego CSS do nowych elementów DOM.

Powiązane problemy