Articulo de referencia

evento DOM

Los eventos DOM (Modelo de Objetos del Documento) son una señal de que algo ha ocurrido o está ocurriendo, y pueden ser activados por interacciones del usuario o por el navegado...

Los eventos DOM (Modelo de Objetos del Documento) son una señal de que algo ha ocurrido o está ocurriendo, y pueden ser activados por interacciones del usuario o por el navegador. [ 1 ] Los lenguajes de scripting del lado del cliente como JavaScript , JScript , VBScript y Java pueden registrar varios controladores o oyentes de eventos en los nodos de elementos dentro de un árbol DOM , como en documentos HTML , XHTML , XUL y SVG .

Ejemplos de eventos DOM:

  • Cuando un usuario hace clic con el ratón
  • Cuando se ha cargado una página web
  • Cuando se haya cargado una imagen
  • Cuando el ratón se mueve sobre un elemento
  • Cuando se cambia un campo de entrada
  • Cuando se envía un formulario HTML
  • Cuando un usuario presiona una tecla [ 2 ]

Históricamente, al igual que el DOM, los modelos de eventos utilizados por los distintos navegadores web presentaban diferencias significativas que causaban problemas de compatibilidad. Para solucionar esto, el Consorcio World Wide Web (W3C) estandarizó el modelo de eventos en el DOM Nivel 2.

Eventos

Eventos HTML

Eventos comunes

Existe una enorme colección de eventos que pueden ser generados por la mayoría de los nodos de elementos:

Tenga en cuenta que la clasificación de eventos anterior no es exactamente la misma que la clasificación del W3C.

Tenga en cuenta que los eventos cuyos nombres comienzan con "DOM" actualmente no cuentan con un buen soporte y, por esta y otras razones de rendimiento, el W3C los considera obsoletos en el nivel 3 de DOM. Mozilla y Opera admiten DOMAttrModified , DOMNodeInserted , DOMNodeRemoved y DOMCharacterDataModified . Chrome y Safari admiten estos eventos, excepto DOMAttrModified .

Eventos táctiles

Los navegadores web que se ejecutan en dispositivos con capacidad táctil , como iOS de Apple y Android de Google , generan eventos adicionales. [ 9 ] : §5.3

En el borrador de recomendación del W3CTouchEvent , se entrega una lista TouchListde Touchubicaciones, las teclas modificadoras que estaban activas, una lista TouchListde Touchubicaciones dentro del elemento DOM de destino y una lista TouchListde Touchubicaciones que han cambiado desde la anterior TouchEvent. [ 9 ]

Apple no se unió a este grupo de trabajo y retrasó la recomendación del W3C de su Especificación de Eventos Táctiles al revelar patentes tardíamente en el proceso de recomendación. [ 10 ]

Eventos de puntero

Los navegadores web en dispositivos con diversos tipos de dispositivos de entrada, como ratón, panel táctil y lápiz óptico, pueden generar eventos de entrada integrados. Los usuarios pueden ver qué tipo de dispositivo de entrada se presiona, qué botón se pulsa en ese dispositivo y con qué fuerza se pulsa el botón en el caso de un lápiz óptico. A octubre de 2013, este evento solo era compatible con Internet Explorer 10 y 11. [ 11 ]

Eventos de interfaz de usuario independientes

Aunque aún no se ha implementado del todo, los grupos de trabajo de Indie UI quieren ayudar a los desarrolladores de aplicaciones web a poder admitir eventos de interacción de usuario estándar sin tener que manejar diferentes eventos técnicos específicos de la plataforma que podrían coincidir con ellos. [ 12 ]

Crear interfaces de usuario intuitivas puede ser difícil, sobre todo si se tiene en cuenta que los patrones de diseño varían según la plataforma, el hardware y la configuración regional, y que estas interacciones pueden personalizarse aún más según las preferencias personales. Los usuarios están acostumbrados al funcionamiento de la interfaz en su propio sistema, y ​​su interfaz preferida suele diferir de la del desarrollador de la aplicación web.

Por ejemplo, los autores de aplicaciones web que deseen interceptar la intención del usuario de deshacer la última acción deben "escuchar" todos los siguientes eventos:

  • Control+Z en Windows y Linux.
  • Comando+Z en Mac OS X.
  • Eventos de agitación en algunos dispositivos móviles.

Sería más sencillo escuchar una única solicitud normalizada para "deshacer" la acción anterior.

Eventos específicos de Internet Explorer

Además de los eventos comunes (W3C), Internet Explorer añade dos tipos principales de eventos . Algunos de estos eventos han sido implementados como estándares de facto por otros navegadores.

