Burbujeo de eventos en objeto JavaScript puro.
Quiero implementar un sistema de eventos en un objeto JS puro que sea similar a los eventos del DOM, que se puedan despachar y propagarse desde un objeto hijo hacia el objeto padre.
¿Puedo usar interfaces existentes como EventTarget o Event para hacer esto? ¿Cuál es la forma correcta de lograrlo?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Preview Pro</title>
</head>
<body>
<div id="app"></div>
<script>
class body extends EventTarget {
constructor(name, parent) {
super();
this.name = name;
this.type = 'body';
this.parentNode = parent;
}
};
class hand extends body {
constructor(name, parent) {
super(name, parent);
this.type = 'hand';
}
}
class finger extends body {
constructor(name, parent) {
super(name, parent);
this.type = 'finger';
}
}
var human = new body('stanley');
var left_hand = new hand('left_hand', human);
var thumb = new finger('thumb', left_hand);
left_hand.addEventListener('touch', function (e) {
// bubbling
console.log(e)
});
thumb.addEventListener('touch', function (e) {
// target
console.log(e)
});
thumb.dispatchEvent(new Event('touch', {bubbles: true}));
</script>
</body>
</html>
Después de buscar un poco, encontré esta respuesta. Aún utiliza el árbol DOM para asegurarse de que el evento se propague desde el hijo hacia el padre. ¿Se puede hacer esto sin utilizar el árbol DOM?
davy.ai
Sí, es posible implementar un sistema de eventos en un objeto JS puro sin usar el árbol DOM. Una forma de lograr esto es creando un sistema de eventos personalizado que imite el comportamiento de los eventos del DOM. Puedes crear una clase para el objeto evento que incluya propiedades como
type
,target
,currentTarget
,bubbles
, etc. Luego, puedes crear un método en el objeto que te permita despachar eventos y hacer que se propaguen a lo largo de la jerarquía del objeto. Aquí tienes un ejemplo de cómo se podría implementar:Esta clase
MyObject
incluye métodos para agregar y eliminar oyentes de eventos, despachar eventos y establecer el padre del objeto. También incluye una propiedad llamada_listeners
que es un objeto que contiene matrices de oyentes de eventos para cada tipo de evento.Para crear una jerarquía de objetos que pueda propagar eventos desde objetos hijos hasta objetos padres, simplemente debes establecer la propiedad
parent
de cada objeto hijo con su objeto padre. Aquí tienes un ejemplo:En este ejemplo, creamos tres instancias de
MyObject
y establecemos sus propiedades de padre para crear una jerarquía. Luego, agregamos oyentes de eventos a cada objeto para el eventomyevent
. Finalmente, despachamos el evento en el objeto hijo (obj3
) y se propaga por la jerarquía del objeto, desencadenando los oyentes de eventos en cada objeto padre a su vez.