Ок, исходя из ситуации "фреймворков нет" и сетевого запроса со страницы все довольно просто:
1) Посылаем сетевой запрос (submit на форме, клику ссылки или по любому другому действию) - через fetch, например
2) Добавляем прелоадер на страницу - классы со стилями, добавление элементов через js - что угодно
3) После resolve нашего promise - убираем прелоадер, добавляем контент на страницу или делаем переход на другую страницу через document.location.href
4) Не забываем про какие-то действия на reject
https://learn.javascript.ru/fetch
https://learn.javascript.ru/promise-basics