2009-05-20 10 views
6

Stworzyłem wtyczkę, która została przycięta do gołych kości wtyczki (tj. Brak funkcjonalności, tylko struktury) w celu debugowania tego problemu i nadal istnieje. Zajmuje się zmienianiem rozmiaru elementów div i bazuje na szerokości dokumentu.Szerokość okna JQuery jest niepoprawna w Chrome

Problem polega na tym, że szerokość zgłaszanych dokumentów jest zmniejszona o 17 pikseli względem rzeczywistej szerokości, a tym samym nie powoduje poprawnego rozmiaru elementów div.

Włożyłem w alertach, aby dowiedzieć się, gdzie pojawia się problem: before „gotowy” funkcja: 1780px (prawidłowa szerokość) Wewnątrz „gotowy” Funkcja: 1763px Wewnątrz wtyczki: 1763px (wszystkie wartości zwracanych "document.width" i "$ (document) .width()" z tymi samymi wynikami)

Dzieje się to tylko w Chrome i nadal działa, nawet jeśli wtyczka została skutecznie zredukowana.

Jakieś przemyślenia na temat tego, dlaczego tak się dzieje?

+0

Może być wielkość przewijania jest odejmowana. Jakiś kod pomoże w zlokalizowaniu problemu. – Magnar

+0

Zawęziłem go do bardziej konkretnego miejsca. Jeśli wyświetlany jest alert przed funkcją gotową, po kliknięciu przycisku OK renderowanie elementów Div jest poprawne. Jeśli ten alert zostanie usunięty, powróci do wartości 17px mniejszej od rzeczywistej szerokości. Czy są jakieś inne zdarzenia lub coś innego, co się dzieje po wyświetleniu alertu? – Stuart

+1

Właśnie usunąłem cały tekst zastępczy, który wymuszał przewijanie pasków, a odstęp został zredukowany do przestrzeni o rozmiarze paska przewijania. Myślę, że masz rację, że szerokość paska przewijania została odjęta. Jakieś pomysły na obejście tego problemu? – Stuart

Odpowiedz

2

Znalazłem, że jQuery (okno) .width() zwraca nieprawidłową wartość w Safari i Chrome.

+1

Webkit w rzeczywistości nie spełnia standardów W3C przy definiowaniu szerokości. Zawiera pasek przewijania w szerokości okna, mimo że specyfikacja mówi, że nie powinna. Boooo! – dudewad

3

zaczerpnięte z jQuery documentation:

Podczas JavaScript zapewnia obciążenie wydarzenie dla wykonywania kodu, gdy strona jest renderowany, to zdarzenie nie uzyskać wywołany dopóki wszystkie aktywa, takie jak obrazy zostały całkowicie uzyskane. W większości przypadków skrypt można uruchomić , gdy tylko hierarchia DOM zostanie w pełni skonstruowana w postaci . Program obsługi przeszedł do .ready() z gwarancją, że będzie wykonany po tym, jak DOM będzie gotowy, więc jest to zwykle najlepsze miejsce do dołączania wszystkich innych procedur obsługi zdarzeń i uruchomienia innego kodu jQuery. Podczas korzystania ze skryptów , które opierają się na wartościach właściwości stylu CSS , ważne jest, aby osadzić zewnętrzne style styli lub elementów stylu przed odniesieniem do skryptów.

W przypadku, gdy kod polega na załadowanych środków (na przykład, gdy wymiary o obrazie są wymagane), kod powinien być umieszczony w module obsługi zdarzenia obciążenia zamian.

prawdopodobnie należy używać

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

jako zdarzenia wyzwalającego

+0

Jeśli umieścisz $ (window) .width() w konsoli, jest to również błędne. Nie ma znaczenia, kiedy to się nazywa, to kwestia Chrome, w tym pasek przewijania jako część szerokości za pomocą CSS, ale w JS używa szerokości okna z odjętym paskiem przewijania. – Sawtaytoes

Powiązane problemy