Cabe destacar que Mozilla, Safari y Opera también admiten el evento readystatechange para el objeto XMLHttpRequest . Mozilla también admite el evento beforeunload mediante el método de registro de eventos tradicional (DOM Nivel 0). Mozilla y Safari también admiten el menú contextual, pero Internet Explorer para Mac no.

Tenga en cuenta que Firefox 6 y versiones posteriores admiten los eventos beforeprint y afterprint.

Eventos de XUL

Además de los eventos comunes (W3C), Mozilla definió un conjunto de eventos que funcionan únicamente con elementos XUL .

Otros eventos

Para Mozilla y Opera 9, también existen eventos no documentados conocidos como DOMContentLoaded y DOMFrameContentLoaded que se activan cuando se carga el contenido del DOM. Estos son diferentes de "load" ya que se activan antes de la carga de archivos relacionados (por ejemplo, imágenes). Sin embargo, DOMContentLoaded se ha añadido a la especificación HTML 5. [ 13 ] El evento DOMContentLoaded también se implementó en la compilación 500+ del motor de renderizado Webkit . [ 14 ] [ 15 ] Esto se corresponde con todas las versiones de Google Chrome y Safari 3.1+. DOMContentLoaded también está implementado en Internet Explorer 9. [ 16 ]

Opera 9 también admite los eventos de Web Forms 2.0 DOMControlValueChanged , invalid , forminput y formchange .

Flujo de eventos

Consideremos la situación en la que dos objetivos de evento participan en un árbol . Ambos tienen detectores de eventos registrados en el mismo tipo de evento, por ejemplo, "clic". Cuando el usuario hace clic en el elemento interno, hay dos formas posibles de manejarlo:

  • Activar los elementos desde el exterior hacia el interior (captura de eventos). Este modelo está implementado en Netscape Navigator .
  • Activar los elementos desde el interior hacia el exterior ( burbujeo de eventos ). Este modelo está implementado en Internet Explorer y otros navegadores. [ 17 ]

El W3C adopta una posición intermedia en esta lucha. [ 18 ] : §1.2

Según el W3C, los eventos pasan por tres fases cuando un objetivo de evento participa en un árbol:

  1. La fase de captura: el evento viaja desde el objetivo del evento raíz hasta el objetivo de un evento.
  2. La fase objetivo: el evento viaja a través del objetivo del evento
  3. La fase de burbuja ( opcional ): el evento viaja de regreso desde el objetivo de un evento hasta el objetivo del evento raíz. La fase de burbuja solo ocurrirá para eventos que se propagan (donde event.bubbles == true)

Puedes encontrar una visualización de este flujo de eventos en https://domevents.dev

Detener eventos

Mientras un evento se está transmitiendo a través de los oyentes del evento, el evento se puede detener con event.stopPropagation()oevent.stopImmediatePropagation()

  • event.stopPropagation(): el evento se detiene una vez que todos los oyentes de eventos conectados al objetivo del evento actual en la fase actual del evento hayan finalizado.
  • event.stopImmediatePropagation()El evento se detiene inmediatamente y no se ejecutan más detectores de eventos.

Cuando se detiene un evento, este deja de propagarse por la ruta de eventos. Detener un evento no lo cancela.

Mecanismos heredados para detener un evento

  • Establecer event.cancelBubbleen true(Internet Explorer)
  • Establecer la event.returnValuepropiedad enfalse

Cancelación de eventos

Se puede cancelar un cancelableevento llamando a event.preventDefault(). Cancelar un evento anulará el comportamiento predeterminado del navegador para ese evento. Cuando se cancela un evento, la event.defaultPreventedpropiedad se establecerá en true. Cancelar un evento no impedirá que el evento se propague por la ruta del evento.

Objeto de evento

El objeto Evento proporciona mucha información sobre un evento específico, incluyendo el elemento de destino, la tecla pulsada, el botón del ratón pulsado, la posición del ratón, etc. Desafortunadamente, existen serias incompatibilidades entre navegadores en este aspecto. Por lo tanto, en este artículo solo se analiza el objeto Evento del W3C.

Modelos de gestión de eventos

Nivel DOM 0

Este modelo de gestión de eventos fue introducido por Netscape Navigator y sigue siendo el modelo más compatible con diferentes navegadores a fecha de 2005.Existen dos tipos de modelos: el modelo en línea y el modelo tradicional .

Modelo en línea

En el modelo en línea, [ 20 ] los manejadores de eventos se agregan como atributos de los elementos. En el ejemplo siguiente, aparece un cuadro de diálogo de alerta con el mensaje "Hola Joe" después de hacer clic en el hipervínculo . La acción de clic predeterminada se cancela devolviendo falso en el manejador de eventos.

