#Pregunta para expertos sobre eventos en

1 messages · Page 1 of 1 (latest)

half anvil
#

tal vez esta parte de una docu te ayude a entender el porque esta pasando eso que comentas
https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event#when_popstate_is_sent

The popstate event of the Window interface is fired when the active history entry changes while the user navigates the session history. It changes the current history entry to that of the last page the user visited or, if history.pushState() has been used to add a history entry to the history stack, that history entry is used instead.

past path
#

¿Dónde en concreto?, ya lo he mirado un montón de veces y no encuentro nada sobre el tema.

half anvil
#

la parte de
it's important to first understand that — to combat unwanted pop-ups — browsers may not fire the popstate event at all unless the page has been interacted with.

y tambien
When a navigation occurs — either due to the user triggering the browser's Back button or otherwise — the popstate event is near the end of the process to navigate to the new location. It happens after the new location has loaded (if needed), displayed, made visible, and so on — after the pageshow event is sent, but before the persisted user state information is restored and the hashchange event is sent.

puede que no sea el capture el que "no este funcionando" si no que cada browser lo implemente como quiera basado en su engine porque aca en este link https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event#browser_compatibility te dice especificamente que hay notas de implementacion asi que puedes tratar de leerlas y ver si de alguna forma puedes cambiar el orden de llamado de los eventos para este en especifico que tiene que ver con el browser como tal, esto debido a que al final depende del browser ya que cada uno soporta los API "a su manera" o no los soporta del todo

The popstate event of the Window interface is fired when the active history entry changes while the user navigates the session history. It changes the current history entry to that of the last page the user visited or, if history.pushState() has been used to add a history entry to the history stack, that history entry is used instead.

past path
#

Es que no veo que tenga nada que ver eso que pusiste con lo que pregunto.

También mire la especificación (no mdn, sino en https://tc39.es/ecma262/) pero tampoco soy capaz de encontrar nada con respecto a la captura del evento o el orden.

También he probado en todos los navegadores más importantes y el comportamiento es el mismo. En ningún lugar hace referencia a las fases del evento ni cuando se ejecuta.

Tampoco he encontrado blogs, foros ni ningún sitio que se haga referencia a la ejecución fuera de orden en ese evento. Estoy igual de perdido que estaba ayer. :/

#

Luego la inteligencia artificial me dice una cosa y la contraria según le pregunto más a fondo, así que peor aun jaja

half anvil
#

la pregunta que me sale de todo esto, es porque necesitas un orden para ejecutar ?
es algo simplemente quieres saber o bien es para algo necesitar realizar?

half anvil
#

Busque mas info y parece que hay ciertos eventos que no permiten el bubble como el https://developer.mozilla.org/en-US/docs/Web/API/Element/blur_event o https://developer.mozilla.org/en-US/docs/Web/API/Element/focus_event

tal vez el popstate asignado al window tampoco hace bubble y por eso no hay diferencia entre

window.addEventListener('popstate', () => { console.log('2º popstate listener'); }, { capture: true } );```

porque al final son lo mismo, ademas si pensamos en el `bubbling` y el `capture` para usarlo directo al window, el `bubbling` pues no pareciera tener mucho sentido ya que es algo del `browser` y no de un elemento en el HTML
Seria como querer hacer `bubbling` o `capture:true` al evento `load` para todo el window, esto lo pienso ya que este apartado https://developer.mozilla.org/es/docs/Web/API/EventTarget/addEventListener#multiple_identical_event_listeners tiene informacion de que se descartar los `listeners` que tienen los mismos parametros, etc, asi que puede que por ahi venga el porque el `capture:true` no te este funcionando para el `popstate` en el `window` 

No se si eso te sirve, pero de paso a mi si me sirvio para repasar el `bubble` / `capture` de los eventos en js

The blur event fires when an element has lost focus. The event does not bubble, but the related focusout event that follows does bubble.

The focus event fires when an element has received focus. The event does not bubble, but the related focusin event that follows does bubble.

addEventListener() Registra un evento a un objeto en específico. El Objeto especifico (en-US) puede ser un simple elemento en un archivo, el mismo documento , una ventana o un XMLHttpRequest.

past path
#

Lo necesito porque tengo una aplicación de una sola página (utilizo la librería Lit) con un router que se aprovecha del evento popstate. Entonces quiero que un componente cualquiera que se cargue en la aplicación, pueda interceptar el router temporalmente creando su propio listener en popstate y no dejando que el evento le llegue al lisener que había creado el router.

Como el listener del router fue creado antes, siempre captura el evento primero.

Se que podría hacerlo cambiando la manera en la que genero esos listeners, utilizando una función ayuda que genere un solo listener y la utilice tanto el router como los otros componentes, y que dentro de ese listener generado pues se trate el orden. Pero el router es una librería externa que utiliza el addeventlistener nativo de javascript, y no quería reescribrirlo o hacer mi propia version si no fuera necesario.

Como se que en otros eventos eso lo puedo hacer utilizando la fase de captura para capturar el evento antes de que llegue a la fase de burbujeo, pues estaba mirando si se podía hacer así también ya que sería una manera muy sencilla de realizarlo, y sino pues me va a llevar mucho más código y cambiar la estructura de la aplicación.

#

De hecho me parece increíble que no se soporte eso nativamente....

past path
#

Lo que pensé es que como es un evento de windows, que realmente no tenga ni fase capture ni fase bubbling, porque realmente no tiene que subir por el don y luego volver, ya que todo sale de windows. Pero me gustaría saber si eso está por algún lado de la especificación.

#

Sobre lo que pusiste de multiples listeners, eso no tiene que ver, porque todos los listener que añado se ejecutarn, es decir no se descarta ninguno, lo único que el orden siempre es el mismo, el de creación, al igual que con cualquier otro evento, pero eso es lo que dice la especificación, y en los otros eventos pues lo que decía antes, si se quiere "cambiar el orden" se utiliza la fase captura.

#

De hecho, voy a probar alguna cosa que no probe, de mirar como se comportan los eventos en el objeto windows, en comparación a cualquier elemento de la página, si cambia el comportamiento de las fases capture y bubbling, por si es por eso.