Задать вопрос
alexdeg
@alexdeg
Новатор

Как сделать роутинг на чистом JS?

Доброго времени суток!

Задача — есть SPA в виде файла index.html который выдается клиенту с сервера, который слушает роут / и метод GET, рядом с ним есть рауты которые обрабатывают POST запросы (всякие данные с сервера). Необходимо сделать SPA который будет зависеть от location.pathname для внутренней подстраховки нужных страниц (например если в URL будет http;//example.ru/auth то отрицается блок auth).

Проблема в том, что сервер роут слушающий / и GET также слушает и все остальное от клиента. Как сделать так, чтобы была внутренняя маршрутизация без обращения к серверу по методу GET?

Я пытался сделать через pushState но он работает только после нажатия в браузере вперед/назад
  • Вопрос задан
  • 125 просмотров
Подписаться 1 Простой 9 комментариев
Пригласить эксперта
Ответы на вопрос 2
@artem-dainov
Php, java, js. Boot spring, jquery, git
Если я правильно понял, вы хотите, чтобы index.html загружал все данные, после изменения url, при этом ваша страница не должна перезагружаться, , а если её перезагрузили, то все равно должен подгрузиться index.html и вывести результат согласно url.

1. Настройка веб сервера. Вам нужно на сервере свести все запросы на index.html, кроме api запросов. в apache это можно сделать в htaccess, а в boo spring в spring security. в других не знаю как.
2. Добавить событие, которое будет ждать клик на ссылку и перехватывать действие по умолчанию.
3. Написать функцию, которая будет принимать данные с значения в событии и в зависимости от значения вызывать нужный контент на страницу.
4. Назначить отслеживание изменения адресной строки.
5. Где-то в коде произвести один раз функцию вне события клика, чтобы после перезагрузки страницы вызвался тот контент, который отвечает адресу в адресной строки.

Помните, что без веб сервиса будет всё плохо в таком варианте.
Если вы адресную строку не будете использовать, то вам и не нужно как-то настраивать веб сервер, ведь всё это будет крутиться в рамках одной страницы.

Как примерно должен выглядеть код.

// функция роутенга
function router(url) {
fetch(url+".html").then((data) => {
return data.text();
}).then((response) => {
document.getElementById("content").innerHTML = response;
}).catch((error) => {});
}
// событие слушающее клик.
document.addEventListener("click", (event) => {
if (event.target.tagName=="a") {
// перехват и остановка действий по умолчанию.
event.preventDefault();
// отправляем url в роутенг.
router(event.target.getAttribute("href"));
}
});
// Еще не забыть устроить изменение url в браузере.


Такой вариант очень сырой, но его можно доработать и он будет отлично выполнять задачу.
Совет, изменение url в браузере лучше сделать внутри функции router(), в том месте, где добавляется контент в страницу.
Тем самым вы сделаете так, что url изменится когда код точно будет знать, что контент реально есть.
Ответ написан
ThunderCat
@ThunderCat Куратор тега JavaScript
{PHP, MySql, HTML, JS, CSS} developer
По моему вы пытаетесь переизобрести реакт/вуе.
Простой ответ - react router.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы