├── .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 |
72 | Eventos
73 | Forms
74 | AJAX - Fetch
75 | History
76 | Web Storage
77 | Geolocation
78 | Drag & Drop
79 | Indexed DB
80 | Canvas
81 | MatchMedia
82 | etc..
83 |
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 |
108 | Tech
109 |
110 |
111 |
112 | Animals
113 |
114 |
115 |
116 | Architecture
117 |
118 |
119 |
120 | People
121 |
122 |
123 |
124 | Nature
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 | Eventos en JavaScript
134 | Manejadores de Eventos
135 | Evento con atributo HTML
136 |
137 | Evento con manejador semántico
138 |
139 | Evento con manejador múltiple
140 |
141 | Removiendo eventos con manejadores múltiples
142 | Flujo de Eventos
143 |
156 | Manejo del BOM
157 | Abrir Ventana
158 |
159 | Cerrar Ventana
160 |
161 | Imprimir Ventana
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 |
16 |
17 |
18 |
19 |
20 |
21 |
40 |
41 |
42 | Reloj Digital y Alarma Sonora
43 |
44 |
45 | Iniciar Reloj
46 | Detener Reloj
47 | Iniciar Alarma
48 | Detener Alarma
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 |
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 |
124 |
125 | Sorteo Digital
126 |
127 | JavaScript
128 | PHP
129 | JAVA
130 | C
131 | Python
132 | Ruby
133 | Go
134 | Visual Basic
135 | Rust
136 | Perl
137 |
138 | Obtener Ganador
139 |
140 |
141 | Responsive Slider
142 |
143 |
144 |
145 |
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 |
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 |
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 |
210 |
211 |
212 | Narrador
213 |
214 | --- Elige una Voz ---
215 |
216 |
217 |
218 |
219 | Leer Texto
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 |
26 | Métodos Nativos
27 |
28 |
29 |
31 |
32 |
33 |
35 |
36 |
37 |
39 |
40 |
41 | Librerías Externas
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | etc.
51 |
52 |
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 |
57 |
58 | HTML y CSS , para crear una presentación basada en estándares.
59 |
60 | DOM , para la interacción y manipulación dinámica de la presentación.
61 |
62 | HTML, XML y JSON , para el intercambio y la manipulación de información.
63 |
64 | XMLHttpRequest o Fetch , para el intercambio asíncrono de información.
65 |
66 | JavaScript , para unir todas las demás tecnologías.
67 |
68 | Estado de la Petición
69 |
70 |
71 | READY_STATE_UNINITIALIZED = 0
72 | READY_STATE_LOADING = 1
73 | READY_STATE_LOADED = 2
74 | READY_STATE_INTERACTIVE = 3
75 | READY_STATE_COMPLETE = 4
76 |
77 |
78 |
79 | Códigos de
80 | estado de respuesta HTTP
81 |
82 |
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 |
38 |
39 |
40 |
41 |
42 |
43 | Editar
44 | Eliminar
45 |
46 |
47 |
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 |
38 |
39 |
40 |
41 |
42 |
43 | Editar
44 | Eliminar
45 |
46 |
47 |
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 |
38 |
39 |
40 |
41 |
42 |
43 | Editar
44 | Eliminar
45 |
46 |
47 |
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 |
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 |
121 |
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 |
121 |
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 |
60 |
61 |
62 |
63 |
64 |
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 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
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 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
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 | Estados
14 |
15 | Elige un Estado
16 |
17 |
18 | Municipios
19 |
20 | Elige un Muinicipio
21 |
22 |
23 | Colonias
24 |
25 | Elige una Colonia
26 |
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 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 | Ver publicación original
113 |
114 |
115 |
116 |
117 | Ver contenido de la publicación
118 |
119 |
120 |
121 |
122 |
123 |
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 |
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 |
7 |
--------------------------------------------------------------------------------
/ajax-ejercicios/assets/footer.html:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/ajax-ejercicios/assets/header.html:
--------------------------------------------------------------------------------
1 |
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 |
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 | 
26 | 
27 | 
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 |
18 | Nombre: $name
19 | Email: $email
20 | Asunto: $subject
21 | Comentarios: $comments
22 |
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 |
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 |
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 += `${el} `));
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 |
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 |
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 |
--------------------------------------------------------------------------------