├── .editorconfig ├── .gitignore ├── 00_basicos.html ├── 01_modulos.html ├── 02_basicos-ejercicios.html ├── 03_asincronia.html ├── 04_nuevos-tipos.html ├── 05_this.html ├── 06_json.html ├── 07_dom.html ├── 08_dom-ejercicios.html ├── 09_ajax.html ├── 10_crud_ajax.html ├── 11_crud_fetch.html ├── 12_crud_axios.html ├── README.md ├── ajax-ejercicios ├── 00_sitio-ajax.html ├── 01_incluir-html.html ├── 02_uploader.html ├── 03_uploader-drag-and-drop.html ├── 04_contact-form.html ├── 05_contact-form-php.html ├── 06_stripe_checkout.html ├── 07_blog-markdown.html ├── 08_api-pokemon.html ├── 09_api-tv-show.html ├── 10_api-canciones.html ├── 11_selects-anidados.html ├── 12_wp-api-rest.html └── assets │ ├── acerca.html │ ├── contacto.html │ ├── footer.html │ ├── header.html │ ├── home.html │ ├── include-html.js │ ├── javascript.md │ ├── send_mail.php │ ├── servicios.html │ ├── stripe-checkout.js │ ├── stripe-keys.js │ ├── stripe-success.html │ ├── tacos-al-pastor.jpg │ ├── tacos-campechanos.jpg │ ├── tacos-de-barbacoa.jpg │ ├── tacos-de-carnitas.jpg │ ├── tacos-de-sesos-y-lengua.jpg │ └── uploader.php ├── assets ├── ajax.png ├── alarma.mp3 ├── db.json ├── loader.svg ├── users.json └── video.mp4 ├── css └── dom-ejercicios.css ├── js ├── ajax.js ├── aritmetica.js ├── constantes.js ├── datos.json ├── dom.js ├── dom │ ├── boton_scroll.js │ ├── carrusel.js │ ├── cuenta_regresiva.js │ ├── deteccion_dispositivos.js │ ├── deteccion_red.js │ ├── deteccion_webcam.js │ ├── filtros_busqueda.js │ ├── geolocalizacion.js │ ├── menu_hamburguesa.js │ ├── narrador.js │ ├── objeto_responsive.js │ ├── prueba_responsive.js │ ├── reconocimiento_voz.js │ ├── reloj.js │ ├── scroll_espia.js │ ├── sorteo.js │ ├── teclado.js │ ├── tema_oscuro.js │ ├── validaciones_formulario.js │ └── video_inteligente.js ├── index_dom.js ├── modulos.js └── no-modulos.js └── reactividad ├── 00_dom-manipulacion.html ├── 01_ui-basada-estado.html ├── 02_reactividad-estado.html ├── 03_estado-inmutable.html ├── 04_componentes-con-estado.html ├── 05_libreria-componentes-con-estado.html └── Component.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | indent_style = space 13 | indent_size = 2 14 | trim_trailing_whitespace = true 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io/api/osx,node,macos,linux,windows,visualstudiocode 2 | 3 | ### Linux ### 4 | *~ 5 | 6 | # temporary files which can be created if a process still has a handle open of a deleted file 7 | .fuse_hidden* 8 | 9 | # KDE directory preferences 10 | .directory 11 | 12 | # Linux trash folder which might appear on any partition or disk 13 | .Trash-* 14 | 15 | # .nfs files are created when an open file is removed but is still being accessed 16 | .nfs* 17 | 18 | ### macOS ### 19 | *.DS_Store 20 | .AppleDouble 21 | .LSOverride 22 | 23 | # Icon must end with two \r 24 | Icon 25 | 26 | # Thumbnails 27 | ._* 28 | 29 | # Files that might appear in the root of a volume 30 | .DocumentRevisions-V100 31 | .fseventsd 32 | .Spotlight-V100 33 | .TemporaryItems 34 | .Trashes 35 | .VolumeIcon.icns 36 | .com.apple.timemachine.donotpresent 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | 45 | ### Node ### 46 | # Logs 47 | logs 48 | *.log 49 | npm-debug.log* 50 | yarn-debug.log* 51 | yarn-error.log* 52 | 53 | # Runtime data 54 | pids 55 | *.pid 56 | *.seed 57 | *.pid.lock 58 | 59 | # Directory for instrumented libs generated by jscoverage/JSCover 60 | lib-cov 61 | 62 | # Coverage directory used by tools like istanbul 63 | coverage 64 | 65 | # nyc test coverage 66 | .nyc_output 67 | 68 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 69 | .grunt 70 | 71 | # Bower dependency directory (https://bower.io/) 72 | bower_components 73 | 74 | # node-waf configuration 75 | .lock-wscript 76 | 77 | # Compiled binary addons (http://nodejs.org/api/addons.html) 78 | build/Release 79 | 80 | # Dependency directories 81 | node_modules/ 82 | jspm_packages/ 83 | 84 | # Typescript v1 declaration files 85 | typings/ 86 | 87 | # Optional npm cache directory 88 | .npm 89 | 90 | # Optional eslint cache 91 | .eslintcache 92 | 93 | # Optional REPL history 94 | .node_repl_history 95 | 96 | # Output of 'npm pack' 97 | *.tgz 98 | 99 | # Yarn Integrity file 100 | .yarn-integrity 101 | 102 | # dotenv environment variables file 103 | .env 104 | 105 | 106 | ### OSX ### 107 | 108 | # Icon must end with two \r 109 | 110 | # Thumbnails 111 | 112 | # Files that might appear in the root of a volume 113 | 114 | # Directories potentially created on remote AFP share 115 | 116 | ### VisualStudioCode ### 117 | .vscode/* 118 | !.vscode/settings.json 119 | !.vscode/tasks.json 120 | !.vscode/launch.json 121 | !.vscode/extensions.json 122 | 123 | ### Windows ### 124 | # Windows thumbnail cache files 125 | Thumbs.db 126 | ehthumbs.db 127 | ehthumbs_vista.db 128 | 129 | # Folder config file 130 | Desktop.ini 131 | 132 | # Recycle Bin used on file shares 133 | $RECYCLE.BIN/ 134 | 135 | # Windows Installer files 136 | *.cab 137 | *.msi 138 | *.msm 139 | *.msp 140 | 141 | # Windows shortcuts 142 | *.lnk 143 | 144 | # End of https://www.gitignore.io/api/osx,node,macos,linux,windows,visualstudiocode 145 | -------------------------------------------------------------------------------- /00_basicos.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Fundamentos JavaScript 8 | 9 | 10 | 11 |

Fundamentos JavaScript

12 | 1218 | 1219 | 1220 | 1221 | -------------------------------------------------------------------------------- /01_modulos.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Módulos en JavaScript 8 | 9 | 10 | 11 |

Módulos en JavaScript

12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /02_basicos-ejercicios.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Ejercicios de Programación en JavaScript 8 | 9 | 10 | 11 |

Ejercicios de Programación en JavaScript

12 | 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /03_asincronia.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Asíncronía en JavaScript 8 | 9 | 10 | 11 |

Asíncronía en JavaScript

12 | 264 | 265 | 266 | 267 | -------------------------------------------------------------------------------- /04_nuevos-tipos.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Nuevos Tipos de Datos en JavaScript 8 | 9 | 10 | 11 |

Nuevos Tipos de Datos en JavaScript

12 | 341 | 342 | 343 | 344 | -------------------------------------------------------------------------------- /05_this.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | this en JavaScript 8 | 9 | 10 | 11 |

this en JavaScript

12 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /06_json.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | JSON JavaScript Object Notation 8 | 9 | 10 | 11 |

JSON JavaScript Object Notation

12 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /07_dom.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | WEB APIs 8 | 63 | 64 | 65 | 66 |

WEB APIs

67 |

DOM: Document Object Model

68 |

BOM: Browser Object Model

69 |

CSSOM: CSS Object Model

70 |

WEB APIs

71 | 84 |
85 |
86 |
87 |

Manejo del DOM

88 |

89 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Quidem, laboriosam cum quod, perferendis eveniet pariatur 90 | facere doloribus adipisci consequatur totam est dolorum vero nisi voluptate porro explicabo quo necessitatibus 91 | blanditiis. 92 |

93 | 102 | 103 | DOM 105 |
106 |
107 | Tech 108 |
Tech
109 |
110 |
111 | Animals 112 |
Animals
113 |
114 |
115 | Architecture 116 |
Architecture
117 |
118 |
119 | People 120 |
People
121 |
122 |
123 | Nature 124 |
Nature
125 |
126 |
127 | 133 |

Eventos en JavaScript

134 |

Manejadores de Eventos

135 | 136 |

137 | 138 |

139 | 140 |

141 | 142 |

Flujo de Eventos

143 |
144 |
145 | 1 146 |
147 | 2 148 |
149 | 3 150 |
151 | jonmircha.com 152 |
153 |
154 |
155 |
156 |

Manejo del BOM

157 | 158 |

159 | 160 |

161 | 162 |

163 | 164 | 165 | 166 | 167 | -------------------------------------------------------------------------------- /08_dom-ejercicios.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Ejercicios del DOM 8 | 9 | 10 | 11 | 12 | 13 |
14 |

Ejercicios del DOM

15 |
16 | 21 | 40 |
41 |
42 |

Reloj Digital y Alarma Sonora

43 |
44 |
45 | 46 | 47 | 48 | 49 |
50 |
51 |
52 |

Eventos del Teclado

53 |
54 |
55 |
56 |
57 |
58 |

Cuenta Regresiva

59 |
60 |
61 |
62 |

Responsive con JavaScript

63 |
64 |
65 |
66 |
67 |

Responsive Tester

68 |
69 | 70 |
71 | 72 |
73 | 74 |
75 | 76 | 77 |
78 |
79 |
80 |

Detección de Dispositivos
(User Agent)

81 |
82 |
83 |
84 |

Detección de la conexión

85 |
86 |
87 |

Detección de la cámara web

88 | 89 |
90 |
91 |

Geolocalización

92 |
93 |
94 |
95 |

Filtros de Búsquedas

96 | 97 |
98 |
99 | Nature 100 |
Nature
101 |
102 |
103 | Any 104 |
Any
105 |
106 |
107 | Tech 108 |
Tech
109 |
110 |
111 | Animals 112 |
Animals
113 |
114 |
115 | People 116 |
People
117 |
118 |
119 | Architecture 120 |
Architecture
121 |
122 |
123 |
124 |
125 |

Sorteo Digital

126 | 138 | 139 |
140 |
141 |

Responsive Slider

142 |
143 |
144 |
145 | animals 146 |
147 |
148 |

2

149 |

Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias, quidem voluptate aperiam quasi animi, 150 | ex earum iure tenetur ad corporis saepe exercitationem ab doloribus tempore consequuntur. Minus nostrum 151 | blanditiis dolore.

152 |
153 |
154 | nature
155 |
156 |

4

157 |

Lorem ipsum dolor sit amet consectetur adipisicing elit. Accusamus perferendis totam enim quam vel veniam 158 | impedit rem quod laboriosam, maxime illo asperiores, illum eius. Nam libero quas ipsum et esse.

159 |
160 |
161 |
162 | 163 |
164 |
165 |
166 |
167 |

Video Inteligente

168 | 169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 | 190 |
191 |
192 |

Validaciones de Formulario

193 |
194 | Envíanos tus comentarios 195 | 197 | 199 | 200 | 202 | 203 |
204 | Cargando 205 |
206 |
207 |

Los datos han sido enviados

