Чист JavaScript еквивалент на jQuery's $.ready() - как да извикате функция, когато страницата/DOM е готова за нея
Добре, това може да е просто глупав въпрос, въпреки че съм сигурен, че има много други хора, които от време на време задават същия въпрос. Аз просто искам да съм 100% сигурен за това така или иначе. С jQuery всички знаем чудесното
$('document').ready(function(){});
Нека'обаче да кажем, че искам да стартирам функция, която е написана на стандартен JavaScript, без да е подкрепена от библиотека, и че искам да стартирам функцията веднага щом страницата е готова да я обработи. Какъв е правилният начин да подходим към това?
Знам, че мога да направя:
window.onload="myFunction()";
...или мога да използвам тага body
:
<body onload="myFunction()">
...или дори мога да опитам в долната част на страницата след всичко, но след края на тага body
или html
, като например:
<script type="text/javascript">
myFunction();
</script>
Какъв е методът за издаване на една или повече функции, съвместим с различни браузъри (стари/нови), по начин, подобен на jQuery's $.ready()
?
Най-простото нещо, което можете да направите, ако нямате рамка, която да се грижи за съвместимостта с различни браузъри вместо вас, е просто да поставите извикване на вашия код в края на тялото. Това е по-бързо за изпълнение от обработката
onload
, тъй като се чака само DOM да е готов, а не всички изображения да се заредят. И това работи във всеки браузър.За съвременните браузъри (всички версии от IE9 и по-нови и всички версии на Chrome, Firefox или Safari), ако искате да можете да приложите подобен на jQuery метод
$(document).ready()
, който можете да извикате отвсякъде (без да се притеснявате къде е позициониран извикващият скрипт), можете просто да използвате нещо подобно:Употреба:
Ако се нуждаете от пълна съвместимост с различни браузъри (включително стари версии на IE) и не искате да чакате за
window.onload
, тогава вероятно трябва да разгледате как фреймуърк като jQuery реализира своя метод$(document).ready()
. Това е доста сложно в зависимост от възможностите на браузъра.За да ви дам малка представа какво прави jQuery (което ще работи навсякъде, където е поставен тагът script).
Ако се поддържа, той опитва стандартния:
с резервен вариант:
или за по-стари версии на IE използва:
с резервен вариант на:
Има и някои заобикаляния на кода на IE, които не разбирам, но изглежда, че са свързани с рамки.
Ето и пълен заместител на jQuery's
.ready()
, написан на чист javascript:Последната версия на кода е публично достъпна в GitHub на адрес https://github.com/jfriend00/docReady
Използване:
Това е тествано в:
Работна реализация и тестова база: http://jsfiddle.net/jfriend00/YfD3C/
Ето резюме на начина на работа:
docReady(fn, context)
docReady(fn, context)
, проверете дали обработващата функция ready вече се е задействала. Ако е така, просто планирайте новодобавената обратна връзка да се задейства веднага след като тази нишка на JS приключи сsetTimeout(fn, 1)
.document.addEventListener
, тогава инсталирайте обработчици на събития с помощта на.addEventListener()
за двете събития"DOMContentLoaded"
и"load"
. Събитието "load" е резервно събитие за безопасност и не трябва да е необходимо.document.addEventListener
не съществува, инсталирайте обработчици на събития с помощта на.attachEvent()
за събитията"onreadystatechange"
и"onload"
.onreadystatechange
проверете далиdocument.readyState === "complete"
и ако е така, извикайте функция, за да задействате всички обработчици за готовност.Обслужващите функции, регистрирани с
docReady()
, гарантирано ще бъдат изпълнени в реда, в който са регистрирани.Ако извикате
docReady(fn)
, след като документът вече е готов, обратната връзка ще бъде планирана да се изпълни веднага след като текущата нишка на изпълнение приключи с помощта наsetTimeout(fn, 1)
. Това позволява на извикващия код винаги да приема, че това са асинхронни обратни извиквания, които ще бъдат извикани по-късно, дори ако по-късно е веднага щом приключи текущата нишка на JS, и запазва реда на извикване.Вашият метод (поставяне на скрипта преди затварящия таг на тялото)
е надежден начин за поддръжка на стари и нови браузъри.
document.ondomcontentready=function(){}
би трябвало да свърши работа, но няма пълна съвместимост с браузъра.Изглежда, че трябва просто да използвате jQuery min