<!doctype html> < html lang = "en" > < head > < meta charset = "utf-8" > < title > Manejo de eventos en línea </ title > </ head > < body >< h1 > Manejo de eventos en línea </ h1 ><p> ¡ Hola ! </p> <a href="http://www.example.com" onclick="triggerAlert('Joe'); return false;"> Joe </a> ! </p><script> function triggerAlert ( name ) { window.alert ( " Hola " + name ) ; } </script> </body> </html>

Una idea errónea común sobre el modelo en línea es creer que permite el registro de manejadores de eventos con argumentos personalizados, por ejemplo, en la función. Si bien puede parecer que ese es el caso en el ejemplo anterior, lo que realmente sucede es que el motor JavaScript del navegador crea una función anónima que contiene las instrucciones en el atributo. El manejador del elemento estaría vinculado a la siguiente función anónima:nametriggerAlertonclickonclick

función () { triggerAlert ( 'Joe' ); return false ; }

Esta limitación del modelo de eventos de JavaScript se suele superar asignando atributos al objeto de función del controlador de eventos o utilizando cierres .

Modelo tradicional

En el modelo tradicional, [ 21 ] los manejadores de eventos se pueden agregar o eliminar mediante scripts. Al igual que en el modelo en línea, cada evento solo puede tener un manejador de eventos registrado. El evento se agrega asignando el nombre del manejador a la propiedad de evento del objeto elemento. Para eliminar un manejador de eventos, simplemente establezca la propiedad en nulo:

<!doctype html> < html lang = "en" > < head > < meta charset = "utf-8" > < title > Manejo tradicional de eventos </ title > </ head ><body> <h1> Gestión de eventos tradicional </h1><p> ¡ Hola Joe ! </p><script> var triggerAlert = function () { window.alert ( " Hola Joe" ) ; } ; // Asignar un controlador de eventos document.onclick = triggerAlert ; // Asignar otro controlador de eventos window.onload = triggerAlert ; // Eliminar el controlador de eventos que se acaba de asignar window.onload = null ; </script> </body> </html>

Para añadir parámetros:

var nombre = 'Joe' ; document . onclick = ( function ( nombre ) { return function () { alert ( '¡Hola ' + nombre + '!' ); }; }( nombre ));

Las funciones internas conservan su alcance .

DOM Nivel 2

El W3C diseñó un modelo de manejo de eventos más flexible en DOM Nivel 2. [ 18 ]

Algunas cosas útiles que debes saber  :

  • Para evitar que un evento se propague, los desarrolladores deben llamar al stopPropagation()método del objeto de evento.
  • Para evitar que se ejecute la acción predeterminada del evento, los desarrolladores deben llamar al preventDefault()método del objeto de evento.

La principal diferencia con el modelo tradicional es que se pueden registrar varios manejadores de eventos para el mismo evento. Esta useCaptureopción también permite especificar que el manejador se llame en la fase de captura en lugar de en la fase de propagación. Este modelo es compatible con Mozilla , Opera , Safari , Chrome y Konqueror .

Una reescritura del ejemplo utilizado en el modelo tradicional.

<!doctype html> < html lang = "en" > < head > < meta charset = "utf-8" > < title > DOM Nivel 2 </ title > </ head ><body> <h1> DOM Nivel 2 </h1><p> ¡ Hola Joe ! </p><script> var heyJoe = function () { window.alert ( " ¡ Hola Joe!" ) ; } // Agregar un controlador de eventos document.addEventListener ( " click" , heyJoe , true ) ; // fase de captura // Agregar otro controlador de eventos window.addEventListener ( " load " , heyJoe , false ); // fase de propagación // Eliminar el controlador de eventos recién agregado window.removeEventListener ( " load " , heyJoe , false ); </script></body> </html>

Modelo específico de Internet Explorer

Microsoft Internet Explorer anterior a la versión 8 no sigue el modelo W3C, ya que su propio modelo se creó antes de la ratificación del estándar W3C. Internet Explorer 9 sigue los eventos DOM de nivel 3, [ 22 ] e Internet Explorer 11 elimina su compatibilidad con el modelo específico de Microsoft. [ 23 ]

Algunas cosas útiles que debes saber  :

  • Para evitar que un evento se propague, los desarrolladores deben configurar la cancelBubblepropiedad del evento.
  • Para evitar que se ejecute la acción predeterminada del evento, los desarrolladores deben configurar la returnValuepropiedad del evento.
  • La thispalabra clave hace referencia al windowobjeto global.

Nuevamente, este modelo difiere del modelo tradicional en que se pueden registrar varios controladores de eventos para el mismo evento. Sin embargo, esta useCaptureopción no permite especificar que el controlador se llame durante la fase de captura. Este modelo es compatible con Microsoft Internet Explorer y los navegadores basados ​​en Trident (por ejemplo , Maxthon y Avant Browser).

