No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
17 Hrs
37 Min
9 Seg

Location y hash navigation

8/17
Recursos

Aportes 28

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Si están usando la extensión live server, deben de tener cuidado de la url que está en el navegador, al cambiar el location.hash manualmente (desde consola) se cambia la ruta en la ventana del navagador también, y si pusieron en consola algo como:

location.hash="hola"

y realizan algún cambio en el código, al guardar, la extension live server “refrescará” la ventana del navegador, pero conservando el hash “#hola” en la dirección de la página, lo que puede provocar que creas que tu código está mal, cual en realidad sí está funcionando.

El

false 

según la documentación se conoce como

useCapture

Es Opcional

Si es true, useCapture indica que el usuario desea iniciar la captura. Después de iniciar la captura, todos los eventos del tipo especificado serán lanzados al listener registrado antes de comenzar a ser controlados por algún EventTarget que esté por debajo en el arbol DOM del documento.

https://developer.mozilla.org/es/docs/Web/API/EventTarget/addEventListener

Adicional en la parte que menciona el:

load

Este cuenta con una caracteristica vs el DOMContentLoaded

El evento load se desencadena cuando se ha cargado toda la página, incluidos todos los recursos dependientes, como hojas de estilo e imágenes. Esto contrasta con DOMContentLoaded, que se activa tan pronto como se ha cargado el DOM de la página, sin esperar a que los recursos terminen de cargarse.

https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event

Se que escribi mucho perdón, Pero si declaran la funcion como arrow function de la siguiente manera

window.addEventListener('DOMContentLoaded', navigatior, false)
window.addEventListener('hashchange', navigatior, false)

const navigatior = () => {
    	//your code
}

Les va a generar un error interesante 😏

En videos anteriores hicieron un aporte para optimizar el código y no tener que andar escribiendo a cada rato la linea de .querySelector cuando necesitamos hacer target a un elemento del html.

En esto me base para ahorrar lineas de código e implementar la misma idea pero con el .createElement que usamos muy seguido.

const Cr = (elemento) => document.createElement(elemento);

Utilice Cr por ser las siglas de la palabra “Create”, pero pueden nombrarla del modo que quieran, de este modo cada vez que necesitemos crear un elemento por medio de Js Solo tendríamos que escribirlo así:

const parrafo = Cr('p');

Esta es mi solucion para evitar anidar tantos if y que ademas me parece mas pulida y facil de leer y entender

No es película pero si es documental, por si les interesa: El viaje interminable

  • Location Propiedad del navegador de JS que permite leer la URL en la que nos encontramos actualmente, entre sus propiedades está el hash, puerto, ruta, etc

  • onhaschange: Permite que ejecutemos cierto código cada vez que cambie nuestro hash

Codigo de la clase 😁👍🏻

window.addEventListener("DOMContentLoaded", navigator, false)
window.addEventListener("hashchange", navigator, false)

function navigator() {
  if (location.hash.startsWith("#trends")) {
    trendsPage()
  } else if (location.hash.startsWith("#search=")) {
    searchPage()
  } else if (location.hash.startsWith("#movie=")) {
    movieDetailsPage()
  } else if (location.hash.startsWith("#category=")) {
    categoriesPage()
  } else {
    homePage()
  }
}

function homePage() {
  console.log("Home!!")
  getTrendingMoviesPreview()
  getCategoriesPreview()
}
function categoriesPage() {
  console.log("Categories!!")
}
function movieDetailsPage() {
  console.log("Movie!!")
}
function searchPage() {
  console.log("Search!!")
}
function trendsPage() {
  console.log("TRENDS!!")
}

El tercer parametro se utiliza para determinar si se va a manejar con bubbling cuando es false o capturing cuando es true

Les comparto una forma que encontré para facilitar la lectura del código. 😄

const navegador = () => {
	console.log({ location });

	const HASHES = {
		'#trends'    : () => trendsPage(),
		'#search='   : () => searchPage(),
		'#movie='    : () => moviePage(),
		'#category=' : () => categoryPage(),
	};

	for (const KEY of Object.keys(HASHES)) {
		if (location.hash.startsWith(KEY)) {
			HASHES[KEY]();

			return;
		}
	}

	homePage();
};

const homePage = () => {
	console.log('HOME');
};

