Niektórych dokumentów nie mogę uzyskać wysokości dokumentu (aby umieścić coś absolutnie na samym dole). Dodatkowo wypełnienie na dole wydaje się nic nie robić na tych stronach, ale na stronach, na których powróci wysokość. Przypadki w pkt:
http://fandango.com
http://paperbackswap.com
W przypadku Fandango
jQuery $(document).height();
zwraca poprawną wartość
document.height
zwraca 0
document.body.scrollHeight
zwraca 0
W zamianie w miękkiej oprawie:
Błąd typu jQuery $(document).height();
: $(document)
null
document.height
zwraca niepoprawną wartość
document.body.scrollHeight
zwraca niepoprawną wartość
Uwaga: Mam uprawnienia na poziomie przeglądarki, jeśli jest tam jakaś sztuczka.
javascript
Nic
źródło
źródło
Odpowiedzi:
Rozmiary dokumentów to koszmar kompatybilności z przeglądarkami, ponieważ chociaż wszystkie przeglądarki ujawniają właściwości clientHeight i scrollHeight, nie wszystkie zgadzają się co do sposobu obliczania wartości.
Kiedyś istniała złożona najlepsza praktyka dotycząca sprawdzania prawidłowej wysokości / szerokości. Wiązało się to z użyciem właściwości document.documentElement, jeśli jest dostępna, lub poleganiem na właściwościach dokumentu i tak dalej.
Najprostszym sposobem uzyskania prawidłowej wysokości jest uzyskanie wszystkich wartości wysokości znalezionych w dokumencie lub documentElement i użycie najwyższej. Jest to w zasadzie to, co robi jQuery:
Szybki test za pomocą Firebug + bookmarklet jQuery zwraca prawidłową wysokość dla obu cytowanych stron, podobnie jak przykład kodu.
Pamiętaj, że testowanie wysokości dokumentu przed przygotowaniem dokumentu zawsze spowoduje 0. Ponadto, jeśli załadujesz więcej rzeczy lub użytkownik zmieni rozmiar okna, może być konieczne ponowne przetestowanie. Użycie
onload
lub dokument gotowy zdarzenie, jeśli to potrzebne w czasie ładowania, w przeciwnym razie po prostu sprawdzić, kiedy trzeba numer.źródło
To jest naprawdę stare pytanie, dlatego ma wiele nieaktualnych odpowiedzi. Od 2020 r. Wszystkie główne przeglądarki są zgodne ze standardem .
Odpowiedź na 2020 r .:
Edycja: powyższe nie uwzględnia marginesów na
<body>
tagu. Jeśli twoje ciało ma marginesy, użyj:źródło
document.documentElement.getBoundingClientRect()
działa lepiej.<h1>
na początku jest element<body>
z domyślnym marginesem, zepchnie<body>
element w dół bez możliwości jego wykrycia.document.documentElement.scrollHeight
(niedocument.body,scrollHeight
) to najdokładniejszy sposób robienia rzeczy. Działa to zarówno z marginesami ciała, jak i marginesami wewnątrz ciała, popychając go w dół.Możesz nawet użyć tego:
lub w bardziej jQuery sposób (ponieważ jak powiedziałeś, jQuery nie kłamie) :)
źródło
Pełne obliczenie wysokości dokumentu:
Aby być bardziej ogólnym i znaleźć wysokość dowolnego dokumentu, możesz po prostu znaleźć najwyższy węzeł DOM na bieżącej stronie za pomocą prostej rekurencji:
Możesz go przetestować na przykładowych stronach ( http://fandango.com/ lub http://paperbackswap.com/ ), wklejając ten skrypt do konsoli DevTools.
UWAGA: działa z
Iframes
.Cieszyć się!
źródło
„Metoda jQuery” polegająca na określaniu rozmiaru dokumentu - sprawdzanie wszystkiego, przyjmowanie najwyższej wartości i nadzieja na najlepsze - działa w większości przypadków, ale nie we wszystkich .
Jeśli naprawdę potrzebujesz wyników kuloodpornych dla rozmiaru dokumentu, sugeruję użycie mojej wtyczki jQuery.documentSize . W przeciwieństwie do innych metod, faktycznie testuje i ocenia zachowanie przeglądarki po załadowaniu i, w oparciu o wynik, odpytuje od niej odpowiednią właściwość.
Wpływ tego jednorazowego testu na wydajność jest minimalny , a wtyczka zwraca prawidłowe wyniki nawet w najdziwniejszych scenariuszach - nie dlatego, że tak mówię, ale ponieważ ogromny, automatycznie wygenerowany pakiet testowy faktycznie to potwierdza.
Ponieważ wtyczka jest napisana w waniliowym JavaScript, możesz jej używać także bez jQuery .
źródło
Skłamałem, jQuery zwraca poprawną wartość dla obu stron $ (dokument) .height (); ... dlaczego kiedykolwiek w to wątpiłem?
źródło
Prawidłowa odpowiedź na rok 2017 to:
document.documentElement.getBoundingClientRect().height
W przeciwieństwie do
document.body.scrollHeight
tej metody uwzględnia marginesy ciała. Podaje także ułamkową wartość wysokości, co może być przydatne w niektórych przypadkachźródło
document.body.scrollHeight
wyświetla całą wysokość przewijalną, czyli to, co zadało oryginalne pytanie.html { height: 100% }
w css. Zatem API poprawnie zwraca rzeczywistą obliczoną wysokość. Spróbuj usunąć ten styl, a także dodać marginesy,body
a zobaczysz, na czym polega problem z używaniemdocument.body.scrollHeight
.<h1>
na początku jest element<body>
z domyślnym marginesem, zepchnie<body>
element w dół bez możliwości jego wykrycia.document.documentElement.scrollHeight
(niedocument.body,scrollHeight
) to najdokładniejszy sposób robienia rzeczy.documentElement.scrollHeight
podaje w tym przypadku niewłaściwą wartość.documentElement.getBoundingClientRect().height
daje poprawny. sprawdź to: jsfiddle.net/fLpqjsxdgetBoundingClientRect().height
. Zostaje odsunięty na bok, podczas gdy 3 (trzy) inne metody nie zostają odsunięte na bok. W tym ten, o którym wspominasz jako gorszy. I nalegasz na to, sugerując usunięcie 100% z wysokości strony HTML i dodanie do niej marginesów. Jaki jest sens ? Po prostu zaakceptuj, że niegetBoundingClientRect().height
jest to również kuloodporne.Aby uzyskać szerokość w trybie przeglądarki / urządzenia, użyj:
źródło
Dla każdego, kto ma problemy z przewijaniem strony na żądanie, używając funkcji wykrywania funkcji, wymyśliłem ten hack, aby wykryć, która funkcja ma być używana w animowanym przewijaniu.
Problem był zarówno
document.body.scrollTop
idocument.documentElement
zawsze zwracanytrue
we wszystkich przeglądarkach.Można jednak przewijać dokument tylko jednym lub drugim.
d.body.scrollTop
dla Safari idocument.documentElement
dla wszystkich innych według w3schools (patrz przykłady)element.scrollTop
działa we wszystkich przeglądarkach, a nie na poziomie dokumentu.źródło
użyj kodu nadmuchu do obliczenia wysokości + przewijania
źródło
Poniższy kod dla różnych przeglądarek ocenia wszystkie możliwe wysokości elementów body i HTML i zwraca maksymalną znalezioną wartość:
Przykład roboczy:
źródło
Nie wiem o określaniu wysokości, ale możesz użyć tego, aby umieścić coś na dole:
źródło
Dodaj odpowiednie referencje
W moim przypadku korzystałem ze strony ASCX, a strona aspx zawierająca kontrolkę ascx nie używa poprawnie referencji. Właśnie wkleiłem następujący kod i zadziałało:
źródło