Skip to content

Latest commit

 

History

History
142 lines (112 loc) · 5.88 KB

File metadata and controls

142 lines (112 loc) · 5.88 KB

shieldsIO shieldsIO shieldsIO

WideImg

Máster en Programación FullStack con JavaScript y Node.js

JS, Node.js, Frontend, Backend, Firebase, Express, Patrones, HTML5_APIs, Asincronía, Websockets, Testing

Clase 30

HTML5 Router

Rutas usando Hashes

Leyendo el hash

// domain.com/ruta#hashes...
console.log(window.location.hash);      // hashes...

function hashActual () {
    return window.location.href.split('#')[1] || '';
}

console.log("hash:", hashActual());     // hash: hashes...

Cambiando el hash

function hashActual () {
    return window.location.href.split('#')[1] || '';
}

function navigate (path) {
  var current = window.location.href;
  window.location.href = current.replace(/#(.*)$/, '') + '#' + path;
}

navigate("party-hard")
console.log("hash:", hashActual());     // party-hard

Eventos en el Hash

function hashActual () {
    return window.location.href.split('#')[1] || '';
}

window.addEventListener("hashchange", function(){
    console.log("Hash actual:", hashActual() )
}, false);

HTML5 ofrece history.pushState() y history.replaceState()

  • pushState genera una entrada nueva en el historial, pero replaceState la cambia
// Estamos en https://www.fictizia.com/profesorado
var infoDeEstado = { foo: "bar" };
history.pushState(infoDeEstado, "título de la web", "profesorado/ulises-gascon");
// Cambia la URL sin recargar la pagina a https://www.fictizia.com/profesorado/ulises-gascon
  • Tambien contamos con eventos y datos que podemos pasarnos
  • Solo se disparan cuando el usuario va hacia atras o delante...
window.addEventListener('popstate', function(event) {
    console.log('popstate fired!');
    console.log('info de estado: ' + JSON.stringify(event.state));
});

Tenemos que preparar el backend

  • Con el sistema de rutas HTML5 no debemos enviar peticiones al backend
  • Deberiamos cuadrar las rutas para funcionar con un fallback a nuestra SPA
                                  ----- server ------
              http://site.com --> |                 | 
                                  |   /index.html   |
                   index.html <-- |                 |
                                  -------------------

                                  ----- server ------
http://site.com/products/list --> |                 | 
                                  |   /index.html   |
           404 page not found <-- |                 |
                                  -------------------

Routers destacados

img

¡Viva la ingenieria inversa!

Templates

Librerías principales

Recursos

Ejercicios

1 - [Reto Navideño] Implementa un sistema de rutas con llamadas Ajax y plantillas partiendo de la API de AireMAD.

  • Al menos creas tres rutas /, /estacion, /estacion/:id
  • La ruta /estacion y /estacion/:id deben resolverse haciendo una llamada Ajax http://airemad.com/api/v1/station/:id y pintar sus resultados haciendo uso de plantillas
  • La url debe de poder compartise, permitiendo acceder a ese estado de la aplicación.
  • Debes generar un contexto común en la app (nav, footer, etc...). Solo parte del contenido es diámico
  • Debes gestionar los errores 404 y similares...
  • Igual es interesante preocuparnos de los posibles ataques XSS: Npm | dompurify, Npm | XSS
  • Puedes usar una librería si te ayuda, como navigo

Img

//Tu solución