const categoryPage = () => {
	console.log('CATEGORY 37');
};

const moviePage = () => {
	console.log('MOVIE');
};

const searchPage = () => {
	console.log('SEARCH');
};

const trendsPage = () => {
	console.log('TRENDS');
};

window.addEventListener('load', navegador, false);
window.addEventListener('hashchange', navegador, false);

Para quien se pregunte como puede hacer más leíble el nido de if else:

window.addEventListener('load', handleRouter, false)
window.addEventListener('hashchange', handleRouter, false)

function navigator(){
  const router = {
    '#trends': () => {console.log('trends')},
    '#search=': () => {console.log('search')},
    '#movie=': () => {console.log('movies')},
    '#category=': () => {console.log('categories')},
    '#home': () => {console.log('home')},
  }

  if(true){
    return router[window.location.hash] || router['#home']
  }
}

function handleRouter(){
  const router = navigator()
  router()
}

De hecho me lo enseño juan dc en otro curso.

Dejo la documentación sobre el addEventListener en este link

Como mensiono Juan tambien en el evento de carga tambien funciona con ‘load’ pero hay un pequeño problema, cuando cambias el hash no te va a redirecionar sino que se quedara en la misma pantalla.
Asi que tenemos que utilizar en el argumento ‘DOMContentLoaded’

Me ando muriendo de risa por el “PUMM” del minuto 16:27 JAJAJJAJAJA

Por cierto, asi va mi proyecto

Tal vez no les importe mucho pero estaba leyendo la documentacion del evento ‘DOMContentLoaded’ y dice que este no espera a que todo cargue: " It doesn’t wait for other things like images, subframes, and async scripts to finish loading." No espera la carga de imagenes, subframes(no se que son) y scrips asincronos.

En cambio el evento “load”: " should be used only to detect a fully-loaded page" se usa para detectar paginas completamente cargadas.

Ademas dice que el objetivo de este evento es el Document pero que se usa sobre el windo para manejar el evento en fase de captura o burbuja: “The original target for this event is the Document that has loaded. You can listen for this event on the Window interface to handle it in the capture or bubbling phases.”

Lo de las fases lo explico bastante bien un compañero en estos comentarios.
link info

En resumen hay dos formas de propagación en el DOM bubbling=false y capturing=true. Si se quiere que el evento de un elemento dentro de otro elemento con evento se ejecute primero, entonces se utiliza false o no se coloca nada porque por defecto es false, pero si se quiere que el evento del elemento externo se ejecute primero que el elemento con el evento interno se utiliza true.

