Sistema de rutas solo con Javascript
Router simple con Javascript
He creado una pequeña librería para poder crear rutas y poder cargar html y/o templates.
El sistema es muy sencillo pero permite tener un sistema de rutas sin tener que usar ningún framework.
Tienes el código directamente o puedes bajarte el código desde su Github y puedes probar el sistema de rutas en Javascript desde aquí
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Router nativo</title>
</head>
<body>
<main>
</main>
<ul>
<li><a href="#list">List</a></li>
<li><a href="#edit">Edit</a></li>
<li><a href="#templateA">TemplateA</a></li>
<li><a href="#templateB">TemplateB</a></li>
</ul>
<data-route-view></data-route-view>
<template id="list">
<h1>LISTADO</h1>
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
</template>
<template id="edit">
<h1>LISTADO</h1>
<ul>
<li><input type="text" value="A"></li>
<li><input type="text" value="B"></li>
<li><input type="text" value="C"></li>
<li><input type="text" value="D"></li>
</ul>
</template>
<script src="./simpleRotuer.js"></script>
<script>
window.onload = function() {
window.router.init([{
path: "/list",
view: "<h1>Listado</h1>"
}, {
path: "/edit",
view: "<h1>Edición</h1>"
}, {
path: "/templateA",
view: "#list"
}, {
path: "/templateB",
view: "#edit"
}]);
};
</script>
</body>
</html>
simpleRouter.js
window.router = ((win, doc) => {
if ("onhashchange" in window) {
let configRouter = {
supportTemplate: false,
route: []
};
const errors = {
notSupportTemplates: "NO TIENES SOPORTE PARA TEMPLATE, USA HTML DIRECTAMENTE EN LA PROPIEDAD 'VIEW'",
notPathConfigure: "COMPRUEBA QUE ESTÁ DEFINIA LA RUTA Y/O LA PROPIEDAD 'PATH' DENTRO DE LA CONFIGURACIÓN DE RUTAS"
};
const info = {
loadTemplate: "CARGANDO TEMPLATE",
loadHTML: "CARGANDO HTML",
routerOK: "DEFINIDO ROUTER DENTRO DE WINDOW"
};
let setSupportTemplate = estado => configRouter.supportTemplate = estado;
let loadView = () => doc.querySelector("data-route-view");
let renderTemplate = (template, dest) => {
let clone = doc.importNode(doc.querySelector(template).content, true);
dest.appendChild(clone);
};
let render = (type, destino, contenido) => {
if (type.toUpperCase() === "TEMPLATE") {
cleanRouterView();
renderTemplate(destino, contenido);
}
if (type.toUpperCase() === "HTML") {
cleanRouterView();
contenido.innerHTML = destino;
}
};
let cleanRouterView = () => doc.querySelector("data-route-view").innerHTML = "";
let init = (rutas) => {
configRouter.route = rutas;
win.addEventListener("hashchange", () => {
let _notDefinedPath = true;
for (_index in configRouter.route) {
if (location.hash.replace("#", "/") === configRouter.route[_index].path) {
_notDefinedPath = true;
let _view = loadView();
if (configRouter.route[_index].view.indexOf("#") >= 0) {
if (!configRouter.supportTemplate) {
console.log(errors.notSupportTemplates);
return false;
}
render("TEMPLATE", configRouter.route[_index].view, _view);
} else {
render("HTML", configRouter.route[_index].view, _view);
}
return false;
}
}
if (!_notDefinedPath) {
console.log(errors.notPathConfigure);
}
});
console.log(info.routerOK);
};
return {
init: function (rutas) {
if ('content' in document.createElement('template')) {
console.log("TIENES SOPORTE PARA TEMPLATE");
setSupportTemplate(true);
} else {
console.log("NO TIENES SOPORTE PARA TEMPLATE");
setSupportTemplate(false);
}
init(rutas);
}
}
} else {
console.log("NO TIENES SOPORTE PARA EL EVENTO HASHCHANGE");
}
})(window, document);