208 |
209 |
210 |
211 |
212 |

Narrador

213 | 216 |

217 | 218 |

219 | 220 |
221 |
222 | 223 | 224 | 225 | 226 | 227 | 228 | -------------------------------------------------------------------------------- /09_ajax.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | AJAX: Asynchronous JavaScript & XML 8 | 9 | 10 | 11 |

AJAX: Asynchronous JavaScript & XML

12 |

13 | AJAX significa Asynchronous JavaScript And XML. En pocas palabras, es el uso del objeto 14 | XMLHttpRequest para comunicarse con los servidores. 15 |

16 |

17 | Puede enviar y recibir información en varios formatos, incluidos 18 | JSON, XML, HTML y archivos de texto. 19 |

20 |

21 | El atractivo de AJAX es 22 | su naturaleza "asíncrona", lo que significa que puede comunicarse con el servidor, intercambiar datos y 23 | actualizar la página sin tener que recargar el navegador. 24 |

25 | AJAX 26 |

Métodos Nativos

27 | 41 |

Librerías Externas

42 | 53 |

54 | Ajax no es una tecnología en sí mismo. En realidad, se trata de varias tecnologías independientes que se unen: 55 |

56 | 83 |

Objeto XMLHttpRequest

84 |
    85 |

    API Fetch

    86 |
      87 |

      API Fetch + Async-Await

      88 |
        89 |

        Axios

        90 |
          91 |

          Axios + Async-Await

          92 |
            93 |
            94 |
            95 |
            96 |
            97 |
            98 |
            99 |
            100 |
            101 |
            102 |
            103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /10_crud_ajax.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | CRUD API REST AJAX 8 | 9 | 10 | 11 |

            CRUD API REST AJAX

            12 |
            13 |
            14 |

            Agregar Santo

            15 |
            16 | 17 |
            18 | 19 |
            20 | 21 | 22 |
            23 |
            24 |
            25 |

            Ver Santos

            26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
            NombreConstelaciónAcciones
            36 |
            37 |
            38 | 48 | 163 | 164 | 165 | 166 | -------------------------------------------------------------------------------- /11_crud_fetch.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | CRUD API REST FETCH 8 | 9 | 10 | 11 |

            CRUD API REST FETCH

            12 |
            13 |
            14 |

            Agregar Santo

            15 |
            16 | 17 |
            18 | 19 |
            20 | 21 | 22 |
            23 |
            24 |
            25 |

            Ver Santos

            26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
            NombreConstelaciónAcciones
            36 |
            37 |
            38 | 48 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /12_crud_axios.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | CRUD API REST AXIOS 8 | 9 | 10 | 11 |

            CRUD API REST AXIOS

            12 |
            13 |
            14 |

            Agregar Santo

            15 |
            16 | 17 |
            18 | 19 |
            20 | 21 | 22 |
            23 |
            24 |
            25 |

            Ver Santos

            26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
            NombreConstelaciónAcciones
            36 |
            37 |
            38 | 48 | 49 | 169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Curso JavaScript 2 | 3 | En este repositorio encontrarás los recursos para seguir el [Curso de _JavaScript_](https://www.youtube.com/playlist?list=PLvq-jIkSeTUZ6QgYYO3MwG9EMqC-KoLXA) de [Jonathan MirCha](https://jonmircha.com/). 4 | 5 | Recuerda que si quieres mantenerte al tanto de todas las actualizaciones de este curso puedes ingresar al sitio [aprendejavascript.org](https://aprendejavascript.org/). 6 | 7 | Este repositorio incluye: 8 | 9 | - Toda la estructura de archivos y carpetas que usarás en el curso. 10 | - Todos los códigos y recursos ajenos a _JavaScript_ para hacer el curso como imágenes, archivos _HTML_, _CSS_, _PHP_, _JSON_, etc. 11 | - Todo el código _JavaScript_ de las clases teóricas. 12 | 13 | Este repositorio **NO** incluye: 14 | 15 | - El código _JavaScript_ de los ejercicios prácticos, ¿Porqué no? Por qué ese código lo generarás tú cuando te pongas a hacer los ejercicios propuestos en el curso. 16 | 17 | ## Repositorio _PREMIUM_ 18 | 19 | Adicionalmente a este repositorio por una pequeña aportación puedes acceder a: 20 | 21 | - Toda la teoría referente a este curso que encuentras en mi [blog](https://jonmircha.com/blog) en formato _MarkDown_. 22 | - El código _JavaScript_ que da solución a los ejercicios propuestos en el curso. 23 | - Puedes adquirir el repositorio _PREMIUM_ [aquí](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6B6FCUL4SKSJN). 24 | 25 | ## Mis Redes Sociales 26 | 27 | - 🔔 Suscríbete al canal https://youtube.com/jonmircha?sub_confirmation=1 🤓 28 | - 👉 Visita mi sitio web https://jonmircha.com/ 💻 29 | - 🌮 ¿Me invítas un taco? https://www.paypal.me/jonmircha 30 | -------------------------------------------------------------------------------- /ajax-ejercicios/00_sitio-ajax.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Sitio con AJAX 8 | 75 | 76 | 77 | 78 |
            79 |
            80 | 83 | 89 |
            90 |
            91 |
            92 | 97 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /ajax-ejercicios/01_incluir-html.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Incluir HTML con AJAX 8 | 75 | 76 | 77 | 78 | 79 |
            80 |
            81 |
            82 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /ajax-ejercicios/02_uploader.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Uploader con AJAX 8 | 38 | 39 | 40 | 41 |
            42 | 43 |
            44 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /ajax-ejercicios/03_uploader-drag-and-drop.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Uploader Drag & Drop con AJAX 8 | 69 | 70 | 71 | 72 |
            73 |
            74 |

            Arrastra y suelta tus archivos...

            75 |
            76 |
            77 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /ajax-ejercicios/04_contact-form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Envío de Formulario con Fetch y FormSubmit 8 | 105 | 106 | 107 | 108 |
            109 | Envíanos tus comentarios 110 | 112 | 114 | 115 | 117 | 118 |
            119 | Cargando 120 |
            121 |
            122 |

            Los datos han sido enviados

            123 |
            124 |
            125 | 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /ajax-ejercicios/05_contact-form-php.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Envío de Formulario con Fetch y PHP 8 | 105 | 106 | 107 | 108 |
            109 | Envíanos tus comentarios 110 | 112 | 114 | 115 | 117 | 118 |
            119 | Cargando 120 |
            121 |
            122 |

            Los datos han sido enviados

            123 |
            124 |
            125 | 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /ajax-ejercicios/06_stripe_checkout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Checkout con Stripe 8 | 54 | 55 | 56 | 57 |

            Checkout con Stripe

            58 |
            59 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /ajax-ejercicios/07_blog-markdown.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Blog con Markdown y Showdown.js 8 | 9 | 10 | 11 |

            Blog con Markdown y Showdown.js

            12 |
            13 | 14 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /ajax-ejercicios/08_api-pokemon.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Pokémons 8 | 24 | 25 | 26 | 27 |

            Pokémons

            28 | 29 |
            30 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /ajax-ejercicios/09_api-tv-show.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Buscador Shows de TV 8 | 19 | 20 | 21 | 22 |

            Buscador Shows de TV

            23 | 24 |
            25 | 33 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /ajax-ejercicios/10_api-canciones.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Buscador de Canciones 8 | 43 | 44 | 45 | 46 |

            Buscador de Canciones

            47 | 54 | Cargando... 55 | 56 |
            57 |
            58 |
            59 |
            60 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /ajax-ejercicios/11_selects-anidados.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Selects Anidados 8 | 9 | 10 | 11 |

            Selects Anidados

            12 |

            México

            13 | 14 | 17 |

            18 | 19 | 22 |

            23 | 24 | 27 |

            28 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ajax-ejercicios/12_wp-api-rest.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | WordPress REST API 8 | 9 | 98 | 99 | 100 | 101 |

            WordPress REST API

            102 |
            103 |
            104 | Cargando... 105 | 124 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/acerca.html: -------------------------------------------------------------------------------- 1 |

            Contenido de la sección Acerca

            2 |

            3 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur voluptates nihil fugit eos iusto quos numquam 4 | perspiciatis, ullam sed nisi vero illo, officia autem ratione ducimus praesentium fugiat, quaerat nulla. 5 |

            6 | People 7 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/contacto.html: -------------------------------------------------------------------------------- 1 |

            Contenido de la sección Contacto

            2 |

            3 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur voluptates nihil fugit eos iusto quos numquam 4 | perspiciatis, ullam sed nisi vero illo, officia autem ratione ducimus praesentium fugiat, quaerat nulla. 5 |

            6 | Tech 7 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/footer.html: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/header.html: -------------------------------------------------------------------------------- 1 |
            2 |
            3 | 6 | 12 |
            13 |
            14 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/home.html: -------------------------------------------------------------------------------- 1 |

            Contenido del Home

            2 |

            3 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur voluptates nihil fugit eos iusto quos numquam 4 | perspiciatis, ullam sed nisi vero illo, officia autem ratione ducimus praesentium fugiat, quaerat nulla. 5 |

            6 | Animals 7 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/include-html.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 123. Ejercicios AJAX - APIs: Incluir archivos HTML (include-html.js) - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/javascript.md: -------------------------------------------------------------------------------- 1 | # JavaScript 2 | 3 | ## Isomorfismo 4 | 5 | Hoy _JavaScript_, es el único lenguaje capaz de ejecutarse en las 3 capas de una aplicación: 6 | 7 | 1. _Frontend_ (con _JavaScript_). 8 | 1. _Backend_ (con _Node.js_). 9 | 1. Persistencia de Datos (con _MongoDB_, _Couch DB_, _Firebase_, etc). 10 | 11 | Con JavaScript puedes: 12 | 13 | - Diseño y Desarrollo Web. 14 | - Hacer Videojuegos. 15 | - Experiencias _3D_, Realidad Aumentada, Realidad Virtual. 16 | - Controlar _Hardware_ (drones, _robots_, electrodomésticos, _wearables_, etc). 17 | - Aplicaciones Híbridas y Móviles. 18 | - Aprendizaje Automático. 19 | - etc. 20 | 21 | --- 22 | 23 | ## _JavaScript_ NO es _JAVA_ 24 | 25 | ![Esto es JavaScript](https://jonmircha.com/img/blog/this-is-javascript.jpg) 26 | ![JavaScript vs JAVA](https://jonmircha.com/img/blog/jsvsjava.jpg) 27 | ![JavaScript vs JAVA](https://jonmircha.com/img/blog/java-vs-javascript.jpg) 28 | 29 | --- 30 | 31 | ## Características 32 | 33 | - Lenguaje de Alto Nivel. 34 | - Interpretado. 35 | - Dinámico. 36 | - Débilmente Tipado. 37 | - Multi paradigma. 38 | - Sensible a MAYÚSCULAS y minúsculas. 39 | - No necesitas los puntos y comas al final de cada línea. 40 | 41 | --- 42 | 43 | ## Escritura de código 44 | 45 | Los **identificadores** deben comenzar con: 46 | 47 | - Una letra o 48 | - Un signo de dolar **\$** o 49 | - Un guión bajo **\_** 50 | - Nunca con números o caracteres especiales. 51 | 52 | Usa **snake_case** en: 53 | 54 | - Nombre de archivos: 55 | 56 | ```js 57 | mi_archivo_javascript.js; 58 | ``` 59 | 60 | Usa **UPPER_CASE** en: 61 | 62 | - Constantes: 63 | 64 | ```js 65 | const UNA_CONSTANTE = "Soy una constante", 66 | PI = 3.141592653589793; 67 | ``` 68 | 69 | Usa **UpperCamelCase** en: 70 | 71 | - Clases: 72 | 73 | ```js 74 | class SerHumano { 75 | constructor(nombre, genero) { 76 | this.nombre = nombre; 77 | this.genero = genero; 78 | } 79 | 80 | miNombreEs() { 81 | return `Mi nombre es ${this.nombre}`; 82 | } 83 | } 84 | ``` 85 | 86 | Usa **lowerCamelCase** en: 87 | 88 | - Objetos: 89 | 90 | ```js 91 | const unObjeto = { 92 | nombre: "Jonathan", 93 | email: "jonmircha@gmail.com", 94 | }; 95 | ``` 96 | 97 | - Primitivos: 98 | 99 | ```js 100 | let unaCadena = "Hola Mundo", 101 | unNumero = 19, 102 | unBoolean = true; 103 | ``` 104 | 105 | - Funciones: 106 | 107 | ```js 108 | function holaMundo(nombre) { 109 | alert(`Hola mundo ${nombre}`); 110 | } 111 | holaMundo("Jonathan"); 112 | ``` 113 | 114 | - Instancias: 115 | 116 | ```js 117 | const ajax = new XMLHttpRequest(), 118 | jon = new SerHumano("Jonathan", "Hombre"); 119 | ``` 120 | 121 | --- 122 | 123 | ## Palabras reservadas 124 | 125 | ```js 126 | A: abstract 127 | B: boolean, break, byte 128 | C: case, catch, char, class, const, continue 129 | D: debugger, default, delete, do, double 130 | E: else, enum, export, extends 131 | F: false, final, finally, float, for, function 132 | G: goto 133 | I: if, implements, import, in, instanceof, int, interface 134 | L: long 135 | N: native, new, null 136 | P: package, private, protected, public 137 | R: return 138 | S: short, static, super, switch, synchronized 139 | T: this, throw, throws, transient, true, try, typeof 140 | V: var, volatile, void 141 | W: while, with 142 | ``` 143 | 144 | --- 145 | 146 | ## Ordenamiento de código 147 | 148 | 1. **IMPORTACIÓN DE MÓDULOS.** 149 | 1. **DECLARACIÓN DE VARIABLES.** 150 | 1. **DECLARACIÓN DE FUNCIONES.** 151 | 1. **EJECUCIÓN DE CÓDIGO.** 152 | 153 | --- 154 | 155 | ## Tipos de datos en _JavaScript_ 156 | 157 | **Primitivos**: Se accede directamente al valor. 158 | 159 | - string 160 | - number 161 | - boolean 162 | - null 163 | - undefined 164 | - NaN 165 | 166 | **Compuestos**: Se accede a la referencia del valor. 167 | 168 | - object = {} 169 | - array = [] 170 | - function () { } 171 | - Class {} 172 | - etc. 173 | 174 | --- 175 | 176 | ## Aprende _JavaScript_ ¡GRATIS! 177 | 178 | Si estás interesado en aprender _JavaScript_ desde las bases hasta un nivel que te permita obtener tu primer trabajo o empleo como programador _web_ te invito a que veas mi **Curso de _JavaScript_** totalmente **gratuito** en mi [canal de _YouTube_](https://youtube.com/jonmircha?sub_confirmation=1). 179 | 180 | En mi curso aprenderás: Sintaxis, Gramática, Lógica, _EcmaScript_, Programación Orientada a Objetos, Asincronía, _DOM_, _AJAX_, _JSON_, Consumo de _API's_, _Node_ y mucho más. 181 | 182 | **¡¡¡Accede ya!!!** 183 | 184 | [Ver Curso](https://www.youtube.com/playlist?list=PLvq-jIkSeTUZ6QgYYO3MwG9EMqC-KoLXA) 185 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/send_mail.php: -------------------------------------------------------------------------------- 1 | 15 | Datos enviados desde el formulario del sitio $domain 16 |

            17 | 23 | "; 24 | $headers = "MIME-Version: 1.0\r\n" . "Content-Type: text/html; charset=utf-8\r\n" . "From: Envío Automático No Responder "; 25 | 26 | $send_mail = mail($to, $subject_mail, $message, $headers); 27 | 28 | if($send_mail) { 29 | $res = [ 30 | "err" => false, 31 | "message" => "Tus datos han sido enviados" 32 | ]; 33 | } else { 34 | $res = [ 35 | "err" => true, 36 | "message" => "Error al enviar tus datos. Intenta nuevamente." 37 | ]; 38 | } 39 | 40 | //header("Access-Control-Allow-Origin: https://jonmircha.com"); 41 | header("Access-Control-Allow-Origin: *"); 42 | header( 'Content-type: application/json' ); 43 | echo json_encode($res); 44 | exit; 45 | } 46 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/servicios.html: -------------------------------------------------------------------------------- 1 |

            Contenido de la sección Servicios

            2 |

            3 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur voluptates nihil fugit eos iusto quos numquam 4 | perspiciatis, ullam sed nisi vero illo, officia autem ratione ducimus praesentium fugiat, quaerat nulla. 5 |

            6 | Nature 7 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/stripe-checkout.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 129. Ejercicios AJAX - APIs: Pagos Online con Fetch y Stripe (1/4) - #jonmircha ********** */ 2 | /* ********** Curso JavaScript: 130. Ejercicios AJAX - APIs: Pagos Online con Fetch y Stripe (2/4) - #jonmircha ********** */ 3 | /* ********** Curso JavaScript: 131. Ejercicios AJAX - APIs: Pagos Online con Fetch y Stripe (3/4) - #jonmircha ********** */ 4 | /* ********** Curso JavaScript: 132. Ejercicios AJAX - APIs: Pagos Online con Fetch y Stripe (4/4) - #jonmircha ********** */ 5 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/stripe-keys.js: -------------------------------------------------------------------------------- 1 | export default { 2 | public: "Your Public Key", 3 | secret: "Your Secret Key", 4 | }; 5 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/stripe-success.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Pago exitoso con Stripe 8 | 9 | 10 | 11 |

            Pago exitoso con Stripe

            12 |

            Gracias por la orden de Tacos 🌮😋

            13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /ajax-ejercicios/assets/tacos-al-pastor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmircha/youtube-js/6faa0d14151a242f56045d320a87a81e412115d6/ajax-ejercicios/assets/tacos-al-pastor.jpg -------------------------------------------------------------------------------- /ajax-ejercicios/assets/tacos-campechanos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmircha/youtube-js/6faa0d14151a242f56045d320a87a81e412115d6/ajax-ejercicios/assets/tacos-campechanos.jpg -------------------------------------------------------------------------------- /ajax-ejercicios/assets/tacos-de-barbacoa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmircha/youtube-js/6faa0d14151a242f56045d320a87a81e412115d6/ajax-ejercicios/assets/tacos-de-barbacoa.jpg -------------------------------------------------------------------------------- /ajax-ejercicios/assets/tacos-de-carnitas.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmircha/youtube-js/6faa0d14151a242f56045d320a87a81e412115d6/ajax-ejercicios/assets/tacos-de-carnitas.jpg -------------------------------------------------------------------------------- /ajax-ejercicios/assets/tacos-de-sesos-y-lengua.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmircha/youtube-js/6faa0d14151a242f56045d320a87a81e412115d6/ajax-ejercicios/assets/tacos-de-sesos-y-lengua.jpg -------------------------------------------------------------------------------- /ajax-ejercicios/assets/uploader.php: -------------------------------------------------------------------------------- 1 | false, 15 | "status" => http_response_code(200), 16 | "statusText" => "Archivo $name subido con éxito", 17 | "files" => $_FILES["file"] 18 | ); 19 | } else { 20 | $res = array( 21 | "err" => true, 22 | "status" => http_response_code(400), 23 | "statusText" => "Error al subir el archivo $name", 24 | "files" => $_FILES["file"] 25 | ); 26 | } 27 | 28 | echo json_encode($res); 29 | } 30 | -------------------------------------------------------------------------------- /assets/ajax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmircha/youtube-js/6faa0d14151a242f56045d320a87a81e412115d6/assets/ajax.png -------------------------------------------------------------------------------- /assets/alarma.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmircha/youtube-js/6faa0d14151a242f56045d320a87a81e412115d6/assets/alarma.mp3 -------------------------------------------------------------------------------- /assets/db.json: -------------------------------------------------------------------------------- 1 | { 2 | "santos": [ 3 | { 4 | "id": 1, 5 | "nombre": "Seiya", 6 | "constelacion": "Pegaso" 7 | }, 8 | { 9 | "id": 2, 10 | "nombre": "Shiryu", 11 | "constelacion": "Dragón" 12 | }, 13 | { 14 | "id": 3, 15 | "nombre": "Hyoga", 16 | "constelacion": "Cisne" 17 | }, 18 | { 19 | "id": 4, 20 | "nombre": "Shun", 21 | "constelacion": "Andrómeda" 22 | }, 23 | { 24 | "id": 5, 25 | "nombre": "Ikki", 26 | "constelacion": "Fénix" 27 | }, 28 | { 29 | "nombre": "Mü", 30 | "constelacion": "Aries", 31 | "id": 6 32 | }, 33 | { 34 | "nombre": "Aldebaran", 35 | "constelacion": "Tauro", 36 | "id": 7 37 | }, 38 | { 39 | "nombre": "Saga", 40 | "constelacion": "Geminis", 41 | "id": 8 42 | }, 43 | { 44 | "nombre": "Máscara de Muerte", 45 | "constelacion": "Cancer", 46 | "id": 9 47 | }, 48 | { 49 | "nombre": "Aioria", 50 | "constelacion": "Leo", 51 | "id": 10 52 | }, 53 | { 54 | "nombre": "Shaka", 55 | "constelacion": "Virgo", 56 | "id": 11 57 | }, 58 | { 59 | "nombre": "Dohko", 60 | "constelacion": "Libra", 61 | "id": 12 62 | } 63 | ], 64 | "dioses": [ 65 | { 66 | "id": 1, 67 | "nombre": "Athena", 68 | "de": "Tierra" 69 | }, 70 | { 71 | "id": 2, 72 | "nombre": "Poseidón", 73 | "de": "Mar" 74 | }, 75 | { 76 | "id": 3, 77 | "nombre": "Hades", 78 | "de": "Inframundo" 79 | }, 80 | { 81 | "id": 4, 82 | "nombre": "Zeus", 83 | "de": "Cielo" 84 | } 85 | ] 86 | } 87 | -------------------------------------------------------------------------------- /assets/loader.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /assets/users.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "name": "Leanne Graham", 5 | "username": "Bret", 6 | "email": "Sincere@april.biz", 7 | "address": { 8 | "street": "Kulas Light", 9 | "suite": "Apt. 556", 10 | "city": "Gwenborough", 11 | "zipcode": "92998-3874", 12 | "geo": { 13 | "lat": "-37.3159", 14 | "lng": "81.1496" 15 | } 16 | }, 17 | "phone": "1-770-736-8031 x56442", 18 | "website": "hildegard.org", 19 | "company": { 20 | "name": "Romaguera-Crona", 21 | "catchPhrase": "Multi-layered client-server neural-net", 22 | "bs": "harness real-time e-markets" 23 | } 24 | }, 25 | { 26 | "id": 2, 27 | "name": "Ervin Howell", 28 | "username": "Antonette", 29 | "email": "Shanna@melissa.tv", 30 | "address": { 31 | "street": "Victor Plains", 32 | "suite": "Suite 879", 33 | "city": "Wisokyburgh", 34 | "zipcode": "90566-7771", 35 | "geo": { 36 | "lat": "-43.9509", 37 | "lng": "-34.4618" 38 | } 39 | }, 40 | "phone": "010-692-6593 x09125", 41 | "website": "anastasia.net", 42 | "company": { 43 | "name": "Deckow-Crist", 44 | "catchPhrase": "Proactive didactic contingency", 45 | "bs": "synergize scalable supply-chains" 46 | } 47 | }, 48 | { 49 | "id": 3, 50 | "name": "Clementine Bauch", 51 | "username": "Samantha", 52 | "email": "Nathan@yesenia.net", 53 | "address": { 54 | "street": "Douglas Extension", 55 | "suite": "Suite 847", 56 | "city": "McKenziehaven", 57 | "zipcode": "59590-4157", 58 | "geo": { 59 | "lat": "-68.6102", 60 | "lng": "-47.0653" 61 | } 62 | }, 63 | "phone": "1-463-123-4447", 64 | "website": "ramiro.info", 65 | "company": { 66 | "name": "Romaguera-Jacobson", 67 | "catchPhrase": "Face to face bifurcated interface", 68 | "bs": "e-enable strategic applications" 69 | } 70 | }, 71 | { 72 | "id": 4, 73 | "name": "Patricia Lebsack", 74 | "username": "Karianne", 75 | "email": "Julianne.OConner@kory.org", 76 | "address": { 77 | "street": "Hoeger Mall", 78 | "suite": "Apt. 692", 79 | "city": "South Elvis", 80 | "zipcode": "53919-4257", 81 | "geo": { 82 | "lat": "29.4572", 83 | "lng": "-164.2990" 84 | } 85 | }, 86 | "phone": "493-170-9623 x156", 87 | "website": "kale.biz", 88 | "company": { 89 | "name": "Robel-Corkery", 90 | "catchPhrase": "Multi-tiered zero tolerance productivity", 91 | "bs": "transition cutting-edge web services" 92 | } 93 | }, 94 | { 95 | "id": 5, 96 | "name": "Chelsey Dietrich", 97 | "username": "Kamren", 98 | "email": "Lucio_Hettinger@annie.ca", 99 | "address": { 100 | "street": "Skiles Walks", 101 | "suite": "Suite 351", 102 | "city": "Roscoeview", 103 | "zipcode": "33263", 104 | "geo": { 105 | "lat": "-31.8129", 106 | "lng": "62.5342" 107 | } 108 | }, 109 | "phone": "(254)954-1289", 110 | "website": "demarco.info", 111 | "company": { 112 | "name": "Keebler LLC", 113 | "catchPhrase": "User-centric fault-tolerant solution", 114 | "bs": "revolutionize end-to-end systems" 115 | } 116 | }, 117 | { 118 | "id": 6, 119 | "name": "Mrs. Dennis Schulist", 120 | "username": "Leopoldo_Corkery", 121 | "email": "Karley_Dach@jasper.info", 122 | "address": { 123 | "street": "Norberto Crossing", 124 | "suite": "Apt. 950", 125 | "city": "South Christy", 126 | "zipcode": "23505-1337", 127 | "geo": { 128 | "lat": "-71.4197", 129 | "lng": "71.7478" 130 | } 131 | }, 132 | "phone": "1-477-935-8478 x6430", 133 | "website": "ola.org", 134 | "company": { 135 | "name": "Considine-Lockman", 136 | "catchPhrase": "Synchronised bottom-line interface", 137 | "bs": "e-enable innovative applications" 138 | } 139 | }, 140 | { 141 | "id": 7, 142 | "name": "Kurtis Weissnat", 143 | "username": "Elwyn.Skiles", 144 | "email": "Telly.Hoeger@billy.biz", 145 | "address": { 146 | "street": "Rex Trail", 147 | "suite": "Suite 280", 148 | "city": "Howemouth", 149 | "zipcode": "58804-1099", 150 | "geo": { 151 | "lat": "24.8918", 152 | "lng": "21.8984" 153 | } 154 | }, 155 | "phone": "210.067.6132", 156 | "website": "elvis.io", 157 | "company": { 158 | "name": "Johns Group", 159 | "catchPhrase": "Configurable multimedia task-force", 160 | "bs": "generate enterprise e-tailers" 161 | } 162 | }, 163 | { 164 | "id": 8, 165 | "name": "Nicholas Runolfsdottir V", 166 | "username": "Maxime_Nienow", 167 | "email": "Sherwood@rosamond.me", 168 | "address": { 169 | "street": "Ellsworth Summit", 170 | "suite": "Suite 729", 171 | "city": "Aliyaview", 172 | "zipcode": "45169", 173 | "geo": { 174 | "lat": "-14.3990", 175 | "lng": "-120.7677" 176 | } 177 | }, 178 | "phone": "586.493.6943 x140", 179 | "website": "jacynthe.com", 180 | "company": { 181 | "name": "Abernathy Group", 182 | "catchPhrase": "Implemented secondary concept", 183 | "bs": "e-enable extensible e-tailers" 184 | } 185 | }, 186 | { 187 | "id": 9, 188 | "name": "Glenna Reichert", 189 | "username": "Delphine", 190 | "email": "Chaim_McDermott@dana.io", 191 | "address": { 192 | "street": "Dayna Park", 193 | "suite": "Suite 449", 194 | "city": "Bartholomebury", 195 | "zipcode": "76495-3109", 196 | "geo": { 197 | "lat": "24.6463", 198 | "lng": "-168.8889" 199 | } 200 | }, 201 | "phone": "(775)976-6794 x41206", 202 | "website": "conrad.com", 203 | "company": { 204 | "name": "Yost and Sons", 205 | "catchPhrase": "Switchable contextually-based project", 206 | "bs": "aggregate real-time technologies" 207 | } 208 | }, 209 | { 210 | "id": 10, 211 | "name": "Clementina DuBuque", 212 | "username": "Moriah.Stanton", 213 | "email": "Rey.Padberg@karina.biz", 214 | "address": { 215 | "street": "Kattie Turnpike", 216 | "suite": "Suite 198", 217 | "city": "Lebsackbury", 218 | "zipcode": "31428-2261", 219 | "geo": { 220 | "lat": "-38.2386", 221 | "lng": "57.2232" 222 | } 223 | }, 224 | "phone": "024-648-3804", 225 | "website": "ambrose.net", 226 | "company": { 227 | "name": "Hoeger LLC", 228 | "catchPhrase": "Centralized empowering task-force", 229 | "bs": "target end-to-end models" 230 | } 231 | } 232 | ] 233 | -------------------------------------------------------------------------------- /assets/video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmircha/youtube-js/6faa0d14151a242f56045d320a87a81e412115d6/assets/video.mp4 -------------------------------------------------------------------------------- /css/dom-ejercicios.css: -------------------------------------------------------------------------------- 1 | /* ********** Reset CSS ********** */ 2 | :root { 3 | --main-font: sans-serif; 4 | --font-size: 16px; 5 | --main-color: #f7df1e; 6 | --second-color: #222; 7 | --main-modal-color: rgba(247, 222, 30, 0.85); 8 | --second-modal-color: rgba(34, 34, 34, 0.85); 9 | --container-width: 1200px; 10 | } 11 | 12 | html { 13 | box-sizing: border-box; 14 | font-family: var(--main-font); 15 | font-size: var(--font-size); 16 | scroll-behavior: smooth; 17 | } 18 | 19 | *, 20 | *:before, 21 | *:after { 22 | box-sizing: inherit; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | overflow-x: hidden; 28 | } 29 | 30 | img, 31 | video { 32 | max-width: 100%; 33 | height: auto; 34 | } 35 | 36 | .flex-row-center { 37 | display: flex; 38 | justify-content: center; 39 | align-items: center; 40 | } 41 | 42 | /* ********** menu-hamburguesa ********** */ 43 | 44 | .header { 45 | position: sticky; 46 | z-index: 997; 47 | top: 0; 48 | padding: 1rem; 49 | background-color: var(--main-color); 50 | color: var(--second-color); 51 | } 52 | 53 | .header h1 { 54 | margin: 0 auto; 55 | text-align: center; 56 | } 57 | 58 | .section { 59 | padding: 2rem; 60 | padding-top: 4rem; 61 | margin-left: auto; 62 | margin-right: auto; 63 | width: 100%; 64 | max-width: var(--container-width); 65 | min-height: 100vh; 66 | text-align: center; 67 | } 68 | 69 | .panel { 70 | position: fixed; 71 | z-index: 998; 72 | top: 0; 73 | bottom: 0; 74 | left: 0; 75 | right: 0; 76 | width: 100%; 77 | display: flex; 78 | flex-direction: column; 79 | justify-content: center; 80 | align-items: center; 81 | overflow-y: auto; 82 | background-color: var(--second-modal-color); 83 | opacity: 0; 84 | visibility: hidden; 85 | transition: transform 0.3s ease, opacity 0.5s ease; 86 | /* De arriba */ 87 | transform: translate(0, -100%); 88 | /* De abajo */ 89 | transform: translate(0, 100%); 90 | /* De la derecha */ 91 | transform: translate(100%, 0); 92 | /* De la izquierda */ 93 | transform: translate(-100%, 0); 94 | } 95 | 96 | .panel.is-active { 97 | transform: translate(0, 0); 98 | opacity: 1; 99 | visibility: visible; 100 | } 101 | 102 | .panel-btn { 103 | position: fixed; 104 | z-index: 999; 105 | bottom: 1vh; 106 | right: 1vw; 107 | width: 4rem; 108 | height: 4rem; 109 | border-radius: 50%; 110 | padding: 0; 111 | display: flex; 112 | justify-content: center; 113 | align-items: center; 114 | background-color: var(--main-color); 115 | } 116 | 117 | .menu { 118 | width: inherit; 119 | display: flex; 120 | flex-direction: column; 121 | justify-content: space-evenly; 122 | align-items: center; 123 | text-align: center; 124 | } 125 | 126 | .menu a { 127 | padding: 2rem; 128 | width: inherit; 129 | display: block; 130 | font-size: 1.5rem; 131 | text-decoration: none; 132 | color: var(--main-color); 133 | transition: all 0.3s ease; 134 | } 135 | 136 | .menu a:hover { 137 | font-weight: bold; 138 | color: var(--second-color); 139 | background-color: var(--main-modal-color); 140 | } 141 | 142 | /* ********** Eventos del Teclado ********** */ 143 | 144 | .stage { 145 | display: flex; 146 | min-height: 50vh; 147 | background-color: var(--second-color); 148 | } 149 | 150 | .ball { 151 | margin: auto; 152 | width: 4rem; 153 | height: 4rem; 154 | border-radius: 50%; 155 | background-color: var(--main-color); 156 | } 157 | 158 | /* ********** ScrollTopButton ********** */ 159 | .scroll-top-btn { 160 | position: fixed; 161 | z-index: 999; 162 | bottom: 1vh; 163 | right: calc(4.25rem + 1vw); 164 | width: 4rem; 165 | height: 4rem; 166 | border-radius: 50%; 167 | font-size: 2rem; 168 | font-weight: bold; 169 | background-color: var(--main-color); 170 | color: var(--second-color); 171 | cursor: pointer; 172 | outline: 0; 173 | border: 0; 174 | transition: all 0.3s ease-out; 175 | } 176 | 177 | .scroll-top-btn:hover { 178 | background-color: var(--second-color); 179 | color: var(--main-color); 180 | } 181 | 182 | .hidden { 183 | visibility: hidden; 184 | opacity: 0; 185 | } 186 | 187 | /* ********** DarkThemeButton ********** */ 188 | .dark-theme-btn { 189 | position: fixed; 190 | z-index: 999; 191 | bottom: 1vh; 192 | left: 1vw; 193 | width: 4rem; 194 | height: 4rem; 195 | border-radius: 50%; 196 | font-size: 2rem; 197 | font-weight: bold; 198 | background-color: var(--main-color); 199 | color: var(--second-color); 200 | cursor: pointer; 201 | outline: 0; 202 | border: 0; 203 | transition: all 0.3s ease-out; 204 | } 205 | 206 | .dark-theme-btn:hover { 207 | background-color: var(--second-color); 208 | color: var(--main-color); 209 | } 210 | 211 | .dark-mode { 212 | background-color: var(--second-color); 213 | color: var(--main-color); 214 | } 215 | 216 | /* ********** Network Status ********** */ 217 | .online, 218 | .offline { 219 | position: sticky; 220 | top: 0; 221 | z-index: 1000; 222 | padding: 1rem; 223 | font-size: 1.5rem; 224 | font-weight: bold; 225 | text-align: center; 226 | background-color: #1b5e20; 227 | color: #fff; 228 | } 229 | 230 | .offline { 231 | background-color: #b71c1c; 232 | } 233 | 234 | /* ********** SearchFilters ********** */ 235 | .cards { 236 | display: grid; 237 | grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); 238 | } 239 | 240 | .card { 241 | background-color: var(--second-color); 242 | color: var(--main-color); 243 | transition: all 0.3s ease-out; 244 | } 245 | 246 | .card img { 247 | width: 100%; 248 | height: auto; 249 | } 250 | 251 | .card figcaption { 252 | padding: 1rem; 253 | } 254 | 255 | .filter { 256 | /* display: none; */ 257 | visibility: hidden; 258 | opacity: 0; 259 | order: 1; 260 | } 261 | 262 | /* ********** Responsive Slider ********** */ 263 | .slider { 264 | position: relative; 265 | width: 80%; 266 | margin: 1rem auto; 267 | /* border: thin solid black; */ 268 | text-align: center; 269 | } 270 | 271 | .slider-slides { 272 | position: relative; 273 | height: 400px; 274 | } 275 | 276 | .slider-slide { 277 | position: absolute; 278 | top: 0; 279 | left: 0; 280 | width: 100%; 281 | height: 100%; 282 | opacity: 0; 283 | visibility: hidden; 284 | transition: opacity 1s ease; 285 | } 286 | 287 | .slider-slide img { 288 | height: inherit; 289 | width: inherit; 290 | object-fit: cover; 291 | object-position: 50% 0%; 292 | } 293 | 294 | .slider-slide.active { 295 | opacity: 1; 296 | visibility: visible; 297 | } 298 | 299 | .slider-btns { 300 | position: absolute; 301 | width: 100%; 302 | top: calc(50% - 2rem); 303 | display: flex; 304 | justify-content: space-between; 305 | font-size: 3rem; 306 | font-weight: bold; 307 | } 308 | 309 | .slider a { 310 | display: block; 311 | width: 4rem; 312 | height: 4rem; 313 | border-radius: 50%; 314 | border: thin solid #000; 315 | text-decoration: none; 316 | background-color: #fff; 317 | color: #000; 318 | transition: all 0.3s ease; 319 | } 320 | 321 | .slider a:hover { 322 | color: #4d4d4d; 323 | } 324 | 325 | /* ********** ScrollSpy ********** */ 326 | @media screen and (min-width: 1024px) { 327 | body { 328 | display: grid; 329 | grid-template-columns: 80% 20%; 330 | grid-template-rows: 4rem auto; 331 | grid-template-areas: 332 | "header header" 333 | "main panel"; 334 | } 335 | 336 | main { 337 | grid-area: main; 338 | } 339 | 340 | .header { 341 | grid-area: header; 342 | } 343 | 344 | .panel { 345 | grid-area: panel; 346 | align-self: start; 347 | position: sticky; 348 | top: 4rem; 349 | justify-content: flex-start; 350 | background-color: var(--second-color); 351 | transform: translate(0, 0); 352 | opacity: 1; 353 | visibility: visible; 354 | overflow-y: auto; 355 | } 356 | 357 | .panel-btn { 358 | display: none; 359 | } 360 | 361 | .menu { 362 | justify-content: start; 363 | text-align: right; 364 | } 365 | 366 | .menu a { 367 | padding: 0.75rem; 368 | font-size: 1rem; 369 | } 370 | 371 | .menu a:hover, 372 | .menu a.active { 373 | color: var(--second-color); 374 | background-color: var(--main-color); 375 | } 376 | 377 | .scroll-top-btn { 378 | right: initial; 379 | left: calc(4.25rem + 1vw); 380 | } 381 | } 382 | 383 | /* ********** ContactForm Validations ********** */ 384 | .contact-form { 385 | --form-ok-color: #4caf50; 386 | --form-error-color: #f44336; 387 | margin-left: auto; 388 | margin-right: auto; 389 | width: 80%; 390 | } 391 | 392 | .contact-form > * { 393 | padding: 0.5rem; 394 | margin: 1rem auto; 395 | display: block; 396 | width: 100%; 397 | } 398 | 399 | .contact-form textarea { 400 | resize: none; 401 | } 402 | 403 | .contact-form legend, 404 | .contact-form-response { 405 | font-size: 1.5rem; 406 | font-weight: bold; 407 | text-align: center; 408 | } 409 | 410 | .contact-form input, 411 | .contact-form textarea { 412 | font-size: 1rem; 413 | font-family: sans-serif; 414 | } 415 | 416 | .contact-form input[type="submit"] { 417 | width: 50%; 418 | font-weight: bold; 419 | cursor: pointer; 420 | } 421 | 422 | .contact-form *::placeholder { 423 | color: #000; 424 | } 425 | 426 | .contact-form [required]:valid { 427 | border: thin solid var(--form-ok-color); 428 | } 429 | 430 | .contact-form [required]:invalid { 431 | border: thin solid var(--form-error-color); 432 | } 433 | 434 | .contact-form-error { 435 | margin-top: -1rem; 436 | font-size: 80%; 437 | background-color: var(--form-error-color); 438 | color: #fff; 439 | transition: all 800ms ease; 440 | } 441 | 442 | .contact-form-error.is-active { 443 | display: block; 444 | animation: show-message 1s 1 normal 0s ease-out both; 445 | } 446 | 447 | .none { 448 | display: none; 449 | } 450 | 451 | @keyframes show-message { 452 | 0% { 453 | visibility: hidden; 454 | opacity: 0; 455 | } 456 | 457 | 100% { 458 | visibility: visible; 459 | opacity: 1; 460 | } 461 | } 462 | -------------------------------------------------------------------------------- /js/ajax.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 106. AJAX: Objeto XMLHttpRequest - #jonmircha ********** */ 2 | (() => { 3 | const xhr = new XMLHttpRequest(), 4 | $xhr = document.getElementById("xhr"), 5 | $fragment = document.createDocumentFragment(); 6 | 7 | xhr.addEventListener("readystatechange", (e) => { 8 | if (xhr.readyState !== 4) return; 9 | 10 | //console.log(xhr); 11 | 12 | if (xhr.status >= 200 && xhr.status < 300) { 13 | //console.log("éxito"); 14 | //console.log(xhr.responseText); 15 | //$xhr.innerHTML = xhr.responseText; 16 | let json = JSON.parse(xhr.responseText); 17 | //console.log(json); 18 | 19 | json.forEach((el) => { 20 | const $li = document.createElement("li"); 21 | $li.innerHTML = `${el.name} -- ${el.email} -- ${el.phone}`; 22 | $fragment.appendChild($li); 23 | }); 24 | 25 | $xhr.appendChild($fragment); 26 | } else { 27 | //console.log("error"); 28 | let message = xhr.statusText || "Ocurrió un error"; 29 | $xhr.innerHTML = `Error ${xhr.status}: ${message}`; 30 | } 31 | 32 | //console.log("Este mensaje cargará de cualquier forma"); 33 | }); 34 | 35 | xhr.open("GET", "https://jsonplaceholder.typicode.com/users"); 36 | //xhr.open("GET", "assets/users.json"); 37 | 38 | xhr.send(); 39 | })(); 40 | 41 | /* ********** Curso JavaScript: 107. AJAX: API Fetch - #jonmircha ********** */ 42 | (() => { 43 | const $fetch = document.getElementById("fetch"), 44 | $fragment = document.createDocumentFragment(); 45 | 46 | //fetch("assets/users.json") 47 | fetch("https://jsonplaceholder.typicode.com/users") 48 | /* .then((res) => { 49 | console.log(res); 50 | return res.ok ? res.json() : Promise.reject(res); 51 | }) */ 52 | .then((res) => (res.ok ? res.json() : Promise.reject(res))) 53 | .then((json) => { 54 | //console.log(json); 55 | //$fetch.innerHTML = json; 56 | json.forEach((el) => { 57 | const $li = document.createElement("li"); 58 | $li.innerHTML = `${el.name} -- ${el.email} -- ${el.phone}`; 59 | $fragment.appendChild($li); 60 | }); 61 | 62 | $fetch.appendChild($fragment); 63 | }) 64 | .catch((err) => { 65 | //console.log(err); 66 | let message = err.statusText || "Ocurrió un error"; 67 | $fetch.innerHTML = `Error ${err.status}: ${message}`; 68 | }) 69 | .finally(() => { 70 | //console.log("Esto se ejecutará independientemente del resultado de la Promesa Fetch") 71 | }); 72 | })(); 73 | 74 | /* ********** Curso JavaScript: 108. AJAX: API Fetch + Async-Await - #jonmircha ********** */ 75 | (() => { 76 | const $fetchAsync = document.getElementById("fetch-async"), 77 | $fragment = document.createDocumentFragment(); 78 | 79 | async function getData() { 80 | try { 81 | let res = await fetch("https://jsonplaceholder.typicode.com/users"), 82 | json = await res.json(); 83 | 84 | //console.log(res, json); 85 | 86 | //if (!res.ok) throw new Error("Ocurrio un Error al solicitar los Datos"); 87 | if (!res.ok) throw { status: res.status, statusText: res.statusText }; 88 | 89 | json.forEach((el) => { 90 | const $li = document.createElement("li"); 91 | $li.innerHTML = `${el.name} -- ${el.email} -- ${el.phone}`; 92 | $fragment.appendChild($li); 93 | }); 94 | 95 | $fetchAsync.appendChild($fragment); 96 | } catch (err) { 97 | //console.log(err); 98 | let message = err.statusText || "Ocurrió un error"; 99 | $fetchAsync.innerHTML = `Error ${err.status}: ${message}`; 100 | } finally { 101 | //console.log("Esto se ejecutará independientemente del try... catch"); 102 | } 103 | } 104 | 105 | getData(); 106 | })(); 107 | 108 | /* ********** Curso JavaScript: 109. AJAX: Librería Axios - #jonmircha ********** */ 109 | (() => { 110 | const $axios = document.getElementById("axios"), 111 | $fragment = document.createDocumentFragment(); 112 | 113 | axios 114 | //.get("assets/users.json") 115 | .get("https://jsonplaceholder.typicode.com/users") 116 | .then((res) => { 117 | //console.log(res); 118 | let json = res.data; 119 | 120 | json.forEach((el) => { 121 | const $li = document.createElement("li"); 122 | $li.innerHTML = `${el.name} -- ${el.email} -- ${el.phone}`; 123 | $fragment.appendChild($li); 124 | }); 125 | 126 | $axios.appendChild($fragment); 127 | }) 128 | .catch((err) => { 129 | //console.log(err.response); 130 | let message = err.response.statusText || "Ocurrió un error"; 131 | $axios.innerHTML = `Error ${err.response.status}: ${message}`; 132 | }) 133 | .finally(() => { 134 | //console.log("Esto se ejecutará independientemente del resultado Axios"); 135 | }); 136 | })(); 137 | 138 | /* ********** Curso JavaScript: 110. AJAX: Librería Axios + Async-Await - #jonmircha ********** */ 139 | (() => { 140 | const $axiosAsync = document.getElementById("axios-async"), 141 | $fragment = document.createDocumentFragment(); 142 | 143 | async function getData() { 144 | try { 145 | let res = await axios.get("https://jsonplaceholder.typicode.com/users"), 146 | json = await res.data; 147 | 148 | //console.log(res, json); 149 | 150 | json.forEach((el) => { 151 | const $li = document.createElement("li"); 152 | $li.innerHTML = `${el.name} -- ${el.email} -- ${el.phone}`; 153 | $fragment.appendChild($li); 154 | }); 155 | 156 | $axiosAsync.appendChild($fragment); 157 | } catch (err) { 158 | //console.log(err.response); 159 | let message = err.response.statusText || "Ocurrió un error"; 160 | $axiosAsync.innerHTML = `Error ${err.response.status}: ${message}`; 161 | } finally { 162 | //console.log("Esto se ejecutará independientemente del try... catch"); 163 | } 164 | } 165 | 166 | getData(); 167 | })(); 168 | -------------------------------------------------------------------------------- /js/aritmetica.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 33. Módulos ( import / export ) - #jonmircha ********** */ 2 | function sumar(a, b) { 3 | return a + b; 4 | } 5 | 6 | function restar(a, b) { 7 | return a - b; 8 | } 9 | 10 | export const aritmetica = { 11 | sumar, 12 | restar 13 | }; 14 | -------------------------------------------------------------------------------- /js/constantes.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 33. Módulos ( import / export ) - #jonmircha ********** */ 2 | export const PI = Math.PI; 3 | 4 | export let usuario = "Jon"; 5 | 6 | const password = "qwerty"; 7 | //export default password; 8 | 9 | const hello = () => console.log("Hola"); 10 | 11 | export default function saludar() { 12 | console.log("Hola Módulos +ES6"); 13 | } 14 | 15 | export class Saludar { 16 | constructor() { 17 | console.log("Hola Clases +ES6"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /js/datos.json: -------------------------------------------------------------------------------- 1 | { 2 | "cadena": "Jon", 3 | "numero": 35, 4 | "booleano": true, 5 | "arreglo": ["correr", "programar", "cocinar"], 6 | "objeto": { 7 | "twitter": "@jonmircha", 8 | "email": "jonmircha@gmail.com" 9 | }, 10 | "nulo": null 11 | } 12 | -------------------------------------------------------------------------------- /js/dom.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 60. WEB APIs - #jonmircha ********** */ 2 | /* https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model */ 3 | /* https://developer.mozilla.org/en-US/docs/Mozilla/Gecko/Chrome/API/Browser_API */ 4 | /* https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model */ 5 | 6 | /* console.log(window); 7 | console.log(document); 8 | 9 | let texto = "Hola, soy tu amigo y docente digital... Jonathan MirCha"; 10 | const hablar = (texto) => speechSynthesis.speak(new SpeechSynthesisUtterance(texto)); 11 | hablar(texto); */ 12 | /* 13 | 14 | 15 | 16 | 17 | 18 | */ 19 | /* ********** Curso JavaScript: 61. DOM: Introducción - #jonmircha ********** */ 20 | /* console.log("********** Elementos del Documento **********"); 21 | console.log(window.document); 22 | console.log(document); 23 | console.log(document.head); 24 | console.log(document.body); 25 | console.log(document.documentElement); 26 | console.log(document.doctype); 27 | console.log(document.charset); 28 | console.log(document.title); 29 | console.log(document.links); 30 | console.log(document.images); 31 | console.log(document.forms); 32 | console.log(document.styleSheets); 33 | console.log(document.scripts); 34 | setTimeout(() => { 35 | console.log(document.getSelection().toString()); 36 | }, 2000); 37 | document.write("

            Hola Mundo desde el DOM

            "); */ 38 | /* 39 | 40 | 41 | 42 | 43 | 44 | */ 45 | /* ********** Curso JavaScript: 62. DOM: Nodos, Elementos y Selectores - #jonmircha ********** */ 46 | //https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType 47 | /* console.log(document.getElementsByTagName("li")); 48 | console.log(document.getElementsByClassName("card")); 49 | console.log(document.getElementsByName("nombre")); 50 | console.log(document.getElementById("menu")); 51 | console.log(document.querySelector("#menu")); 52 | console.log(document.querySelector("a")); 53 | console.log(document.querySelectorAll("a")); 54 | console.log(document.querySelectorAll("a").length); 55 | document.querySelectorAll("a").forEach((el) => console.log(el)); 56 | console.log(document.querySelector(".card")); 57 | console.log(document.querySelectorAll(".card")); 58 | console.log(document.querySelectorAll(".card")[2]); 59 | console.log(document.querySelector("#menu li")); 60 | console.log(document.querySelectorAll("#menu li")); */ 61 | /* 62 | 63 | 64 | 65 | 66 | 67 | */ 68 | /* ********** Curso JavaScript: 63. DOM: Atributos y Data-Attributes - #jonmircha ********** */ 69 | /* console.log(document.documentElement.lang); 70 | console.log(document.documentElement.getAttribute("lang")); 71 | console.log(document.querySelector(".link-dom").href); 72 | console.log(document.querySelector(".link-dom").getAttribute("href")); 73 | 74 | document.documentElement.lang = "en"; 75 | console.log(document.documentElement.lang); 76 | document.documentElement.setAttribute("lang", "es-MX"); 77 | console.log(document.documentElement.lang); 78 | 79 | const $linkDOM = document.querySelector(".link-dom"); 80 | 81 | $linkDOM.setAttribute("target", "_blank"); 82 | $linkDOM.setAttribute("rel", "noopener"); 83 | $linkDOM.setAttribute("href", "https://youtube.com/jonmircha"); 84 | console.log($linkDOM.hasAttribute("rel")); 85 | $linkDOM.removeAttribute("rel"); 86 | console.log($linkDOM.hasAttribute("rel")); 87 | 88 | //Data-Attributes 89 | console.log($linkDOM.getAttribute("data-description")); 90 | console.log($linkDOM.dataset); 91 | console.log($linkDOM.dataset.description); 92 | $linkDOM.setAttribute("data-description", "Modelo de Objeto del Documento"); 93 | console.log($linkDOM.dataset.description); 94 | $linkDOM.dataset.description = "Suscríbete a mi canal y comparte"; 95 | console.log($linkDOM.dataset.description); 96 | console.log($linkDOM.hasAttribute("data-id")); 97 | $linkDOM.removeAttribute("data-id"); 98 | console.log($linkDOM.hasAttribute("data-id")); */ 99 | /* 100 | 101 | 102 | 103 | 104 | 105 | */ 106 | /* ********** Curso JavaScript: 64. DOM: Estilos y Variables CSS - #jonmircha ********** */ 107 | /* const $linkDOM = document.querySelector(".link-dom"); 108 | 109 | console.log($linkDOM.style); 110 | console.log($linkDOM.getAttribute("style")); 111 | console.log($linkDOM.style.backgroundColor); 112 | console.log($linkDOM.style.color); 113 | console.log(window.getComputedStyle($linkDOM)); 114 | console.log(getComputedStyle($linkDOM).getPropertyValue("color")); 115 | 116 | $linkDOM.style.setProperty("text-decoration", "none"); 117 | $linkDOM.style.setProperty("display", "block"); 118 | $linkDOM.style.width = "50%"; 119 | $linkDOM.style.textAlign = "center"; 120 | $linkDOM.style.marginLeft = "auto"; 121 | $linkDOM.style.marginRight = "auto"; 122 | $linkDOM.style.padding = "1rem"; 123 | $linkDOM.style.borderRadius = ".5rem"; 124 | 125 | console.log($linkDOM.style); 126 | console.log($linkDOM.getAttribute("style")); 127 | console.log(getComputedStyle($linkDOM)); 128 | 129 | //Variables CSS - Custom Properties CSS 130 | const $html = document.documentElement, 131 | $body = document.body; 132 | 133 | let varDarkColor = getComputedStyle($html).getPropertyValue("--dark-color"), 134 | varYellowColor = getComputedStyle($html).getPropertyValue("--yellow-color"); 135 | 136 | console.log(varDarkColor, varYellowColor); 137 | 138 | $body.style.backgroundColor = varDarkColor; 139 | $body.style.color = varYellowColor; 140 | 141 | $html.style.setProperty("--dark-color", "#000"); 142 | varDarkColor = getComputedStyle($html).getPropertyValue("--dark-color"); 143 | 144 | $body.style.setProperty("background-color", varDarkColor); */ 145 | /* 146 | 147 | 148 | 149 | 150 | 151 | */ 152 | /* ********** Curso JavaScript: 65. DOM: Clases CSS - #jonmircha ********** */ 153 | /* const $card = document.querySelector(".card"); 154 | 155 | console.log($card); 156 | console.log($card.className); 157 | console.log($card.classList); 158 | console.log($card.classList.contains("rotate-45")); 159 | $card.classList.add("rotate-45"); 160 | console.log($card.classList.contains("rotate-45")); 161 | console.log($card.className); 162 | console.log($card.classList); 163 | $card.classList.remove("rotate-45"); 164 | console.log($card.classList.contains("rotate-45")); 165 | $card.classList.toggle("rotate-45"); 166 | console.log($card.classList.contains("rotate-45")); 167 | $card.classList.toggle("rotate-45"); 168 | console.log($card.classList.contains("rotate-45")); 169 | $card.classList.toggle("rotate-45"); 170 | $card.classList.replace("rotate-45", "rotate-135"); 171 | $card.classList.add("opacity-80", "sepia"); 172 | $card.classList.remove("opacity-80", "sepia"); 173 | $card.classList.toggle("opacity-80", "sepia"); */ 174 | /* 175 | 176 | 177 | 178 | 179 | 180 | */ 181 | /* ********** Curso JavaScript: 66. DOM: Texto y HTML - #jonmircha ********** */ 182 | /* const $whatIsDOM = document.getElementById("que-es"); 183 | let text = ` 184 |

            185 | El Modelo de Objetos del Documento (DOM - Document Object Model) es un API para documentos HTML y XML. 186 |

            187 |

            188 | Éste proveé una representación estructural del documento, permitiendo modificar su contenido y presentación visual mediante código JS. 189 |

            190 |

            191 | El DOM no es parte de la especificación de JavaScript, es una API para los navegadores. 192 |

            193 | `; 194 | 195 | //$whatIsDOM.innerText = text; 196 | $whatIsDOM.textContent = text; 197 | $whatIsDOM.innerHTML = text; 198 | $whatIsDOM.outerHTML = text; */ 199 | /* 200 | 201 | 202 | 203 | 204 | 205 | */ 206 | /* ********** Curso JavaScript: 67. DOM Traversing: Recorriendo el DOM - #jonmircha ********** */ 207 | /* const $cards = document.querySelector(".cards"); 208 | 209 | console.log($cards); 210 | console.log($cards.children); 211 | console.log($cards.children[2]); 212 | console.log($cards.parentElement); 213 | console.log($cards.firstElementChild); 214 | console.log($cards.lastElementChild); 215 | console.log($cards.previousElementSibling); 216 | console.log($cards.nextElementSibling); 217 | console.log($cards.closest("div")); 218 | console.log($cards.closest("body")); 219 | console.log($cards.children[3].closest("section")); */ 220 | /* 221 | 222 | 223 | 224 | 225 | 226 | */ 227 | /* ********** Curso JavaScript: 68. DOM: Creando Elementos y Fragmentos - #jonmircha ********** */ 228 | /* const $figure = document.createElement("figure"), 229 | $img = document.createElement("img"), 230 | $figcaption = document.createElement("figcaption"), 231 | $figcaptionText = document.createTextNode("Animals"), 232 | $cards = document.querySelector(".cards"), 233 | $figure2 = document.createElement("figure"); 234 | 235 | $img.setAttribute("src", "https://placeimg.com/200/200/animals"); 236 | $img.setAttribute("alt", "Animals"); 237 | $figure.classList.add("card"); 238 | 239 | $figcaption.appendChild($figcaptionText); 240 | $figure.appendChild($img); 241 | $figure.appendChild($figcaption); 242 | $cards.appendChild($figure); 243 | 244 | $figure2.innerHTML = ` 245 | People 246 |
            People
            247 | `; 248 | $figure2.classList.add("card"); 249 | 250 | $cards.appendChild($figure2); 251 | 252 | const estaciones = ["Primavera", "Verano", "Otoño", "Invierno"], 253 | $ul = document.createElement("ul"); 254 | 255 | document.write("

            Estaciones del Año

            "); 256 | document.body.appendChild($ul); 257 | 258 | estaciones.forEach((el) => { 259 | const $li = document.createElement("li"); 260 | $li.textContent = el; 261 | $ul.appendChild($li); 262 | }); 263 | 264 | const continentes = ["África", "América", "Asia", "Europa", "Oceanía"], 265 | $ul2 = document.createElement("ul"); 266 | 267 | document.write("

            Continentes del Mundo

            "); 268 | document.body.appendChild($ul2); 269 | $ul2.innerHTML = ""; 270 | continentes.forEach((el) => ($ul2.innerHTML += `
          1. ${el}
          2. `)); 271 | 272 | const meses = [ 273 | "Enero", 274 | "Febrero", 275 | "Marzo", 276 | "Abril", 277 | "Mayo", 278 | "Junio", 279 | "Julio", 280 | "Agosto", 281 | "Septiembre", 282 | "Octubre", 283 | "Noviembre", 284 | "Diciembre", 285 | ], 286 | $ul3 = document.createElement("ul"), 287 | $fragment = document.createDocumentFragment(); 288 | 289 | meses.forEach((el) => { 290 | const $li = document.createElement("li"); 291 | $li.textContent = el; 292 | $fragment.appendChild($li); 293 | }); 294 | 295 | document.write("

            Meses del Año

            "); 296 | $ul3.appendChild($fragment); 297 | document.body.appendChild($ul3); */ 298 | /* 299 | 300 | 301 | 302 | 303 | 304 | */ 305 | /* ********** Curso JavaScript: 69. DOM: Templates HTML - #jonmircha ********** */ 306 | /* const $cards = document.querySelector(".cards"), 307 | $template = document.getElementById("template-card").content, 308 | $fragment = document.createDocumentFragment(), 309 | cardsContent = [ 310 | { 311 | title: "Tecnología", 312 | img: "https://placeimg.com/200/200/tech", 313 | }, 314 | { 315 | title: "Animales", 316 | img: "https://placeimg.com/200/200/animals", 317 | }, 318 | { 319 | title: "Arquitectura", 320 | img: "https://placeimg.com/200/200/arch", 321 | }, 322 | { 323 | title: "Gente", 324 | img: "https://placeimg.com/200/200/people", 325 | }, 326 | { 327 | title: "Naturaleza", 328 | img: "https://placeimg.com/200/200/nature", 329 | }, 330 | ]; 331 | 332 | cardsContent.forEach((el) => { 333 | $template.querySelector("img").setAttribute("src", el.img); 334 | $template.querySelector("img").setAttribute("alt", el.title); 335 | $template.querySelector("figcaption").textContent = el.title; 336 | 337 | let $clone = document.importNode($template, true); 338 | $fragment.appendChild($clone); 339 | }); 340 | 341 | $cards.appendChild($fragment); */ 342 | /* 343 | 344 | 345 | 346 | 347 | 348 | */ 349 | /* ********** Curso JavaScript: 70. DOM: Modificando Elementos (Old Style) - #jonmircha ********** */ 350 | /* const $cards = document.querySelector(".cards"), 351 | $newCard = document.createElement("figure"), 352 | $cloneCards = $cards.cloneNode(true); 353 | 354 | $newCard.innerHTML = ` 355 | Any 356 |
            Any
            357 | `; 358 | $newCard.classList.add("card"); 359 | 360 | //$cards.replaceChild($newCard, $cards.children[2]); 361 | //$cards.removeChild($cards.lastElementChild); 362 | $cards.insertBefore($newCard, $cards.firstElementChild); 363 | document.body.appendChild($cloneCards); */ 364 | /* 365 | 366 | 367 | 368 | 369 | 370 | */ 371 | /* ********** Curso JavaScript: 71. DOM: Modificando Elementos (Cool Style) - #jonmircha ********** */ 372 | /* 373 | .insertAdjacent... 374 | .insertAdjacentElement(position, el) 375 | .insertAdjacentHTML(position, html) 376 | .insertAdjacentText(position, text) 377 | 378 | Posiciones: 379 | beforebegin(hermano anterior) 380 | afterbegin(primer hijo) 381 | beforeend(ultimo hijo) 382 | afterend(hermano siguiente) 383 | */ 384 | /* const $cards = document.querySelector(".cards"), 385 | $newCard = document.createElement("figure"); 386 | 387 | let $contenCard = ` 388 | Any 389 |
            390 | `; 391 | $newCard.classList.add("card"); 392 | 393 | $newCard.insertAdjacentHTML("afterbegin", $contenCard); 394 | $cards.insertAdjacentElement("beforeend", $newCard); 395 | $newCard.querySelector("figcaption").insertAdjacentText("afterbegin", "Any"); */ 396 | //$cards.prepend($newCard); 397 | //$cards.append($newCard); 398 | //$cards.before($newCard); 399 | //$cards.after($newCard); 400 | /* 401 | 402 | 403 | 404 | 405 | 406 | */ 407 | /* ********** Curso JavaScript: 72. DOM: Manejadores de Eventos - #jonmircha y Curso JavaScript: 73. DOM: Eventos con Parámetros y Remover Eventos - #jonmircha ********** */ 408 | /* 409 | Los eventos son los mecanismos que tenemos en JavaScript para controlar las acciones del usuario y definir el comportamiento del documento en cierto momento o cuando se cumplan ciertas condiciones. 410 | 411 | Las funciones que se ejecutan en un evento se llaman Event Handler (Manejador de Eventos). 412 | 413 | https://developer.mozilla.org/en-US/docs/Web/Events 414 | */ 415 | /* function holaMundo() { 416 | alert("Hola Mundo"); 417 | console.log(event); 418 | } 419 | 420 | function saludar(nombre = "Desconocid@") { 421 | alert(`Hola ${nombre}`); 422 | console.log(event); 423 | } 424 | 425 | const $eventoSemantico = document.getElementById("evento-semantico"), 426 | $eventoMultiple = document.getElementById("evento-multiple"), 427 | $eventoRemover = document.getElementById("evento-remover"); 428 | 429 | $eventoSemantico.onclick = holaMundo; 430 | $eventoSemantico.onclick = function (e) { 431 | alert("Hola Mundo Manejador de Eventos Semántico"); 432 | console.log(e); 433 | console.log(event); 434 | }; 435 | 436 | $eventoMultiple.addEventListener("click", holaMundo); 437 | $eventoMultiple.addEventListener("click", (e) => { 438 | alert("Hola Mundo Manejador de Eventos Múltiple"); 439 | console.log(e); 440 | console.log(e.type); 441 | console.log(e.target); 442 | console.log(event); 443 | }); 444 | $eventoMultiple.addEventListener("click", () => { 445 | saludar(); 446 | saludar("Jon"); 447 | }); 448 | 449 | const removerDobleClick = (e) => { 450 | alert(`Removiendo el evento de tipo ${e.type}`); 451 | console.log(e); 452 | $eventoRemover.removeEventListener("dblclick", removerDobleClick); 453 | $eventoRemover.disabled = true; 454 | }; 455 | 456 | $eventoRemover.addEventListener("dblclick", removerDobleClick); */ 457 | /* 458 | 459 | 460 | 461 | 462 | 463 | */ 464 | /* ********** Curso JavaScript: 74. DOM: Flujo de Eventos (Burbuja y Captura) - #jonmircha ********** */ 465 | /* 466 | Si no se especifica el parámetro boolean, el valor por defecto es false. 467 | Si el boolean es falso se ejecuta la fase de burbuja (ir del elemento más interno al más externo ) 468 | Si el boolean es verdadero se ejecuta la fase de captura (ir del elemento más externo al más interno) 469 | */ 470 | /* const $divsEventos = document.querySelectorAll(".eventos-flujo div"); 471 | 472 | function flujoEventos(e) { 473 | console.log( 474 | `Hola te saluda ${this.className}, el click lo originó ${e.target.className}` 475 | ); 476 | } 477 | 478 | console.log($divsEventos); 479 | 480 | $divsEventos.forEach((div) => { 481 | //Fase de burbuja 482 | //div.addEventListener("click", flujoEventos); 483 | //div.addEventListener("click", flujoEventos, false); 484 | //Fase de captura 485 | //div.addEventListener("click", flujoEventos, true); 486 | div.addEventListener("click", flujoEventos, { 487 | capture: false, 488 | once: true, 489 | }); 490 | }); */ 491 | /* 492 | 493 | 494 | 495 | 496 | 497 | */ 498 | /* ********** Curso JavaScript: 75. DOM: stopPropagation & preventDefault - #jonmircha ********** */ 499 | /* const $divsEventos = document.querySelectorAll(".eventos-flujo div"), 500 | $linkEventos = document.querySelector(".eventos-flujo a"); 501 | 502 | function flujoEventos(e) { 503 | console.log( 504 | `Hola te saluda ${this.className}, el click lo originó ${e.target.className}` 505 | ); 506 | e.stopPropagation(); 507 | } 508 | 509 | console.log($divsEventos); 510 | 511 | $divsEventos.forEach((div) => { 512 | //Fase de burbuja 513 | div.addEventListener("click", flujoEventos); 514 | //div.addEventListener("click", flujoEventos, false); 515 | //Fase de captura 516 | //div.addEventListener("click", flujoEventos, true); 517 | //div.addEventListener("click", flujoEventos, { 518 | //capture: false, 519 | //once: true, 520 | //}); 521 | }); 522 | 523 | $linkEventos.addEventListener("click", (e) => { 524 | alert("Hola soy tu amigo y docente digital... Jonathan MirCha"); 525 | e.preventDefault(); 526 | e.stopPropagation(); 527 | }); */ 528 | /* 529 | 530 | 531 | 532 | 533 | 534 | */ 535 | /* ********** Curso JavaScript: 76. DOM: Delegación de Eventos - #jonmircha ********** */ 536 | /* function flujoEventos(e) { 537 | console.log( 538 | `Hola te saluda ${this} el click lo originó ${e.target.className}` 539 | ); 540 | //e.stopPropagation(); 541 | } 542 | 543 | document.addEventListener("click", (e) => { 544 | if (e.target.matches(".eventos-flujo div")) { 545 | flujoEventos(e); 546 | } 547 | 548 | if (e.target.matches(".eventos-flujo a")) { 549 | alert("Hola soy tu amigo y docente digital... Jonathan MirCha"); 550 | e.preventDefault(); 551 | //e.stopPropagation(); 552 | } 553 | }); */ 554 | /* 555 | 556 | 557 | 558 | 559 | 560 | */ 561 | /* ********** Curso JavaScript: 77. BOM: Propiedades y Eventos - #jonmircha ********** */ 562 | /* 563 | El evento DOMContentLoaded es disparado cuando el documento HTML ha sido completamente cargado y parseado, sin esperar hojas de estilo, imágenes y subtramas para finalizar la carga. 564 | 565 | El evento load se dispara cuando se ha detectado la carga completa de la página. 566 | 567 | Es un error frecuente usar load cuando DOMContentLoaded es mucho más apropiado. 568 | 569 | Peticiones asíncronas pausan el parseo del DOM. 570 | */ 571 | /* window.addEventListener("resize", (e) => { 572 | console.clear(); 573 | console.log("********** Evento Resize **********"); 574 | console.log(window.innerWidth); 575 | console.log(window.innerHeight); 576 | console.log(window.outerWidth); 577 | console.log(window.outerHeight); 578 | console.log(e); 579 | }); 580 | 581 | window.addEventListener("scroll", (e) => { 582 | console.clear(); 583 | console.log("********** Evento Scroll **********"); 584 | console.log(window.scrollX); 585 | console.log(window.scrollY); 586 | console.log(e); 587 | }); 588 | 589 | window.addEventListener("load", (e) => { 590 | console.log("********** Evento Load **********"); 591 | console.log(window.screenX); 592 | console.log(window.screenY); 593 | console.log(e); 594 | }); 595 | 596 | document.addEventListener("DOMContentLoaded", (e) => { 597 | console.log("********** Evento DOMContentLoaded **********"); 598 | console.log(window.screenX); 599 | console.log(window.screenY); 600 | console.log(e); 601 | }); */ 602 | /* 603 | 604 | 605 | 606 | 607 | 608 | */ 609 | /* ********** Curso JavaScript: 78. BOM: Métodos - #jonmircha ********** */ 610 | //window.alert("Alerta"); 611 | //window.confirm("Confirmación"); 612 | //window.prompt("Aviso"); 613 | /* const $btnAbrir = document.getElementById("abrir-ventana"), 614 | $btnCerrar = document.getElementById("cerrar-ventana"), 615 | $btnImprimir = document.getElementById("imprimir-ventana"); 616 | 617 | let ventana; 618 | 619 | $btnAbrir.addEventListener( 620 | "click", 621 | (e) => (ventana = window.open("https://jonmircha.com")) 622 | ); 623 | 624 | $btnCerrar.addEventListener("click", (e) => { 625 | //window.close(); 626 | ventana.close(); 627 | }); 628 | 629 | $btnImprimir.addEventListener("click", (e) => window.print()); */ 630 | /* 631 | 632 | 633 | 634 | 635 | 636 | */ 637 | /* ********** Curso JavaScript: 79. BOM: Objetos: URL, Historial y Navegador - #jonmircha ********** */ 638 | /* console.log("********** Objeto URL (location) **********"); 639 | console.log(location); 640 | console.log(location.origin); 641 | console.log(location.protocol); 642 | console.log(location.host); 643 | console.log(location.hostname); 644 | console.log(location.port); 645 | console.log(location.href); 646 | console.log(location.hash); 647 | console.log(location.search); 648 | console.log(location.pathname); 649 | //location.reload(); 650 | 651 | console.log("********** Objeto Historial (history) **********"); 652 | console.log(history); 653 | console.log(history.length); 654 | //history.forward(1); 655 | //history.go(-3); 656 | //history.back(2); 657 | 658 | console.log("********** Objeto Navegador (navigator) **********"); 659 | console.log(navigator); 660 | console.log(navigator.connection); 661 | console.log(navigator.geolocation); 662 | console.log(navigator.mediaDevices); 663 | console.log(navigator.mimeTypes); 664 | console.log(navigator.onLine); 665 | console.log(navigator.serviceWorker); 666 | console.log(navigator.storage); 667 | console.log(navigator.usb); 668 | console.log(navigator.userAgent); */ 669 | -------------------------------------------------------------------------------- /js/dom/boton_scroll.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 87. DOM: Ejercicios Prácticos | Botón de Scroll - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/carrusel.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 98. DOM: Ejercicios Prácticos | Responsive Slider - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/cuenta_regresiva.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 86. DOM: Ejercicios Prácticos | Cuenta Regresiva(countdown) - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/deteccion_dispositivos.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 92. DOM: Ejercicios Prácticos | Detección de Dispositivos User Agent - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/deteccion_red.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 93. DOM: Ejercicios Prácticos | Detección del estado de la red - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/deteccion_webcam.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 94. DOM: Ejercicios Prácticos | Detección de la WebCam - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/filtros_busqueda.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 96. DOM: Ejercicios Prácticos | Filtros de Búsqueda - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/geolocalizacion.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 95. DOM: Ejercicios Prácticos | Detección de la Geolocalización - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/menu_hamburguesa.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 81. DOM: Ejercicios Prácticos | Menú de Hamburguesa - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/narrador.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 104. DOM: Ejercicios Prácticos | Narrador (Lector de Voz) - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/objeto_responsive.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 90. DOM: Ejercicios Prácticos | Responsive con JavaScript - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/prueba_responsive.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 91. DOM: Ejercicios Prácticos | Responsive Tester - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/reconocimiento_voz.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonmircha/youtube-js/6faa0d14151a242f56045d320a87a81e412115d6/js/dom/reconocimiento_voz.js -------------------------------------------------------------------------------- /js/dom/reloj.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 82. DOM: Ejercicios Prácticos | Reloj Digital - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/scroll_espia.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 99. DOM: Ejercicios Prácticos | ScrollSpy con Intersection Observer - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/sorteo.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 97. DOM: Ejercicios Prácticos | Sorteo Digital - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/teclado.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 85. DOM: Ejercicios | Eventos del Teclado (movimientos y colisiones) - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/dom/tema_oscuro.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 88. DOM: Ejercicios Prácticos | Tema Dark / Light - #jonmircha ********** */ 2 | /* ********** Curso JavaScript: 89. DOM: Ejercicios Prácticos | API localStorage - #jonmircha ********** */ 3 | -------------------------------------------------------------------------------- /js/dom/validaciones_formulario.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 101. DOM: Ejercicios Prácticos | Validación de Formularios con HTML5 - #jonmircha ********** */ 2 | /* ********** Curso JavaScript: 102. DOM: Ejercicios Prácticos | Validación de Formularios - #jonmircha ********** */ 3 | /* ********** Curso JavaScript: 103. DOM: Ejercicios Prácticos | Envío de Formularios - #jonmircha ********** */ 4 | -------------------------------------------------------------------------------- /js/dom/video_inteligente.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 100. DOM: Video Inteligente (IntersectionObserver & VisibilityChange) - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/index_dom.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 80. DOM: Ejercicios Prácticos | Presentación - #jonmircha ********** */ 2 | -------------------------------------------------------------------------------- /js/modulos.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 33. Módulos ( import / export ) - #jonmircha ********** */ 2 | import saludar, { Saludar, PI, usuario } from "./constantes.js"; 3 | import { aritmetica as calculos } from "./aritmetica.js"; 4 | 5 | console.log("Archivo modulos.js"); 6 | console.log(PI, usuario); 7 | //console.log(aritmetica.sumar(3, 4)); 8 | console.log(calculos.sumar(3, 4)); 9 | console.log(calculos.restar(3, 4)); 10 | saludar(); 11 | let saludo = new Saludar(); 12 | saludo; 13 | -------------------------------------------------------------------------------- /js/no-modulos.js: -------------------------------------------------------------------------------- 1 | /* ********** Curso JavaScript: 33. Módulos ( import / export ) - #jonmircha ********** */ 2 | console.log("Mi navegador no soporta Módulos +ES6"); 3 | -------------------------------------------------------------------------------- /reactividad/00_dom-manipulacion.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Manipulación Manual del DOM 8 | 9 | 10 | 11 |

            Manipulación Manual del DOM

            12 |
            13 | 14 | 15 |
            16 |

            Lista de Tareas

            17 | 18 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /reactividad/01_ui-basada-estado.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Interfaz basada en el Estado 8 | 9 | 10 | 11 |

            Interfaz basada en el Estado

            12 |
            13 | 14 | 15 |
            16 |

            Lista de Tareas

            17 | 18 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /reactividad/02_reactividad-estado.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Reactividad del Estado 8 | 9 | 10 | 11 |

            Reactividad del Estado

            12 |
            13 | 14 | 15 |
            16 |

            Lista de Tareas

            17 | 18 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /reactividad/03_estado-inmutable.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Estado Inmutable 8 | 9 | 10 | 11 |

            Estado Inmutable

            12 |
            13 | 14 | 15 |
            16 |

            Lista de Tareas

            17 | 18 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /reactividad/04_componentes-con-estado.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Componentes con Estado 8 | 9 | 10 | 11 |

            Componentes con Estado

            12 |
            13 | 14 | 15 |
            16 |

            Lista de Tareas

            17 | 18 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /reactividad/05_libreria-componentes-con-estado.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Librería de Componentes con Estado 8 | 9 | 10 | 11 |

            Librería de Componentes con Estado

            12 |
            13 | 14 | 15 |
            16 |

            Lista de Tareas

            17 | 18 | 19 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /reactividad/Component.js: -------------------------------------------------------------------------------- 1 | const Component = (function () { 2 | //Creamos el Constructor del Componente 3 | const Constructor = function (options) { 4 | this.el = options.el; 5 | this.data = options.data; 6 | this.template = options.template; 7 | }; 8 | 9 | //Agregamos los métodos al prototipo del constructor del componente 10 | 11 | //Render UI 12 | Constructor.prototype.render = function () { 13 | const $el = d.querySelector(this.el); 14 | if (!$el) return; 15 | $el.innerHTML = this.template(this.data); 16 | 17 | console.log(this.data); 18 | }; 19 | 20 | //Actualizar el State de forma reactiva 21 | Constructor.prototype.setState = function (obj) { 22 | for (let key in obj) { 23 | if (this.data.hasOwnProperty(key)) { 24 | this.data[key] = obj[key]; 25 | } 26 | } 27 | 28 | this.render(); 29 | }; 30 | 31 | //Obtenemos una copia inmutable del State 32 | Constructor.prototype.getState = function () { 33 | return JSON.parse(JSON.stringify(this.data)); 34 | }; 35 | 36 | return Constructor; 37 | })(); 38 | --------------------------------------------------------------------------------