Una reescritura del ejemplo utilizado en el antiguo modelo específico de Internet Explorer.

<!doctype html> < html lang = "en" > < head > < meta charset = "utf-8" > < title > Modelo específico de Internet Explorer </ title > </ head > < body > < h1 > Modelo específico de Internet Explorer </ h1 ><p> ¡ Hola Joe ! </p><script> var heyJoe = function () { window.alert ( " ¡ Hola Joe!" ) ; } // Agregar un controlador de eventos document.attachEvent ( "onclick" , heyJoe ); // Agregar otro controlador de eventos window.attachEvent ( " onload" , heyJoe ) ; // Eliminar el controlador de eventos recién agregado window.detachEvent ( " onload " , heyJoe ) ; </script></body> </html>

Referencias

  1. "Estándar DOM" . dom.spec.whatwg.org . Consultado el 25 de mayo de 2021 .
  2. "Eventos DOM de JavaScript" . www.w3schools.com . Consultado el 3 de agosto de 2019 .
  3. "7.8 Arrastrar y soltar — HTML5" .
  4. "API de arrastrar y soltar HTML" . 28 de marzo de 2024.
  5. "Eventos de progreso" .
  6. "API de archivos" .
  7. "Elemento: evento Mousemove - API web | MDN" . 22 de diciembre de 2023.
  8. "Especificación de eventos de nivel 3 del modelo de objetos de documento (DOM) (borrador de trabajo)" . W3C . Consultado el 17 de abril de 2013 .
  9. 1 2 3 "Eventos táctiles versión 2 - Borrador del editor del W3C" . W3C. 14 de noviembre de 2011. Recuperado el 10 de diciembre de 2011 .
  10. "Apple vuelve a usar patentes para socavar los estándares abiertos" . opera.com. 9 de diciembre de 2011. Consultado el 9 de diciembre de 2011 .
  11. "Eventos de puntero" .
  12. "IndieUI: Eventos 1.0" .
  13. "Estándar HTML" .
  14. Archivado el 11 de junio de 2010 en Wayback Machine .
  15. "¿Qué navegadores admiten el evento nativo DOMContentLoaded? « Consejos de desarrollo de Perfection Labs" . 29 de junio de 2011. Archivado del original el 29 de junio de 2011. {{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace )
  16. "Redirección de prueba de manejo" . Archivado del original el 8 de mayo de 2010. Consultado el 6 de mayo de 2010 .
  17. "Introducción a los eventos" . Quirksmode.org . Consultado el 15 de septiembre de 2012 .
  18. 1 2 "Especificación de eventos de nivel 2 del modelo de objetos de documento (DOM)" . W3C . 13 de noviembre de 2000. Recuperado el 15 de septiembre de 2012 .
  19. "Especificación de eventos de nivel 3 del modelo de objetos de documento (DOM) (borrador de trabajo)" . W3C . Consultado el 17 de abril de 2013 .
  20. "Controladores de eventos tempranos" . Quirksmode.org . Consultado el 15 de septiembre de 2012 .
  21. "Modelo tradicional de registro de eventos" . Quirksmode.org . Consultado el 15 de septiembre de 2012 .
  22. "Compatibilidad con eventos DOM de nivel 3 en IE9" . Microsoft . 26 de marzo de 2010. Consultado el 28 de marzo de 2010 .
  23. "Cambios de compatibilidad en IE11 Preview" . Microsoft . 9 de septiembre de 2013. Consultado el 5 de octubre de 2013 .

Lecturas adicionales

  • Deitel, Harvey. (2002). Internet y la World Wide Web: cómo programar (Segunda edición). ISBN 0-13-030897-8
  • La Organización Mozilla. (2009). Referencia de eventos DOM . Recuperado el 25 de agosto de 2009.
  • Quirksmode (2008). Tablas de compatibilidad de eventos . Consultado el 27 de noviembre de 2008.
  • http://www.sitepen.com/blog/2008/07/10/touching-and-gesturing-on-the-iphone/
  • Especificación de eventos de nivel 2 del modelo de objetos de documento (DOM)
  • Borrador de trabajo sobre eventos de nivel 3 del Modelo de Objetos del Documento (DOM)
  • DOM4: Eventos (Borrador del editor)
  • Borrador de trabajo para eventos de interfaz de usuario
  • Recomendación candidata del W3C para eventos de puntero
  • Evento de puntero de MSDN
  • domevents.dev - Un visualizador para aprender sobre los eventos DOM mediante la exploración.
  • Ejemplo en JS para la propagación y captura de eventos.