Только async вариант не асинхронный, т.к ждёт загрузки 1. самой библиотеки ,2.html страницы. Т.е когда ваш скрипт погружен как async, нужной функции, очевидно, не будет.Речь шла немного про другое. Когда рендерятся теги - там загрузка HTML-частей идёт параллельно (включая рекурсивную загрузку при вложенности: внутри одного HTML-куска тег загрузки дргуого HTML-куска и т.д.).
Тру асинхронный вариант будет как раз через атрибуты тегов.Вот тут - не понял... Поясните.
Для этого надо запускать не по window.onload,а по domcontentready, сам скрипт с async, и вообще сперва при загрузке скрипта запустить функцию, а потом и по загрузке дома. Будет прям очень быстро работать.Она стартует и сейчас сама автоматически сразу, после инициализации функции. Зачем её запускать ДО DOM'а, если он ещё не готов и делать этой функции нечего (может я в логике что-то упустил, подскажите)?
сохранять всю статику в локал-сторадж - думал,
Она стартует и сейчас сама автоматически сразу, после инициализации функции
<html>
<script ASYNC src="includehtml.js">
<div id="menu" data-src="instant_menu.html"></div>
<link rel="stylesheet" href="1mb_style.css" type="text/css">
... blabla bla ... куча кода дальше.
<div id="defer_load" data-src="defer_load.html"></div>
<img ..><img ..><img ..>
</html>
Начнёт грузить большой файл. Долго. Вероятнее всего уже на этом этапе отработает async скрипт, и должен, (по моей задумке) , запуститься первый раз. И собрать всё что он уже успел в доме найти. Например menu. Запустит асинхронную подгрузку и всё. Дальше браузер пойдёт параллельно обрабатывать стили, и потом грузить дальше весь остальной код в дом, включая #defer_load.Сейчас так и происходит: при обходе DOM-"дерева", как только встречается следующий ресурс, он даёт команду на загрузку, а саму загрузку файла - не ждёт и парсит "дерево" дальше, ищя следующий объект вложения и т.д. до завершения обхода всего "дерева" целиком. (но да: всё это происходит в секции window.onload)
Сперва весь html парсится в dom-content.)
Когда всё загрузит, наступит domcontentloaded, вот на него надо бы повесить уже второй повторный обработчик который пройдёт и начнёт асинхронно грузить то что скрипт не догрузил когда выполнился.Что значит фраза: "не догрузил, когда выполнился"?
При этом, ещё пункт про нужность двух запусков. Асинхронный скрипт может запуститься после domcontentloaded, а тут ты бац, и запустишь первый проход не зависимо от этого принудительно. =)От чего зависит: после он запустится или нет (от кода функции, от браузера "под капотом", или какой-то 3-й вариант ещё есть)?
и запустишь первый проход не зависимо от этого принудительно.? (если я буду напрямую грузить сверху по HTML-коду в ASYNC и без событий - то этого должно быть достаточно, как я понял...)
(function() {
window.includeHTML = function(src, destination, callback) {
}
function includeHTMLAuto(node) {
}
var old_onload = window.onload;
window.onload = function() {
old_onload && old_onload();
includeHTMLAuto(document.body);
}
})();
<html>
<title>boo</title>
<script src="foo.js">
<p>something</p>
</html>
document.write('<h1>somethign</h1>');
<html>
<title>boo</title>
<h1>somethign</h1>
<p>something</p>
</html>
<h1>
вставит его в документ. И только после этого вставит параграф. <title>
) скрипт может работать. <div data-src="menu.html"></div>
<html>
<div data-src="menu.html"></div>
<script src="includehtml.js">
<div id="load_later" data-src="load_later.html"></div>
</html>
(function() {
window.includeHTML = function(src, destination, callback) {
}
function includeHTMLAuto(node) {
}
var old_onload = window.onload;
window.onload = function() {
old_onload && old_onload();
includeHTMLAuto(document.body);
}
includeHTMLAuto(document.body); // - добавили это
})();
<html>
<div data-src="menu.html"></div>
<script async src="includehtml.js">
bla bla bla some code
<div id="load_later" data-src="load_later.html"></div>
bla bla bla some code 2
</html>
<div data-src="menu.html"></div>
.Т.е. схема работы при загрузке библиотеки будет:Вот это - более, чем понятно! :)
1) выполнить includeHTML - какой есть
2) по загрузке dom выполнить что осталось.
При этом конечно надо поправить библиотеку так чтобы она поддерживала эти два вызова. Т.е. не загружала повторно menu.html например.
Что произойдёт. Браузер начнёт парсить dom, найдёт див. вставит. Найдёт твою библиотеку. Выполнит.Вот тут, как я понимаю, и есть разрыв: неполный DOM при первом вызове!
Библиотека просканирует текущий dom, в document.body будет только один тег, див. Оно его там начнёт асинхронно грузить, в это время уже пойдёт дальнейшая работа с дом. Он загрузит #load_later, и начнёт условно подгружать другие ресурсы если есть, картинки там, видео и т.п.
Вот тут, как я понимаю, и есть разрыв: неполный DOM при первом вызове!
И моя библиотека и браузерный DOM-обходичик будут в режиме race condition, используя HTML-текст (для заполнения DOM), как общий входной пул.
Может можно, чтобы не дёргать потом 2-й раз:
1. Как-то следить за "курсором" браузерного обработчика по HTML-разметке во время его прохода при формировании DOM?
2. Или попробовать обработать в своём скрипте (распарсить "вручную")
HTML-разметку при первом вызове (избегая DOM)? Но не будет ли это медленнее?
3. Или, после завершения обхода начального "дерева" (тех тегов, что уже обходчик браузера загрузил выше), проверить наступление события изменения DOM-структуры (если не дошли до события window.onload), и если DOM изменился - рекурсивно себя дёрнуть, чтобы не ждать window.onload ?
Т.е. как-то надо понять, как самому лучше превратиться в обходчика разметки напару с браузером не ожидая и не мешая друг другу)