Mam skrypt, który używa $(document).ready
, ale nie używa niczego innego z jQuery. Chciałbym to rozjaśnić, usuwając zależność jQuery.
Jak mogę wdrożyć własną $(document).ready
funkcjonalność bez korzystania z jQuery? Wiem, że używanie window.onload
nie będzie takie samo, jak window.onload
pożary po załadowaniu wszystkich zdjęć, ramek itp.
javascript
jquery
FlySwat
źródło
źródło
$(document).ready
, możesz łatwo rozwiązać ten problem, uruchamiając kod na samym dole strony zamiast na górze. HTML5Boilerplate stosuje to dokładne podejście.Odpowiedzi:
Istnieje zastąpienie oparte na standardach,
DOMContentLoaded
które jest obsługiwane przez ponad 98% przeglądarek , ale nie IE8:Natywna funkcja jQuery jest o wiele bardziej skomplikowana niż tylko window.onload, jak pokazano poniżej.
źródło
Edytować:
Oto realny zamiennik jQuery gotowy
Zaczerpnięte z https://plainjs.com/javascript/events/running-code-when-the-document-is-ready-15/
Kolejna dobra funkcja domReady tutaj pochodzi z https://stackoverflow.com/a/9899701/175071
Ponieważ zaakceptowana odpowiedź była daleka od ukończenia, połączyłem funkcję „gotową”, taką jak
jQuery.ready()
na podstawie źródła jQuery 1.6.2:Jak używać:
Nie jestem pewien, jak funkcjonalny jest ten kod, ale działał dobrze z moimi powierzchownymi testami. Zajęło to sporo czasu, więc mam nadzieję, że Ty i inni możecie z tego skorzystać.
PS .: Sugeruję kompilację .
Lub możesz użyć http://dustindiaz.com/smallest-domready-ever :
lub funkcję natywną, jeśli potrzebujesz obsługiwać tylko nowe przeglądarki (w przeciwieństwie do jQuery ready, nie uruchomi się, jeśli dodasz to po załadowaniu strony)
źródło
Trzy opcje:
script
jest ostatnim znacznikiem treści, DOM byłby gotowy przed wykonaniem znacznika skryptuonreadystatechange
Źródło: MDN
DOMContentLoaded
Zaniepokojony przeglądarkami z epoki kamienia: Przejdź do kodu źródłowego jQuery i użyj
ready
funkcji. W takim przypadku nie parsujesz + nie wykonujesz całej biblioteki, a jedynie niewielką jej część.źródło
Umieść swoje
<script>/*JavaScript code*/</script>
prawo przed</body>
tagiem zamykającym .Trzeba przyznać, że może to nie pasować do wszystkich celów, ponieważ wymaga zmiany pliku HTML, a nie tylko zrobienia czegoś w pliku JavaScript
document.ready
, ale nadal ...źródło
</html>
tagiem zamykającym ?html
tag powinien zawierać tylkohead
ibody
.Rozwiązanie biednego człowieka:
Zobacz skrzypce
Dodałem ten, nieco lepiej, chyba własny zakres i nie rekurencyjny
Zobacz skrzypce
źródło
setInterval
i całkowicie usuń rekurencję.Używam tego:
Uwaga: prawdopodobnie działa to tylko w nowszych przeglądarkach, szczególnie tych: http://caniuse.com/#feat=domcontentloaded
źródło
Naprawdę, jeśli zależy Ci tylko na Internet Explorerze 9+ , ten kod wystarczy, aby zastąpić
jQuery.ready
:Jeśli martwisz się o Internet Explorer 6 i niektóre naprawdę dziwne i rzadkie przeglądarki, zadziała to:
źródło
To pytanie zostało zadane już dawno temu. Dla każdego, kto widzi to pytanie, jest teraz strona o nazwie „może nie potrzebujesz jquery”, która rozkłada - według wymaganego poziomu obsługi IE - całą funkcjonalność jquery i zapewnia alternatywne, mniejsze biblioteki.
Skrypt gotowy do dokumentu IE8 według ciebie może nie wymagać jquery
źródło
'onreadystatechange'
jest to konieczne, a niedocument.attachEvent('onload', fn);
Ostatnio używałem tego na stronie mobilnej. To jest uproszczona wersja Johna Resiga z „Pro JavaScript Techniques”. To zależy od addEvent.
źródło
Wiele przeglądarek (także stare przeglądarki) i proste rozwiązanie:
Pokazuje alert w jsfiddle
źródło
Odpowiedź jQuery była dla mnie bardzo przydatna. Przy odrobinie refraktu dobrze pasowało do moich potrzeb. Mam nadzieję, że pomoże to komukolwiek innemu.
źródło
removeListener
trzeba będzie wywoływać z dokumentem jako kontekstem, tj.removeListener.call(document, ...
Oto najmniejszy fragment kodu do testowania DOM gotowy, który działa we wszystkich przeglądarkach (nawet IE 8):
Zobacz tę odpowiedź .
źródło
Po prostu dodaj to na dole strony HTML ...
Ponieważ dokumenty HTML są analizowane od góry do dołu.
źródło
Warto przyjrzeć się w Rock Solid addEvent () i http://www.braksator.com/how-to-make-your-own-jquery .
Oto kod na wypadek awarii strony
źródło
Ten kod przeglądarki wywoła funkcję, gdy DOM będzie gotowy:
Oto jak to działa:
domReady
wywołujetoString
metodę funkcji, aby uzyskać ciąg reprezentujący przekazywaną funkcję i zawija ją w wyrażenie, które natychmiast wywołuje funkcję.domReady
tworzy element skryptu z wyrażeniem i dołącza go dobody
dokumentu.body
po przygotowaniu modelu DOM.Na przykład, jeśli to zrobisz:
domReady(function(){alert();});
dobody
elementu zostaną dodane następujące elementy:Pamiętaj, że działa to tylko w przypadku funkcji zdefiniowanych przez użytkownika. Następujące elementy nie będą działać:
domReady(alert);
źródło
Co powiesz na to rozwiązanie?
źródło
Zawsze dobrze jest używać ekwiwalentów JavaScript w porównaniu do jQuery. Jednym z powodów jest mniejsza biblioteka, na której można polegać, i są one znacznie szybsze niż odpowiedniki jQuery.
Jednym z fantastycznych odniesień do odpowiedników jQuery jest http://youmightnotneedjquery.com/ .
Jeśli chodzi o twoje pytanie, wziąłem poniższy kod z powyższego linku :) Jedynym zastrzeżeniem jest to, że działa tylko z Internet Explorerem 9 i nowszymi.
źródło
Najbardziej minimalna i 100% działająca
Wybrałem odpowiedź od PlainJS i działa ona dla mnie dobrze. Rozszerza się,
DOMContentLoaded
aby można go było akceptować we wszystkich przeglądarkach.Ta funkcja jest odpowiednikiem metody jQuery
$(document).ready()
:Jednak w przeciwieństwie do jQuery, kod ten będzie działał poprawnie tylko w nowoczesnych przeglądarkach (IE> 8) i nie będzie tak, jeśli dokument jest już renderowany w momencie wstawienia skryptu (np. Przez Ajax). Dlatego musimy nieco to rozszerzyć:
Obejmuje to zasadniczo wszystkie możliwości i jest realnym zamiennikiem pomocnika jQuery.
źródło
Jest rok 2020 i
<script>
tag madefer
atrybut.na przykład:
określa, że skrypt jest wykonywany, gdy strona zakończy parsowanie.
https://www.w3schools.com/tags/att_script_defer.asp
źródło
Znaleźliśmy naszą szybką i brudną implementację w różnych przeglądarkach, która może załatwić sprawę w najprostszych przypadkach przy minimalnej implementacji:
źródło
doc.body
!Przedstawione tutaj rozwiązania setTimeout / setInterval będą działać tylko w określonych okolicznościach.
Problem pojawia się zwłaszcza w starszych wersjach Internet Explorera do 8.
Zmienne wpływające na sukces tych rozwiązań setTimeout / setInterval to:
oryginalny (rodzimy kod JavaScript) rozwiązujący ten konkretny problem znajduje się tutaj:
jest to kod, z którego zespół jQuery zbudował swoją implementację.
źródło
Oto, czego używam, jest szybki i obejmuje wszystkie podstawy, które myślę; działa na wszystko oprócz IE <9.
Wydaje się, że obejmuje to wszystkie przypadki:
Zdarzenie DOMContentLoaded jest dostępne w IE9 i wszystkim innym, więc osobiście uważam, że można z niego korzystać. Przepisz deklarację funkcji strzałki do zwykłej funkcji anonimowej, jeśli nie transponujesz kodu z ES2015 na ES5.
Jeśli chcesz poczekać, aż wszystkie zasoby zostaną załadowane, wszystkie wyświetlane obrazy itp., Użyj zamiast tego window.onload.
źródło
Jeśli nie musisz obsługiwać bardzo starych przeglądarek, możesz to zrobić nawet wtedy, gdy zewnętrzny skrypt jest załadowany atrybutem asynchronicznym :
źródło
W przypadku IE9 +:
źródło
Jeśli ładujesz jQuery u dołu BODY, ale masz problem z kodem, który wypisuje jQuery (<func>) lub jQuery (dokument) .ready (<func>), sprawdź jqShim na Github.
Zamiast odtwarzać własną funkcję przygotowywania dokumentu, po prostu trzyma się funkcji, dopóki jQuery nie będzie dostępny, a następnie przejdzie do jQuery zgodnie z oczekiwaniami. Przesunięcie jQuery na dół treści polega na przyspieszeniu wczytywania strony, a nadal możesz to zrobić, wstawiając plik jqShim.min.js w nagłówek szablonu.
Skończyło się na pisaniu tego kodu, aby przenieść wszystkie skrypty w WordPressie do stopki, a ten kod shim teraz znajduje się bezpośrednio w nagłówku.
źródło
Spróbuj tego:
źródło
onDocReady zapewnia wywołanie zwrotne, gdy domena HTML jest gotowa do pełnego dostępu / parsowania / manipulacji.
onWinLoad zapewnia oddzwonienie, gdy wszystko się załaduje (obrazy itp.)
źródło
źródło
Większość waniliowych funkcji JS Ready NIE
DOMContentLoaded
bierze pod uwagę scenariusza, w którym moduł obsługi jest ustawiony po załadowaniu dokumentu - co oznacza, że funkcja nigdy się nie uruchomi . Może się to zdarzyć, jeśli szukasz wDOMContentLoaded
ciąguasync
skryptu zewnętrznego (<script async src="file.js"></script>
).Poniższy kod sprawdza,
DOMContentLoaded
czy tylko dokumentreadyState
nie jest jużinteractive
lubcomplete
.Jeśli chcesz również obsługiwać IE:
źródło
Po prostu używam:
I w przeciwieństwie
document.addEventListener("DOMContentLoaded" //etc
do samej najwyższej odpowiedzi, działa już w IE9 - http://caniuse.com/#search=DOMContentLoaded wskazuje tylko tak niedawno, jak IE11.Co ciekawe natknąłem się na to
setTimeout
rozwiązanie w 2009 roku: czy sprawdzanie gotowości do nadmiaru DOM? , które prawdopodobnie można by sformułować nieco lepiej, ponieważ miałem na myśli „czy przesadą jest używanie bardziej skomplikowanych metod różnych frameworków do sprawdzania gotowości DOM”.Moim najlepszym wytłumaczeniem, dlaczego ta technika działa, jest to, że po osiągnięciu skryptu z takim setTimeout DOM jest w trakcie analizy, więc wykonanie kodu w setTimeout zostaje odroczone do czasu zakończenia tej operacji.
źródło