El evento ‘hashchange’ tiene un valor booleano al final para determinar si la navegación es un fragmento o no. Una navegación por fragmentos ocurre cuando la parte de la URL correspondiente al ‘#’ ha cambiado y el valor booleano será cambiado a ‘true’ si la navegación es una navegación por fragmentos, y ‘false’ si no lo es.
.
Básicamente te permite lograr eventos por cambios en el anchor (#) haciendo el sitio dinámico. Esto podría servir por ejemplo para hacer toggle a las clases de tus etiquetas HTML con JS para así mostrar u ocultar distintas vistas.

Deberían de hacer un curso en donde se separe la teoría de localStorage, location y otros elementos, así quedarían mucho más claros, de paso que ese curso también tenga a las API Web más útiles.

En este curso, al tener que detenerse al explicar de manera superficial ciertos conceptos, por un lado, provoca que sea más lento y, por otro lado, no se profundiza lo suficiente en ciertos conceptos, pues solo se limitan a que el ejercicio funcione, pero no a que un estudiante pueda aplicar lo que quiera con esos conceptos.

Generalmente, eso le pasa al grupo que desarrollo este curso en otros mas.

Auto Save de VSC 🔥

Si te olvidas con frecuencia de guardar los cambios de tus archivos puedes usar el autoguardado de VSC que lo hará automáticamente por ti.

Solo ve a File y luego dale check en Auto Save

de lo aprendido en otro curso lo correcto sería escribirlo así:

const navigator = () => {
    console.log({ location });

    if (location.hash.startsWith('#trends')) {
        trendPage();
    } else if (location.hash.startsWith('#search=')) {
        searchPage();
    } else if (location.hash.startsWith('#movie=')) {
        movieDetailsPage();
    } else if (location.hash.startsWith('#category=')) {
        categoriesPage();
    } else {
        homePage();
    }

    location.hash
}

window.addEventListener('DOMContentLoaded', navigator, false);
window.addEventListener('haschange', navigator, false);

Cuando se trabaja con eventListener lo recomendable es colocar nuestra funcion con un arrow function (en este caso “navigator” debido a que si en un futuro necesitemos eleminar ese evento lo podriamos ubicar con su nombre “navigator” y optimizar el performance de nuestro DOM.

Creo haber Descubierto un easter egg, el Profe Juan fue uno de los responsables de que el nuevo curso de programación, haya sido orientado al mundo de Pokémon con Mokepón y no de Dragon ball o Naturo.

Clousure + Switch 💪


window.addEventListener('hashchange', navigator);
window.addEventListener('load', navigator);

function navigator(){
    let go = navigate();
switch(location.hash){
    case "#home":
            go.home();
            break;
    case "#search":
            go.search();
            break;
    case "#categories":
            go.categories();
            break;
    case "#trends":
            go.trends();
            break;
    case "#details":
            go.details();
            break;
    default: go.home();
}
}

function navigate(){

    return {
        "home": ()=>{
            console.log("you are on home");
            getTrendingMovies();
            getCategories();
        },
        "search": ()=>{
            console.log("you are on search");
        },
        "categories": ()=>{
            console.log("you are on categories");
            
        },
        "trends": ()=>{
            console.log("you are on trends");
        },
        "details": ()=>{
            console.log("you are on details");
        }
    }
}

Bueno, leí una docuentación para entender eso del terver parámetro del addEventListener, y tiene que ver con el DOM Event Flow, que básicamente es el proceso a través del cuál se origina el evento (en la implementación de Eventos DOM) y se envía o propaga a través del árbol de nodo y pues cada evento tiene un nodo objetivo.

Entonces hay unas fases, la de captura que va desde la raíz del árbol de nodos y se propaga hacia los nodos anteriores del nodo objetivo; la de bubbling que es la fase que hace el proceso contrario y la target que es cuando se envía al nodo de destino.

Entonces básicamente este parámetro lo que indica es en qué fases se quiere escuchar el evento. El true es sólo para la fase de captura y el false es sólo para la fase bubbling y target.

Explicación del "false"
El false en el addEventListener se refiere a la opción useCapture. Si esta opción se establece en true, el EventListener se activará en la fase de captura, lo que significa que se activará cuando el evento se propague desde el elemento raíz hacia abajo hasta el elemento de destino. Si se establece en false, el EventListener se activará en la fase de burbujeo, lo que significa que se activará cuando el evento se propague desde el elemento de destino hacia arriba hasta el elemento raíz. En tu caso, se ha establecido en false, lo que significa que el EventListener se activará en la fase de burbujeo.

window.addEventListener('load', navigator, false);
window.addEventListener('hashchange', navigator, false);

function navigator(){
  console.log({ location });

  if(location.hash.startsWith('#trens')){
    trendsPage();
  }else if(location.hash.startsWith('#search=')){
    searchPage();
  }else if(location.hash.startsWith('#movie=')){
    movieDetailPage();
  }else if(location.hash.startsWith('#category=')){
    categoryPage();
  }else{
    homePage();
  }
}

function homePage(){
  console.log('HOME!!!');
}

function searchPage(){
  console.log('SEARCH!!!');
}

function movieDetailPage(){
  console.log('MOVIE!!!');
}

function categoryPage(){
  console.log('CATEGORY!!!');
}

function trendsPage(){
  console.log('TRENDS!!!');
}

El código con comentarios, si lo necesitas en texto, dímelo 🙌

pue sun event listener tiene 2 fases bublelling (burbujeante) el evento se propaga desde el target hasta el window, la otra es capturing( es lo contrario al bubleling el evento se propaga de arriba asi abajo window hasta el target pasando por todo el DOM, al poner el argumento que seatea la propiedad capturing en false, lo que le estamos diciendo es que la funcion se debe ejecutar despues de que la propagacion del evento halla llegado al target es decir en la fase burbujeante

Genial esta clase me pusiste a volar jejejeje

gracias juan nunca se me hubiese ocurrido