informatica:programacion:cursos:programacion_avanzada_javascript:eventos_navegadores
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:cursos:programacion_avanzada_javascript:eventos_navegadores [2024/10/11 15:29] – [Valor devuelto por un evento] tempwin | informatica:programacion:cursos:programacion_avanzada_javascript:eventos_navegadores [2024/10/30 15:45] (actual) – [Prácticas propuestas para el módulo] tempwin | ||
|---|---|---|---|
| Línea 7: | Línea 7: | ||
| Hasta ahora hemos visto muchísimas cosas sobre JavaScript. Con los conocimientos adquiridos podemos **crear algoritmos, modificar los contenidos de una página, acceder a cualquier elemento**… Pero, todo eso nos sirve de poco si no podemos **hacerlo en el momento preciso**. Al final, JavaScript dentro de una página web se utiliza casi siempre para interactuar con el usuario. Y precisamente eso es lo que nos proporcionan los eventos. Con lo que veremos en este módulo estaremos cerrando el círculo y llegando a lo que más nos interesa: los usuarios. | Hasta ahora hemos visto muchísimas cosas sobre JavaScript. Con los conocimientos adquiridos podemos **crear algoritmos, modificar los contenidos de una página, acceder a cualquier elemento**… Pero, todo eso nos sirve de poco si no podemos **hacerlo en el momento preciso**. Al final, JavaScript dentro de una página web se utiliza casi siempre para interactuar con el usuario. Y precisamente eso es lo que nos proporcionan los eventos. Con lo que veremos en este módulo estaremos cerrando el círculo y llegando a lo que más nos interesa: los usuarios. | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | pistola | + | |
| - | </ | + | |
| Un documento HTML consta de un amplio conjunto de elementos, como párrafos, enlaces, formularios, | Un documento HTML consta de un amplio conjunto de elementos, como párrafos, enlaces, formularios, | ||
| Línea 414: | Línea 412: | ||
| Como vemos es un simple '' | Como vemos es un simple '' | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Flujo-Eventos | + | |
| - | </ | + | |
| Si pulsamos en el enlace, al estar contenido dentro del '' | Si pulsamos en el enlace, al estar contenido dentro del '' | ||
| Línea 428: | Línea 424: | ||
| Lo cierto es que **es algo más complicado que esto**, y un poco antiintuitivo a la vez. En realidad, cuando se produce un evento en un elemento de la página **se producen tres fases diferenciadas a la hora de gestionar y lanzar el evento**. Estas tres fases se ilustran bien en la figura siguiente: | Lo cierto es que **es algo más complicado que esto**, y un poco antiintuitivo a la vez. En realidad, cuando se produce un evento en un elemento de la página **se producen tres fases diferenciadas a la hora de gestionar y lanzar el evento**. Estas tres fases se ilustran bien en la figura siguiente: | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | fase-eventos | + | |
| - | </ | + | |
| * **Fase de captura**: en esta fase se comienza a detectar el evento desde el elemento más alto en la jerarquía (el documento), hacia abajo, hasta llegar justo antes del elemento donde realmente se ha generado el evento. En nuestro símil con el estanque es como si las ondas comenzasen a formarse desde fuera hacia adentro, cerrándose sobre el punto de impacto de la piedra en lugar de al contrario. Bastante poco intuitivo, su origen se remonta a la guerra de los navegadores, | * **Fase de captura**: en esta fase se comienza a detectar el evento desde el elemento más alto en la jerarquía (el documento), hacia abajo, hasta llegar justo antes del elemento donde realmente se ha generado el evento. En nuestro símil con el estanque es como si las ondas comenzasen a formarse desde fuera hacia adentro, cerrándose sobre el punto de impacto de la piedra en lugar de al contrario. Bastante poco intuitivo, su origen se remonta a la guerra de los navegadores, | ||
| Línea 716: | Línea 710: | ||
| | '' | | '' | ||
| | '' | | '' | ||
| - | | '' | + | | '' |
| | '' | | '' | ||
| | '' | | '' | ||
| Línea 888: | Línea 882: | ||
| Además, otra página interesante para tener como referencia, aunque ya tiene unos años, es [[http:// | Además, otra página interesante para tener como referencia, aunque ya tiene unos años, es [[http:// | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Dottoro | + | |
| - | </ | + | |
| Las principales herramientas de escritura de código ofrecen también ayuda contextual mientras escribimos, por lo que nos facilitarán mucho asignar eventos, propiedades y saber qué parámetros utilizar. Aprovecha su potencia. | Las principales herramientas de escritura de código ofrecen también ayuda contextual mientras escribimos, por lo que nos facilitarán mucho asignar eventos, propiedades y saber qué parámetros utilizar. Aprovecha su potencia. | ||
| Línea 1651: | Línea 1643: | ||
| ==== Eventos de formularios y controles de entrada ==== | ==== Eventos de formularios y controles de entrada ==== | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | formulario | + | |
| - | </ | + | |
| Para el caso del formulario ya hemos visto el más importante de ellos, '' | Para el caso del formulario ya hemos visto el más importante de ellos, '' | ||
| Línea 2341: | Línea 2331: | ||
| ==== Ejemplo: eventos para detectar la aparición y desaparición de elementos en la página ==== | ==== Ejemplo: eventos para detectar la aparición y desaparición de elementos en la página ==== | ||
| - | Una cuestión que puede resultar muy útil en una página o aplicación web es la posibilidad de detectar cuándo aparece o desaparece de la pantalla un elemento determinado debido a las acciones del usuario, tanto total como parcialmente. | + | Una cuestión que puede resultar muy útil en una página o aplicación web es la posibilidad de detectar |
| Por ejemplo, si desaparece una pieza de información importante porque el usuario hace scroll moviendo los contenidos podemos sacar una nota resumen, recordatorio o acceso directo para poder verla de nuevo, y ocultarlo otra vez cuando vuelva a aparecer. Cosas por el estilo. | Por ejemplo, si desaparece una pieza de información importante porque el usuario hace scroll moviendo los contenidos podemos sacar una nota resumen, recordatorio o acceso directo para poder verla de nuevo, y ocultarlo otra vez cuando vuelva a aparecer. Cosas por el estilo. | ||
| - | Para conseguir algo así nos vendría muy bien disponer de eventos para los elementos que nos informasen de cuándo aparecen o desaparecen de la parte visible de la página. Nos suscribiríamos a este evento de la manera convencional y recibiríamos automáticamente notificaciones si el elemento aparece o desaparece. | + | Para conseguir algo así nos vendría muy bien disponer de eventos para los elementos que **nos informasen de cuándo aparecen o desaparecen de la parte visible de la página**. Nos suscribiríamos a este evento de la manera convencional y recibiríamos automáticamente notificaciones si el elemento aparece o desaparece. |
| - | El problema es que no existe ningún evento como este en HTML/ | + | El problema es que **no existe ningún evento como este** en HTML/ |
| En esta lección y un próximo vídeo práctico vamos a aprovechar lo que conocemos de creación de eventos para desarrollar desde cero la funcionalidad necesaria para conseguir tener varios eventos relacionados con la visibilidad, | En esta lección y un próximo vídeo práctico vamos a aprovechar lo que conocemos de creación de eventos para desarrollar desde cero la funcionalidad necesaria para conseguir tener varios eventos relacionados con la visibilidad, | ||
| Línea 2353: | Línea 2343: | ||
| En concreto vamos a crear 4 eventos para cualquier elemento de una página relacionados con su visibilidad, | En concreto vamos a crear 4 eventos para cualquier elemento de una página relacionados con su visibilidad, | ||
| - | | + | * '' |
| - | hide: se lanza cuando el elemento pasa a estar completamente fuera del área visible. | + | * '' |
| - | showpart: se lanza cuando el elemento estaba oculto por completo y cualquier parte del mismo entra en el área visible, es decir, se muestra parcialmente tras haber estado oculto. | + | * '' |
| - | hidepart: se lanza cuando el elemento estaba completamente visible y cualquier parte del mismo sale de la zona visible, es decir, cuando se oculta, aunque sea una fracción pequeña del mismo. | + | * '' |
| - | Los eventos añaden una propiedad visible al objeto estándar details del objeto event del manejador del evento, de modo que puedas usar el mismo manejador para gestionar varios de ellos (por ejemplo, el mismo para show y hidepart que tenderán a ir relacionados). | + | Los eventos añaden una propiedad |
| En esta lección vamos a ver algunos detalles generales de la " | En esta lección vamos a ver algunos detalles generales de la " | ||
| - | | + | <WRAP center round info 60%> |
| + | Esta biblioteca de eventos la he creado como un proyecto Open Source que puedes | ||
| + | </ | ||
| La funcionalidad la vamos a dividir en varios bloques independientes que, en conjunto, nos permitirán obtener lo que necesitamos. | La funcionalidad la vamos a dividir en varios bloques independientes que, en conjunto, nos permitirán obtener lo que necesitamos. | ||
| - | 1.- Detectar la ubicación relativa de cualquier elemento de la página | ||
| - | En HTML la forma de detectar | + | === 1.- Detectar |
| - | Este método no toma ningún parámetro y devuelve un objeto especial | + | En HTML la forma de detectar la ubicación real de un elemento en la página es utilizar |
| + | Este método no toma ningún parámetro y devuelve un objeto especial de tipo '' | ||
| + | |||
| + | <code javascript> | ||
| var caja = elto.getBoundingClientRect(); | var caja = elto.getBoundingClientRect(); | ||
| console.log(caja.top); | console.log(caja.top); | ||
| + | </ | ||
| En este caso se mostraría en la consola la posición del borde superior del elemento respecto a la parte de arriba del viewport. | En este caso se mostraría en la consola la posición del borde superior del elemento respecto a la parte de arriba del viewport. | ||
| - | 2.- Determinar si el elemento está visible en la página o no | ||
| - | Como las coordenadas anteriores son relativas al área visible (o viewport) de la página, esto quiere decir que varían en cada momento en función de donde esté colocado | + | === 2.- Determinar si el elemento |
| - | Podríamos determinar fácilmente si el elemento está o no por completo dentro | + | Como las coordenadas anteriores son relativas al área visible (o viewport) |
| + | Podríamos determinar fácilmente **si el elemento está o no por completo dentro de la página** en un momento dado definiendo una función como esta: | ||
| + | |||
| + | <code javascript> | ||
| function isElementTotallyVisible(elt) { | function isElementTotallyVisible(elt) { | ||
| var viewportWidth = window.innerWidth || document.documentElement.clientWidth; | var viewportWidth = window.innerWidth || document.documentElement.clientWidth; | ||
| Línea 2391: | Línea 2388: | ||
| | | ||
| } | } | ||
| + | </ | ||
| - | Lo que hacemos es, antes de nada, determinar el ancho y el alto del área visible actual, para lo cual usamos la propiedad innerWidth e innerHeight de la ventana. | + | Lo que hacemos es, antes de nada, **determinar el ancho y el alto del área visible** actual, para lo cual usamos la propiedad |
| - | | + | <WRAP center round info 60%> |
| + | Nota: Se incluye también el '' | ||
| + | </ | ||
| - | A continuación se obtienen los límites de la caja del elemento, y se comparan con los bordes del viewport para ver si el elemento está totalmente contenido dentro de éste o no. Devuelve true en caso afirmativo y false en caso de que se salga, aunque sea un poco, por cualquier lado. | + | A continuación se obtienen los límites de la caja del elemento, y se comparan con los bordes del viewport para ver si el elemento está totalmente contenido dentro de éste o no. Devuelve |
| - | Es un poco más complicado determinar si el elemento está contenido parcialmente en la página o no. A lo mejor nos interesa determinar no solo cuándo cualquier parte del elemento se sale de la vista (que sería lo anterior) sino cuándo se sale de la vista por completo. En este caso sería útil averiguar si el elemento está dentro del área visible, aunque sea parcialmente. Es decir, con que se vea aunque sea un fragmento minúsculo del elemento, poder saberlo. | + | Es un poco más complicado determinar |
| Tendríamos que crear una versión alternativa de la función anterior cambiando la comprobación final, que ahora sería como esta: | Tendríamos que crear una versión alternativa de la función anterior cambiando la comprobación final, que ahora sería como esta: | ||
| + | <code javascript> | ||
| function isElementPartiallyVisible(elt) { | function isElementPartiallyVisible(elt) { | ||
| var viewportWidth = window.innerWidth || document.documentElement.clientWidth; | var viewportWidth = window.innerWidth || document.documentElement.clientWidth; | ||
| Línea 2413: | Línea 2414: | ||
| return (insideBoxH && insideBoxV); | return (insideBoxH && insideBoxV); | ||
| } | } | ||
| + | </ | ||
| - | En este caso las condiciones son más complicadas, | + | En este caso las condiciones son más complicadas, |
| - | 3.- Detectar automáticamente si el elemento aparece o desaparece del área visible | + | |
| - | | + | === 3.- Detectar automáticamente si el elemento aparece o desaparece del área visible === |
| + | |||
| + | <WRAP center round important 60%> | ||
| + | | ||
| + | </ | ||
| Ahora que ya sabemos determinar si el elemento está total o parcialmente dentro del área visible, lo primero es determinar por qué motivos es posible que un elemento se desplace y, por lo tanto, pueda aparecer o desaparecer de dentro del área visible de la página. | Ahora que ya sabemos determinar si el elemento está total o parcialmente dentro del área visible, lo primero es determinar por qué motivos es posible que un elemento se desplace y, por lo tanto, pueda aparecer o desaparecer de dentro del área visible de la página. | ||
| Línea 2423: | Línea 2428: | ||
| Existen varias causas para la modificación de la posición de un elemento y por lo tanto para su posible cambio de visibilidad: | Existen varias causas para la modificación de la posición de un elemento y por lo tanto para su posible cambio de visibilidad: | ||
| - | | + | * **Scroll de la página**. Este es el más evidente. Lo podemos detectar gracias al **evento |
| - | Cambio de tamaño: si la ventana cambia de tamaño, la página se redibuja (" | + | * **Cambio de tamaño**: si la ventana cambia de tamaño, la página se redibuja (" |
| - | Carga de la página: la carga de la página se produce realmente en dos fases. Primero se carga su código y se interpreta (el DOM estaría listo) y luego se acaban de cargar los elementos externos, como por ejemplo las imágenes. Si alguna de estas imágenes no tiene especificadas sus dimensiones, | + | * **Carga de la página**: la carga de la página se produce realmente en dos fases. Primero se carga su código y se interpreta (el DOM estaría listo) y luego se acaban de cargar los elementos externos, como por ejemplo las imágenes. Si alguna de estas imágenes no tiene especificadas sus dimensiones, |
| Hay algún caso más que veremos un poco después, pero con estos 3 sería suficiente para la mayor parte de las necesidades, | Hay algún caso más que veremos un poco después, pero con estos 3 sería suficiente para la mayor parte de las necesidades, | ||
| - | 4.- Determinar si el elemento ha aparecido o desaparecido del área visible | + | |
| + | === 4.- Determinar si el elemento ha aparecido o desaparecido del área visible | ||
| Vamos a definir una función que nos va a permitir determinar si un elemento está parcialmente en el área visible y poder ejecutar una función en dicho caso: | Vamos a definir una función que nos va a permitir determinar si un elemento está parcialmente en el área visible y poder ejecutar una función en dicho caso: | ||
| + | <code javascript> | ||
| function inViewportPartially(elt, | function inViewportPartially(elt, | ||
| var prevVisibility = isElementPartiallyVisible(elt); | var prevVisibility = isElementPartiallyVisible(elt); | ||
| Línea 2450: | Línea 2457: | ||
| return detectPossibleChange; | return detectPossibleChange; | ||
| } | } | ||
| + | </ | ||
| Al llevar " | Al llevar " | ||
| Línea 2459: | Línea 2467: | ||
| Lo primero que hacemos es establecer el estado inicial de la visibilidad del elemento, es decir, si cuando se llama a esta función el elemento está visible o no, que será nuestro estado de base para el mismo. Se consigue con la función vista en el paso 2, y en este caso consideramos elementos parcialmente visibles. | Lo primero que hacemos es establecer el estado inicial de la visibilidad del elemento, es decir, si cuando se llama a esta función el elemento está visible o no, que será nuestro estado de base para el mismo. Se consigue con la función vista en el paso 2, y en este caso consideramos elementos parcialmente visibles. | ||
| - | Definimos también una función dentro de esta función que será la que se llamará ante cualquiera de los 3 eventos que hemos considerado que cambian el estado de visibilidad del elemento (load, resize y scroll). Esta función (detectarPosibleCambio()) lo único que hace es comprobar el estado actual de visibilidad del elemento y compararlo con el estado de base. Si ha cambiado, anota el nuevo estado base (para la siguiente comparación, | + | Definimos también una función dentro de esta función que será la que se llamará ante cualquiera de los 3 eventos que hemos considerado que cambian el estado de visibilidad del elemento ('' |
| - | | + | <WRAP center round info 60%> |
| + | Nota: Este método interno tiene acceso a los parámetros de la función (elemento y manejador) y al estado de base gracias a la clausura a la que pertenece, al ser una función interna a la otra. | ||
| + | </ | ||
| Finalmente, lo único que se hace es definir estos tres eventos que habíamos identificado para que llamen a esta función interna ante cualquier cambio que se produzca. | Finalmente, lo único que se hace es definir estos tres eventos que habíamos identificado para que llamen a esta función interna ante cualquier cambio que se produzca. | ||
| - | Existe otra función gemela de esta, inViewportTotally(), | + | Existe otra función gemela de esta, '' |
| Bien, esto es el código de " | Bien, esto es el código de " | ||
| - | Anexo: Otras formas de cambiar la disposición de la página | ||
| - | Además | + | ==== Anexo: Otras formas |
| - | | + | Además de los 3 eventos que hemos considerado para detectar cambios, existen otras maneras menos frecuentes de que se modifique la posición de los elementos de la página. Concretamente **3 casos que no vamos a utilizar** en la biblioteca por no mermar el rendimiento de la página: |
| - | Cambio dinámico de la propiedad display de algún elemento: si cambiamos mediante JavaScript el modo de visualización de algún elemento de la página (por ejemplo para ocultarlo y que no ocupe espacio en la página, o hacer que se comporte como elemento de bloque cuando antes era inline). No existe ningún evento que nos informe de un cambio como este, por lo que no quedaría más remedio que usar un temporizador y verificar dentro de éste la posición de los elementos que nos interesen. Muy poco eficiente y malo para el rendimiento, | + | |
| - | Zoom de la página: si el usuario hace zoom en la página, el tamaño de los elementos cambia y por lo tanto cambian de posición. Esto es más común en navegadores móviles, donde se puede hacer zoom con los dedos (si se le permite), pero en los navegadores de escritorio también ocurre. No hay manera de detectar esto con garantías en un navegador. Por lo tanto deberíamos recurrir también a un temporizador que cada medio segundo (o el periodo que nos sirva para nuestro caso) usara las funciones descritas en el paso 2 para ver si el elemento está en el viewport o no. Poco recomendable para el beneficio que obtenemos. | + | * **La modificación mediante código del árbol de elementos de la página (DOM)**: si metemos o quitamos elementos, éstos podrían provocar el reflujo de la misma y por lo tanto cambiar la posición de un elemento que nos interese. Si tuviésemos interés en detectar este hecho podríamos usar el evento |
| + | * **Cambio dinámico de la propiedad | ||
| + | * **Zoom de la página**: si el usuario hace zoom en la página, el tamaño de los elementos cambia y por lo tanto cambian de posición. Esto es más común en navegadores móviles, donde se puede hacer zoom con los dedos (si se le permite), pero en los navegadores de escritorio también ocurre. | ||
| Aunque nuestro código no detecta estos tres casos marginales, en cuanto el usuario mueva mínimamente la página el evento de scroll detectará la posición y nos notificará de cualquier posible cambio que hubiese usando el evento personalizado pertinente, así que en la práctica no compensa preocuparse por ellos salvo quizá en algún caso muy particular. | Aunque nuestro código no detecta estos tres casos marginales, en cuanto el usuario mueva mínimamente la página el evento de scroll detectará la posición y nos notificará de cualquier posible cambio que hubiese usando el evento personalizado pertinente, así que en la práctica no compensa preocuparse por ellos salvo quizá en algún caso muy particular. | ||
| + | |||
| + | ==== Funcionamiento práctico ==== | ||
| + | |||
| + | ==== DEMO: Explicación del código ==== | ||
| ===== Prácticas propuestas para el módulo ===== | ===== Prácticas propuestas para el módulo ===== | ||
| + | ste módulo se ha centrado en las diversas maneras que tenemos desde JavaScript para gestionar interacciones de los usuarios con el navegador. Esto nos permitirá crear todo tipo de aplicaciones prácticas basadas en lo que hemos aprendido antes sobre el lenguaje. En definitiva, llevar lo aprendido más cerca de la práctica real. Aunque los ejemplos que hemos realizado son intencionadamente sencillos para no desenfocarnos de lo que se pretendía enseñar, ahora tienes prácticamente todas las herramientas que necesitas para crear cualquier aplicación web que puedas necesitar. Es cuestión de juntar las piezas. | ||
| + | |||
| + | Para reforzar los conceptos de este módulo y practicar un poco más te propongo los siguientes ejercicios: | ||
| + | |||
| + | * En el ejemplo de la etiqueta que persigue al ratón mostrando sus coordenadas, | ||
| + | * Añade a una página cualquiera (que tenga al menos varios elementos '' | ||
| + | * Que las teclas rápidas se detecten pulsándolas cuando el foco esté en cualquier parte de la página. | ||
| + | * Que si el foco está en algún elemento que acepte entrada de texto (un '' | ||
| + | |||
| + | Una pregunta importante: ¿Funcionan todas las combinaciones? | ||
| + | |||
| + | * En el ejemplo de control básico de un marcianito que hemos desarrollado en este módulo, hemos visto que hay un pequeño problema: la imposibilidad de detectar la pulsación de dos teclas a la vez. El efecto de esto es que si queremos que el marcianito se mueva en diagonal, lo conseguiremos pero veremos que lo hace "a saltos" | ||
| + | |||
| + | Además, si esto fuese un juego real existiría otro problema más sutil pero importante: los movimientos no estarían sincronizados con el resto de movimientos de otros elementos del juego. Normalmente los juegos tienen un bucle de ejecución y redibujan todos los elementos del mismo a la vez a intervalos regulares (por ejemplo 40 veces por segundo). Así, cada 25 milisegundos se pinta cada marcianito, asteroide y demás elementos móviles autónomos reflejando su posición. Para los elementos que controla el usuario, si usamos los eventos del teclado, se moverían en un bucle diferente del resto del juego, y no necesariamente coincidente con los intervalos de refresco de los demás elementos. De entrada puede que no lo notásemos, pero generaría problemas y parpadeos indeseados. | ||
| + | |||
| + | Entonces, ¿cómo se solucionan estos problemas si quisiésemos crear un juego con HTML y JavaScript? | ||
| + | |||
| + | La solución consiste en detectar las pulsaciones del teclado, pero **en lugar de procesarlas lo que hacemos es anotarlas en algún otro lugar (en un buffer)**. Es decir, en algún objeto auxiliar se van anotando cada una de las pulsaciones relevantes del teclado que hace el usuario (evento '' | ||
| + | |||
| + | Otra opción, incluso mejor, es anotar la posición de cada marcianito, modificándola en los eventos que se van produciendo, | ||
| + | |||
| + | Como ejercicio especial (no lo hagas si no te ves con fuerzas) te propongo cambiar el código de la página del marcianito por completo y hacerlo siguiendo la técnica que te acabo de explicar. Además deberías crear una clase para almacenar la información del marcianito y así no tener que almacenar su posición (y otros datos que tuviese) en una estructura aparte para poder redibujarla. | ||
| + | |||
| + | <WRAP center round tip 60%> | ||
| + | Nota: De todos modos si estás pensando en hacer un juego en JavaScript es mejor usar alguna biblioteca especializada que ya nos da estas cosas y muchas otras ya hechas (aunque conviene conocer sus fundamentos). Hay infinidad de ellas en el mercado, casi todas gratuitas y Open Source. Por ejemplo [[http:// | ||
| + | </ | ||
| + | |||
| + | En los siguientes módulos del curso vamos a estudiar algunas cuestiones adicionales útiles, pero con lo explicado hasta ahora ya conoces todo lo necesario para poder programar con éxito con JavaScript en cualquier entorno, pero especialmente aplicaciones web de lado cliente basadas en navegadores. Solo es cuestión de práctica y plantearse cosas nuevas con las que experimentar y aprender. En la programación para navegadores es muy importante tener a mano una buena documentación para consulta (como [[http:// | ||
| + | |||
| + | ¡Ah! y muy importante: a quien tiene un martillo todo le parecen clavos, así que trata de acordarte de que muchas de las cosas que se te planteen quizá las puedas conseguir sin necesidad de escribir código (solo con CSS, por ejemplo). Y lo mismo te digo si vienes de jQuery: multitud de cosas sencillas que se tienden a hacer con jQuery por inercia, es posible hacerlas directamente en JavaScript con el mismo esfuerzo, consiguiendo páginas más ligeras y rápidas. ¡No te olvides! | ||
| + | |||
| + | ===== Recursos ===== | ||
| + | |||
| + | * [[https:// | ||
informatica/programacion/cursos/programacion_avanzada_javascript/eventos_navegadores.1728653379.txt.gz · Última modificación: por tempwin
