Diseño de Interfaces - Apuntes de Clase PDF
Diseño de Interfaces - Apuntes de Clase PDF
Contexto histórico
● Leonardo da Vinci: relación del usuario y las máquinas.
● Taylorismo
● Toyota
● Ergonomía de los objetos (años 50 del siglo XX)
● Interacción Persona-Computador (HCI, Human Computer Interaction), años 80 del
siglo 20
● User Center Cesing (UCD) - 1983: define un proceso o modelo de trbajo mediante
interacciones que trata de cubrir las necesidades del usuario.
● Usabilidad (1990): anglicismo que significa facilidad de uso y cuya definición formal
se referie al grado de eficacia, eficiencia y satisfacción con la que los usuarios
específicos pueden lograr objetivos específicos, en contextos de uso específicos.
Tiene que ver con eficiencia, efectividad, seguridad, utilidad, facilidad de aprendizaje
y facilidad de recordación.
● Experiencia de usuario (1995) - Don Norman
● Saber más...
Conceptos
Experiencia de usuario: abarca los aspectos de interacción del usuario final con la empresa,
sus servicios y sus productos.
UX es la forma en la que el usuario se relaciona con el medio o la interfaz que debe ser por
tanto:
● Útil
● Usable
● Deseable
● Creíble
● Encontrable
● Accesible
Qué no es UX
● No es diseño. El diseño no es una aditivo cosmético que bien usado puede facilitar
al usuario pero que mal usado, lo puede perjudicar. Requiere cuidado exquisito para
no convertirlo en un distractor.
● No es sólo usabilidad
El proceso de diseño UX
Garret en el 2002 concibió los elementos de la experiencia de usuario (Gráfica de Garret)
El esqueleto
● Representa los resultados del diseño.
La secuencia descriptiva de las fases, no quiere decir que se deben llevar a cabo de
manera secuencial, por el contrario, deben ser cumplidas mediante un proceso iterativo.
Técnicas
Análisis: se recopila toda la información sobre el usuario, sus necesidades, el proyecto, los
objetivos de negocio. Se pueden utilizar las siguientes técnicas:
● Eye Tracking: mediante sensores se realiza el seguimiento del ojo para delimitar las
zonas que percibe o no percibe el usuario, determinando focos de atención que
distraen al usuario de su objetivo. Esto puede determinar los elementos que
potencian la tarea, qué elementos son distractores o cuales pasan desapercibidos
para el usuario.
● Card sorting: permite a los usuarios agrupar y ordenar contenidos, con ayuda de
tarjetas que representan las diferentes categorías o entidades de contenido. Permite
por tanto general agrupaciones de contenido basados en el orden establecido por
los usuarios. Se puede pedir a los usuarios que colaboren en el
ordenamiento/agrupación.
● Encuestas: pueden realizarse tanto de forma online como offline y permite acceder
a las opiniones de un volumen muy alto de personas.
Se realiza para obtener los errores de usabilidad que son reconocibles a simple
vista. Ver:
● Test A/B: Un test A/B consiste en realizar una prueba a un porcentaje de usuarios
(puede ser el 100%) que visitan tu página web con el fin de ofrecerles dos variables
o vistas distintas de tu página web. Ver más:
○ Qué son los test A/B y cómo llevarlos a cabo con Google Optimize,
Aquí son comunes las estructuras de contenido o árboles de navegación. Ver más:
Un diseño gráfico mal aplicado puede entorpecer las labores del usuario, siendo un
distractor. Un buen diseño no sólo trata de la rejilla, tipografía o color, sino que
mejora la satisfacción del usuario.
Generan por tanto la estructura de las páginas y plantillas y los elemetnos dinámicos
como menús desplegables, carruseles, lighboxes, … además de incluir elementos
multimedia.
Metodología
Será necesario entonces planear, analizar, diseñar, probar e iterar de nuevodesde alguno
de los pasos anteriores, para ir perfeccionando el producto a partir de las conclusiones de la
iteración actual.
1 - Herramientas esenciales
Esta aplicación hará las veces de un servidor web local (instalado en nuestro propio
equipo), lo que suele ser una solución ideal para realizar pruebas y/o tareas de
administración, instalación o desarrollo web. De esta forma, se puede probar,
configurar o programar aplicaciones web sin temor a estropear la aplicación web
oficial o el servidor en producción.
Los pasos que se enumeran enseguida, menos el primer paso, serán los que utilice siempre
que deba crear un proyecto de diseño de interfaces utilizando Laragon:
crear app01
De ahora en adelante, cada vez que necesite crear una aplicación, utilizará el
comando crear nombreapp, en minúscula sostenida y sin espacios.
4. Pulse clic sobre el botón “Iniciar Todo” y si este no aparece, pulse clic sobre los
enlaces “Recargar”.
Esta acción es necesaria para que el servidor web reconozca que se ha creado una
nueva estructura de aplicación y por lo tanto será necesaria cada vez que cree un
nuevo proyecto.
5. Vuelva a la ventana de Laragon y prueba a pulsar clic sobre el botón Root. Notará
que lo lleva directamente a la carpeta pública de su servidor web.
Finalmente recuerde que cada vez que deba crear un nuevo proyecto para diseño de
interfaces web, los pasos del 2 al 5 indicados aquí, le facilitarán la vida y le evitarán
problemas ya que no se recibirán proyectos que no cuenten con esta estructura básica.
1. Si no tiene instalado Visual Studio Code (en adelante VSC) instálelo ahora.
7. Digite en el nuevo archivo “html”. Se debe abrir un menú desplegable del cual debe
elegir la opción “html:5”, tal como se muestra en la figura.
Esta acción deberá generar un código HTML similar al que se muestra enseguida:
9. Pulse F1, digite “LiveServer” y seleccione la opción “Open with Live Server”
Tenga en cuenta un detalle, cuando LiveServer está monitoreando una página web,
en la parte inferior derecha de VSC se mostrará
indicando con ello que se puede parar y por lo tanto
dejar de monitorear el desarrollo, en cuyo caso en el navegador no se refrescarán
automáticamente los cambios que realice.
2. Suponiendo que está sobre la carpeta app01, salga a la carpeta www con el
comando “cd ..” y cree la estructura para un nuevo proyecto app02. En la gráfica
siguiente se pueden ver los pasos que se le pide llevar a cabo.
3. Del menú Archivo, elija Abrir carpeta y seleccione la carpeta app02 que acaba de
crear.
5. Abra el archivo index.html y proceda como se indicó en el paso 7 del taller anterior,
para crear la plantilla base de la página web principal de la aplicación.
7. Modifique el cuerpo de la página, el bloque que está contenido entre las etiquetas
<body>...</body>, para que quede con el siguiente contenido:
<body>
<h1>Etiquetas HTML</h1>
<p>
Este ejemplo muestra cómo combinar algunas de las etiquetas
más básicas de HTML5. <br> Recuerda que <strong>es
importante entender las diferencias entre ellas</strong>
</p>
<h2>Etiqueta ul+li</h2>
<ul>
<li>Tom Hanks</li>
<li>Leonardo DiCaprio</li>
<li>Morgan Freeman</li>
<li>Brad Pitt</li>
</ul>
<h2>Etiqueta ol+li</h2>
<p>
En el caso de que estemos listando elementos donde el orden
es importante, como por ejemplo la clasificación de un
mundial de fútbol, debemos usar <em>ol</em>
</p>
<ol>
<li>Colombia</li>
<li>Brasil</li>
<li>Alemania</li>
<li>Uruguay</li>
<li>Panamá</li>
<li>Venezuela</li>
<li>Francia</li>
<li>Hungría</li>
</ol>
</body>
Se aclara que el código no está escrito con los estándares que se sugieren para
HTML5, pero por fines didácticos se han omitido algunas etiquetas que serán
incorporadas más adelante.
12. Tambien incluya dentro de una lista ordenada, para uno o varios elementos de la
lista, sublistas no ordenadas. Por ejemplo: una lista de departamentos con algunas
localidades.
13. A lo largo de este curso se recomienda que consulte en esta página información
adicional sobre páginas web HTML y hojas de estilo CSS para que complemente
conceptos, esto teniendo en cuenta que nuestro objetivo se centra en el diseño de
interfaces y no precisamente en aspectos especificos de HTML, CSS o JavaScript, a
pesar de que son imprescindibles para lo que se pretende.
Hasta aquí se han visto la estructura general de una página HTML, constituida por su
cabecera y su cuerpo. Sin embargo no es del todo correcto ir agregando componentes en el
cuerpo de una página sin conocer las recomendaciones que los expertos han dado.
En la parte siguiente se mostrarán los primeros pasos para conocer la estructura de una
página HTML5 y como ya se ha indicado la manera de crear y visualizar las páginas ya no
se dará una guía paso a paso, sino que se mostrarán porciones de código que deberá ir
probando, por lo tanto, empiece por crear un nuevo proyecto para realizar las pruebas que
siguen.
<!DOCTYPE html>
Como su nombre lo insinúa, indica el tipo de documento y debe ser la primera etiqueta que
se incluya, sin espacios o líneas que la precedan, con el fin de que los navegadores
interpreten correctamente que se trata de un documento HTML5.
<html>
También puede ver en el código fuente, que la forma en que se ha utilizado la etiqueta
<html> es la siguiente:
<html lang="es">
Finalmente, para indicar la terminación del bloque de código que define la página se usa
como última instrucción la etiqueta de cierre </html>.
Resumiento, el bloque de instrucciones HTML de una página, estará contenido entre las
etiquetas: <html> ... </html> y dicho bloque tendrá dos secciones principales: la cabecera y
el cuerpo de la página.
<head>
● Definir el título de la página web que será visible en la pestaña del navegador donde
la página se abra,
● Más adelante se utilizará la cabecera para incorporar archivos externos con estilos,
código Javascript o incluso imágenes necesarias para generar la página en la
pantalla. También para indicar a los motores de búsqueda datos como la
descripción del sitio y palabras clases que faciliten encontrar la página en Internet.
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="description" content="Ejemplo inicial de HTML5">
<meta name="keywords" content="Etiquetas HTML, CSS, Javascript, DOM">
<title>DInterfaces - App 1</title>
</head>
<body>
Enseguida se muestra un ejemplo de lo que sería el cuerpo de una página con los
elementos estructurales básicos:
<body>
<header>
<h1>Título de la página</h1>
</header>
<section>
<!-- sección principal de propósitio general -->
<article>
Este es el texto de mi primer mensaje
</article>
<article>
Este es el texto de mi segundo mensaje
</article>
</section>
<aside>
<blockquote>Bloque 1 de información secundaria</blockquote>
<blockquote>Bloque 2 de información secundaria</blockquote>
</aside>
<footer>
Derechos reservados © Carlos Cuesta - 2019-2020
</footer>
</body>
Si crea una aplicación con este contenido y prueba su visualización en un navegador, verá
un simple prototipo, una simple estructura en la que apenas se diferencia la disposición de
los elementos descritos y su ubicación ni siquiera se asemejará a los wireframes mostrados
en las figuras anteriores.
Para que la estructura de una página cobre vida, se requiere utilizar hojas de estilo en
cascada (CSS) o frameworks de front-end que mejoren la apariencia. Utilizando un simil
HTML es la obra negra de un edificio y CSS es la obra blanca, la primera estructura y la
segunda le da presentación. Por el momento se continúa dando una rápida referencia de
HTML para pasar luego a ver detalles de CSS.
<mark>
<p>
Esto se verá mejor próximamente cuando se
incorporen <mark>hojas de estilo</mark> en las páginas.
</p>
Esto se verá mejor próximamente cuando se incorporen hojas de estilo en los proyectos.
<small>
Este elemento se utiliza para incluir contenido al margen, como letra pequeña de los
contratos. Observe un ejemplo de su uso:
<p>
En este curso es necesario que domine HTML y CSS antes de poder
pasar a ver diseño de interfaces.
<br>
<small>La no realización de talleres de estos temas se calificará
con cero.</small>
</p>
En este curso es necesario que domine HTML y CSS antes de poder pasar a ver
diseño de interfaces.
<hgroup>
<article>
<hgroup>
<h1>Diseño de interfaces</h1>
<h2>Fundamentos</h2>
</hgroup>
<p>
En este curso se estudia inicialmente todo lo relacionado
con la planeación, análisis y diseño de la parte visual de
los aplicativos y luego se pasa a la parte práctica donde se
desarrolla, a partir de casos de estudio, ...
Diseño de interfaces
Fundamentos
En este curso se estudia inicialmente todo lo relacionado con la planeación, análisis y
diseño de la parte visual de los aplicativos y luego se pasa a la parte práctica donde se
desarrolla, a partir de casos de estudio, …
El elemento <figure> por lo general, hace referencia a una imagen, una ilustración, un
diagrama, un fragmento de código, o un esquema que se inserta en un elemento <img>. El
elemento <figcaption> representa un subtítulo o leyenda asociado al contenido del
elemento <figure>, que en este caso es una imagen. Ejemplo:
<figure>
<img src="./favicon.ico" alt="icono">
<figcaption>
Icono utilizado por la aplicación
</figcaption>
</figure>
● La imagen puede estar en cualquier ruta, incluso en una dirección IP pero aquí por
comodidas se eligió la imagen que por defecto el navegador usa como icono de la
aplicación y que se reconoce automaticamente si se llama “favicon.ico” y se coloca
en el mismo nivel del archivo index.html.
<blockquote> y <cite>
El elemento <blockquote> define una cita larga que se representa como un elemento de
bloque. Por ejemplo:
Como se puede ver, <cite> debe contener el nombre de una obra creativa, no el nombre del
autor citado.
<q>
El elemento <q> define una cita corta que se representa como un elemento en línea sin
saltos de línea, dicha cita aparecerá entre comillas. Por ejemplo:
<article>
Lo normal es encontrar los patrones de diseño de interacción
agrupados en colecciones de patrones <q>conjuntos de patrones de
ámbito similar, clasificados temáticamente</q>.
</article>
<footer>
Derechos reservados © Carlos Cuesta - 2019-2020
<address>
Universidad de Caldas<br>
Cl. 65 #26-10, Manizales, Colombia<br>
</address>
</footer>
<time>
Este elemento representa un fecha, una hora o un periodo específico en el tiempo. Puede
incluir el atributo datetime para convertir las fechas en un formato interno legible para el
motor de búsqueda, permitiendo mejores resultados o características personalizadas como
recordatorios. Algunos ejemplos válidos:
HTML y CSS
La sigla CSS (Cascading Style Sheets / Hojas de estilo en cascada) permiten separar la
estructura de la presentación de las páginas web. CSS es totalmente independiente de
HTML. CSS no forma parte de la especificación y nunca lo fue, pero sí es un lenguaje
complementario desarrollado para superar las limitaciones y reducir la complejidad de
HTML a la hora de proveer estilos visuales a los elementos del documento, como tamaño,
color, fondo, bordes, entreo otros. La gráfica siguiente ilustra lo dicho:
Estilos en línea
Asignar los estilos dentro de las etiquetas por medio del atributo style. Ejemplo:
<body>
<p style="color: brown; background-color: powderblue">En línea</p>
</body>
Esta podría ser una buena manera de probar estilos en un prototipo, pero no se vería poco
profesional en un proyecto ya terminado.
Estilos embebidos
Insertar los estilos en la cabecera del documento y luego usar referencias para afectar los
elementos HTML correspondientes:
<head>
...
<style>
span {
color: yellowgreen;
}
</style>
</head>
<body>
<p>Ejemplo de <span>estilo embebido</span> en la cabecera</p>
</body>
...
Esta técnica permitiría agrupar estilos durante la fase de implementación de prototipos, pero
al igual que la anterior no se recomienda para proyectos finales porque contamina el código
HTML.
La solución para no contaminar el código HTML con estilos CSS, es guardar todos los
estilos a un archivo externo y luego utilizar el elemento <link> para insertar este archivo
dentro de cada documento que los necesite. De esta manera los estilos de una página
podrían cambiar con sólo referenciar un archivo CSS diferente.
p {
color: brown;
span {
color: rgb(50, 205, 58);
}
Ahora es necesario referenciar al archivo CSS desde el archivo HTML. Esto se hace
asignando al atributo href de la etiqueta link, la ruta del archivo CSS. Veamos:
<!DOCTYPE html>
<html lang="es">
<head>
...
<link rel="stylesheet" href="./resources/css/app.css">
</head>
<body>
<p>
Ahora los <span>estilos</span> están en un <span>archivo</span>
</p>
</body>
</html>
Existen tres métodos básicos para seleccionar cuáles elementos HTML serán afectados por
las reglas CSS:
● Utilizando el nombre del elemento HTML. Ejemplo de esto es lo definido hasta ahora
en la hoja de estilos, para modificar los colores de las etiquetas <p> y <span>:
p {
color: brown;
background-color: powderblue;
}
span {
color: rgb(50, 205, 58);
}
#quijote {
background-color: antiquewhite;
}
También agregue al archivo HTML, un elemento <div> con el siguiente código:
<div id="quijote">
Me moriré de viejo y no acabaré de comprender al animal bípedo
que llaman hombre, cada individuo es una variedad de su
especie. (Cervantes)
</div>
.resaltado {
padding: 20px;
color: rgb(240, 166, 71);
background-color: rgb(3, 56, 63);
}
<div class="resaltado">
En el arte de la marinería más sabe el más sencillo marinero
que el hombre más letrado del mundo. (Cervantes)
</div>
Lo anterior es sólo una muy breve reseña de los métodos disponibles en CSS para
seleccionar elementos a los que se debe aplicar estilos. Para una completa referencia por
favor pruebe cada uno de los ejemplos que se dan en este capítulo.
Qué es el DOM
Taller
Caso 1: cree una interfaz de usuario como la que se muestra enseguida usando
sólo HTML5 y CSS.
Tenga en cuenta que esta interfa de usuario se usará para el sistema de atención al
cliente del Restaurante Laurel Gourmet, especializado en comida sana.
Caso 2: cree una interfaz de usuario como la que se muestra enseguida usando
sólo HTML5 y CSS.
Para ser sinceros, lo que se desea es cautivar con artículos de interés para que el
usuario se sienta atraído por el márketing que se muestra en el aside.
Caso 3: cree una interfaz de usuario como la que se muestra enseguida usando
sólo HTML5 y CSS.
Importante: puede consultar la web para descargar código de ejemplo y reutilizarlo correctamente.
Sin más preámbulo empecemos a analizar las características de este lenguaje. Para esto
abra la consola de las herramientas administrativas de Chrome o la consola de Mozilla
Firefox o de cualquier otro navegador de su preferencia (normalmente con F12) y vaya
probando las características que se van comentando.
Definición de variables
JavaScript es un lenguaje débilmente tipado. Esto quiere decir que no se requiere indicar de
qué tipo es cada variable que se declara. También, cualquier variable que se defina admite
cualquier tipo de datos en el momento que se requiera asignar un valor de otro tipo.
Hay una práctica anticuada de definir las variables anteponiendo la palabra reservada var y
otra moderna, utilizando let. Observe en la figura anterior, la definición recomendada
cuando se crea la variable miDato.
¿Por qué let y no var? - porque let permite declarar variables limitando su alcance (scope)
al bloque, declaración, o expresión donde se está usando en cambio var define las
variables a nivel global sin importar el ámbito del bloque.
En síntesis, se definen con let por seguridad y para que se evite dolores de cabeza a la
hora de revisar errores por redefinición de variables en varias partes o archivos de código.
Tenga en cuenta que en una expresión de la forma miDato = 4569; lo que se está
haciendo es asignar a la variable de izquierda, el valor de la derecha.
Aunque JavaScript no genera errores por omitir el punto y coma (;) al final de las
sentencias, es una buena práctica, agregarlo siempre.
Use la consola de depuración para asignar un valor a la variable miDato y luego verifique
utilizando el método log del objeto console que efectivamente el dato fue asignado.
A menos que sea absolutamente necesario, acostúmbrese a delimitar las cadenas de texto
(String) con comillas sencillas.
Tipos disponibles
● number
● boolean
● String
● Object
● undefined
Ejemplos del uso de estos tipos de datos pueden ser las siguientes definiciones que
también debería registrar por la consola:
● typeof nombre;
● typeof numero;
● typeof entendido;
De las anteriores instrucciones se deduce entonces que se usa el operador typeof cuando
requiera conocer el tipo del contenido de una variable y el operador (=) para realizar
asignaciones.
Se recomienda agregar este código al script, guardar y actualizar la página para ver
los resultados.
Además del método push, un objeto de tipo Array cuenta con muchos otros
métodos. Pruebe agregar algunos ejemplos al script con varios de los documentados
aquí.
● También se pueden utilizar una sola instrucción para registrar el array e iniciarlo:
console.log(cliente1);
cliente3.info();
En este vínculo o en este otro puede consultar información adicional sobre objetos en
JavaScript.
Operadores
Además del operador typeof que se usa para conocer el tipo de un elemento definido,
existen los operadores aritméticos suma, resta, multiplicación, división. Ejemplo:
Tenga en cuenta que se usan los paréntesis cada vez que se quieran agrupar expresiones,
de acuerdo a la jerarquía de los operadores.
Recuerde también que el operador (+) es un operador sobrecargado porque se usa también
para concatenar cadenas. Luego se mostrará una forma más moderna de concatenación:
Teniendo en cuenta que el valor inicial de la variable numero es 58 y que las instrucciones
anteriores se introducen por consola una sola vez, el resultado final de la variable debería
ser 334. Verifique este dato mediante console.log.
Importante: las variables definidas pueden ser fácilmente inicializadas a un nuevo valor,
pero si se trata de eliminar las variables definidas, el procedimiento es un poco más
complejo y muestra en la figura siguiente. Básicamente se requiere que de las
herramientas de desarrollador, elija la opción audits y luego pulse el icono
correspondiente a clear all:
● Negación: !
● Identidad o igualdad débil (no se tiene en cuenta el tipo de datos): ==
● Identidad o igualdad fuerte(se tiene en cuenta el tipo de datos): ===
● Diferencia débil (no se tiene en cuenta el tipo de datos): !=
● Diferencia fuerte (se tiene en cuenta el tipo de datos): !==
Operadores de comparación
Operadores lógicos
Operador condicional
Quedan pendientes otros operadores que se irán incorporando según las necesidades.
Al igual que es posible incluir de múltiples maneras CSS dentro de HTML, también es
posible incluir JavaScript dentro de HTML. Observe:
1. Contamine el código HTML al mejor estilo del siglo pasado, incluyendo JavaScript
dentro de las etiquetas HTML:
El ejemplo anterior permite que al pulsar clic sobre el mensaje “Clic aquí”, se
dispare el evento onclick para ejecutar la función JavaScript alert. Técnicamente se
dice que se registra un “oyente de evento” clic en el span.
<body>
<span id="lanzar_alerta">Clic aquí</span>
<script>
document.getElementById('lanzar_alerta').onclick = function () {
alert('hola mundo!');
3. Una manera menos ordinaria sería incluir la etiqueta del script donde debe estar, en
la cabecera e indicar que cuando termine la carga del documento se registre el
evento para el objeto con ID lanzar_alerta, pero se supone que un documento HTML
debería tener sólo código HTML y no mezclar Javascript y CSS. Así es que no se
preocupe si esto aún le resulta incomprensible:
<head>
<meta charset="UTF-8">
<title>Etiquetas</title>
<link rel="stylesheet" href="./../../css/estilos.css" media="screen" />
<script>
window.onload = function() {
document.getElementById('lanzar_alerta').onclick = function() {
alert('hola mundo!');
}
}
</script>
</head>
<body>
<span id="lanzar_alerta">Clic aquí</span>
...
<body>
switch (expresion) {
case valor1:
sentencia(s)1;
[break;]
...
case valorN:
sentencia(s)N;
[break;]
[default:
sentencias(s)_por_defecto;
[break;]
Define un ciclo que ejecuta una sentencia o un bloque de sentencias especificadas mientras
cierta condición se evalúe como verdadera. La condición es evaluada antes de ejecutar la
sentencia y por lo tanto se dice que es un ciclo condicionado al comienzo. Puede consultar
información adicional en MDN web docs.
Crea un ciclo que ejecuta una sentencia o un bloque de sentencias, hasta que la condición
de comprobación se evalúa como falsa. La condición es evaluada después de ejecutar la
primera sentencia y por lo tanto se dice que es un ciclo condicionado al final. Puede
consultar información adicional en MDN web docs.
1. Ubique el archivo index.html del proyecto demo01 y pulse doble clic sobre él para
abrirlo en el navegador por defecto.
"use strict";
let i;
console.log(`Valor de i = ${i}`);
Sin refrescar la página del proyecto, intente determinar el resultado que muestra por
consola la última instrucción. Luego observe el valor obtenido por consola. Si su
apreciación no coincide con el resultado, deduzca por qué a partir de consultar el
tema “Postprocesado de Plantillas”.
Algunas características de este ejemplo, son:
● Se incorpora la directiva “use strict”. En el modo estricto, se pueden
encontrar algunos errores más rápidamente, las partes más peligrosas o
inútiles de JavaScript lanzan un error de ejecución, no se puede asignar un
valor a una variable no definida, lo que sí es posible en el modo anticuado o
irrestricto donde se crearía una variable global.
En el modo estricto se lanza un error al intentar asignar un valor a una
propiedad o atributo de sólo lectura, en el modo irrestricto ésto se ignora
silenciosamente. Veamos:
{
"use strict";
window.undefined = 5; // TypeError: Cannot assign to read only
}; // property 'undefined' of [object Object]
with(objAuto) {
let objAuto = {
marca: 'Audi',
modelo: 'A2',
modelo: 'A1', // Duplicate name of property (“modelo”)
placa: 'MUU 001',
};
let a = 10;
let b = 20;
let a; // Identifier 'a' has already been declared
function pruebaArguments(a, b, c) {
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
arguments[2] = 300;
return c;
}
Tenga en cuenta que el modo estricto se puede definir a nivel del script,
como se muestra en el ejemplo o a nivel de bloques de código:
({ “use strict” ...})
genera un ciclo que itera a través de los elementos de objetos iterables (incluyendo Array,
Map, Set, el objeto arguments, etc.), ejecutando las sentencias de cada iteración con el
valor del elemento que corresponda. En el siguiente ejemplo, se crea un array de clientes y
se itera sobre dicho iterable:
const clientes = [cliente1, cliente2, cliente3];
for (let cliente of clientes) {
console.log(cliente);
}
1. Modifique de la cabecera del archivo index.html sólo la línea que referencia al script
en el que se implementaron las demostraciones iniciales, para que ahora referencie
el archivo funciones.js que se creará en la subcarpeta JS.
<head>
<!-- las demás instrucciones quedan igual que lo que se tiene -->
<script src="./vista/js/funciones.js"></script>
</head>
f1();
function f1() {
console.log('Primera prueba del llamado a una simple función');
}
function f2() {
return 'Prueba del llamado a una función que retorna un valor';
}
function sumar(a, b) {
let c = a + b;
return [a, b, c];
}
6. Las funciones JS permiten definir los llamados parámetros rest, similares a los
parámetros variables de Java. De esta manera no se restringe la cantidad de valores
que pueden pasar a una función. Sin embargo, los valores pasados deben ser todos
del mismo tipo. En otras palabras, los parámetros rest actúan como marcadores de
posición para múltiples argumentos del mismo tipo. Veamos un ejemplo:
function f3(...params) {
console.log(`Cantidad de parámetros recibidos: ${params.length}`);
console.log(`Parámetros recibidos: ${params}`);
let f = function() {
console.log('Hola anónimo');
};
f();
f = function(a, b) {
console.log(`${a + b} = ${a} + ${b}`);
};
f(30, 50);
console.log(media);
([param1, param2,…paramN])=>{instrucciones}
let fx = n => {
if (n <= 0) {
return 1;
} else {
return (n * fx(n - 1));
const n = 6;
console.log(`El factorial de ${n} es ${fx(n)}`);
10. En JavaScript existen dos maneras de definir una función, bien sea mediante
declaración de función o mediante expresión de función. La diferencia
fundamental entre los dos es que, las declaraciones de funciones se analizan antes
de su ejecución. Por otro lado, las expresiones de funciones se analizan sólo cuando
el motor de scripts las encuentra durante una ejecución.
console.log(sumar(30, 40));
function sumar(a, b) {
let c = a + b;
return [a, b, c];
}
Se han resaltado los llamados porque sería un error intentar llamar a dichas
funciones, sin que las expresiones de funciones hayan sido asignadas a los literales
f y raiz. Además recuerde que las expresiones de funciones se analizan sólo cuando
el motor de scripts las encuentra durante una ejecución.
(function() {
(function() {
for (let x = 0; x < 5; x++) {
console.log(x);
}
})(); // IIFE: inmediately invoked function expression
})();
(() =>
(() => {
for (let x = 0; x < 5; x++) {
console.log(x);
};
})())();
12. Por último demos un vistazo a las funciones generadoras, funciones cuya
ejecución puede ser pausada en un momento dado y continuada en otro posterior.
En la pausa, que se produce cuando se ejecuta una expresión con yield, la función
conserva su estado de variables. La pausa es, por tanto, ejecutada desde la propia
función generadora con yield, mientras que la reanudación sólo puede llevarse a
cabo externamente. Veamos un ejemplo de una función generadora de cada uno de
los colores del arco iris:
function* arcoIris() {
yield 'rojo';
yield 'naranja';
yield 'amarillo';
yield 'verde';
yield 'azul';
yield 'indigo';
yield 'violeta';
}
Como esta función proporciona uno a uno los colores, se requiere una forma de
acceder a cada color, observe:
let g = arcoIris();
Callbacks
Cuando se invoca una función pasándole como parámetro otra función (el callback), esta
función parámetro se ejecuta generalmente cuando la función principal ha terminado de
ejecutarse, pero también pudiera ser en cualquier otro momento del lapso de vida de la
función contenedora.
let usuario = {
nombre: 'Carlos',
id // equivale a id: id
}
};
Para el ejemplo que siguiente se debe estar familiarizado con el método find() de los objetos
arrays de JS. Este método devuelve el valor del primer elemento del array que cumple la
función de prueba proporcionada como parámetro. En cualquier otro caso se devuelve
undefined. La sintaxis es la siguiente:
arr.find(callback[, thisArg])
En la siguiente versión, se usan dos vectores de objetos para simular la recuperación de los
datos de dos tablas de una base de datos (empleados y sueldos). Note que el primer vector
tiene 3 elementos y el segundo sólo 2, por lo tanto el empleado con ID 3 no tiene un sueldo
relacionado:
let empleados = [{
id: 1,
nombre: 'Carlos'
}, {
id: 2,
nombre: 'Jorge'
}, {
id: 3,
let sueldos = [{
id: 1,
sueldo: 1000
}, {
id: 2,
sueldo: 2000
}];
console.log(empleadoDB);
};
getEmpleado(1);
getEmpleado(10);
let empleados = [{
// la misma implementación que el anterior
}];
let sueldos = [{
// la misma implementación que el anterior
}];
if (!empleadoDB) {
callback(`No existe un empleado con el ID ${id}`);
} else {
callback(null, empleadoDB);
}
};
En esta nueva versión, la función getEmpleado recibe además del ID del empleado, un
segundo argumento de tipo función, que le permite gestionar el error. Pruebe a cambiar el
primer argumento (10) por un ID de un empleado existente, para que observe los cambios
en el resultado.
Pruebe llamar a la función para un empleado inexistente, para un empleado existente pero
sin sueldo y para un empleado existente con sueldo. Ejemplo:
● Element.addEventListener
Favor consultar el documento guía donde al final se hacen algunas recomendaciones para
evitar malos entendidos en la asignatura:
El sistema flexbox es una gran mejora, sin embargo, está orientado a estructuras de
una sola dimensión, por lo que aún necesitamos algo más potente para estructuras
web. Con el paso del tiempo, muchos frameworks y librerías utilizan un sistema grid
Grid CSS nace de esa necesidad, y recoge las ventajas de ese sistema, añadiendole
numerosas mejoras y características que permiten crear rápidamente cuadrículas
sencillas y potentes de forma prácticamente instantánea. Ver:
● Flexbox Patterns
● Flexbox CSS / Ejemplos
● Grid CSS (Cuadrículas) / Ejemplo
● Guía Completa de Flexbox desde 0
● Como hacer un sitio web / layout responsive con Flexbox CSS3
● Aprende CSS Grid práctico
Caso 1: Suponga que tiene un array de objetos en donde cada objeto corresponde a
información básica de ciudades del mundo. Ejemplo:
[
{ id: 1, name: 'Kabul', countrycode: 'AFG', district: 'Kabol', population: 1780000 },
{ id: 2, name: 'Qandahar', countrycode: 'AFG', district: 'Qandahar', population: 237500 },
{ id: 3, name: 'Herat', countrycode: 'AFG', district: 'Herat', population: 186800 },
{ id: 7, name: 'Haag', countrycode: 'NLD', district: 'Zuid-Holland', population: 440900 },
{ id: 8, name: 'Utrecht', countrycode: 'NLD', district: 'Utrecht', population: 234323 },
...
]
También suponga que tiene un array de objetos en donde cada objeto corresponde a
información básica de lenguajes de programación:
[
{ id: '1', nombre: 'Python', creador: 'Guido van Rossum' },
{ id: '2', nombre: 'ECMAScript 6 o superior', creador: 'Brendan Eich' },
{ id: '3', nombre: 'Node JS', creador: 'Ryan Dahl' },
{ id: '4', nombre: 'PHP 7.0 o superior', creador: 'Rasmus Lerdorf' }
...
]
Encontrará que como estos dos arrays hay muchos casos similares, por ejemplo puede
haber arrays de clientes, de productos y de cuántos objetos se pueda imaginar para
distintos sistemas de información.
Es también común que a partir de estos arrays de objetos, sea necesario crear listas
desplegables y si cada vez que sea necesario crear una lista lo que se hace es duplicar el
código para generar la lista y realizar pequeñas modificaciones para adaptar el código,
pronto se tendrá un script de código espagueti con la repetición de la repetidera. A todas
luces esto no es una buena práctica, por lo tanto se propone la siguiente estrategia:
<select id="nombre-lista"></select>
function crearSimpleSelect({
elemento = null,
array = null,
valor = null,
texto = null
}) { ... }
Observe que esta función recibe como argumento un objeto que determina cómo
debe usarse e implementarse dicha función. Veamos:
Si esto es claro hasta aquí, no debería tener dificultades con el paso siguiente.
c. Cada elemento del array a que hace referencia el segundo atributo del objeto
recibido por la función, agréguelo al array options de la lista desplegable.
Caso 2: Se desea crear una función para generar listas de chequeo, similar a la que se
muestra en la figura siguiente, a partir de arrays de objetos como los descritos en el caso 1.
La función debe recibir como argumento, un objeto exactamente igual al descrito en el paso
2 del caso anterior.
1. Lo primero que hay que saber es que una casilla de selección es un elemento input
de tipo checkbox.
2. Lo que sigue es generar código HTML para cada objeto del array, de tal manera que
para cada elemento se genere un input de tipo checkbox. Ejemplo:
Note que los nombres de los botones se crean con el prefijo itemchk-. Esto es
importante porque más adelante dicho prefijo se utilizará para acceder mediante
selectores CSS, al conjunto de casillas seleccionables.
function crearMultiSelect({
elemento = null,
array = null,
valor = null,
texto = null
}) {
let select = elemento.substring(1) + '-checkboxes';
4. Necesitará también algunas clases CSS para darle formato en bloque a la lista, ya
que por defecto los elementos input se organizan en línea. También se necesitará
una clase para resaltar el elemento sobre el cual se vaya desplazando. Veamos:
.multiselect {
width: 200px;
}
.checkboxes {
display: block;
}
.checkboxes label {
.checkboxes label:hover {
background-color: #1e90ff;
}
5. Para probar si esto funciona, defina en una página HTML, el siguiente elemento:
crearMultiSelect({
elemento: '#index-entornos',
array: [
{ id: '1', nombre: 'Python', creador: 'Guido van Rossum' },
{ id: '2', nombre: 'ECMAScript 6', creador: 'Brendan Eich' },
{ id: '3', nombre: 'Node JS', creador: 'Ryan Dahl' },
{ id: '4', nombre: 'PHP 7.0', creador: 'Rasmus Lerdorf' }
],
valor: 'id',
texto: 'nombre',
});
7. Pruebe, debería ver una lista seleccionable como la imagen que se incluye al inicio
de este caso.
Por supuesto, el array de objetos pudo haberse referenciado también desde una
variable previamente asignada.
Caso 3: lo explicado en los dos casos anteriores se puede reunir en una clase, teniendo en
cuenta primero, que tanto si se desea seleccionar un único elemento o varios, la acción se
realiza sobre listas y segundo, que este tipo de funcionalidad es reutilizable y debemos
fomentar la cultura de bibliotecas de código reutilizable. Por lo tanto cree una clase con un
único constructor parametrizado que permita crear listas de selección única o de selección
múltiple. Enseguida se presenta la versión inicial de la clase:
'use strict';
constructor({
elemento = null,
array = null,
this.idElemento = elemento;
this.elemento = document.querySelector(elemento);
if (multiselect) {
this.crearMultiSelect({ elemento, array, valor, texto });
} else {
this.crearSimpleSelect({ array, valor, texto });
}
crearMultiSelect({
elemento = null, // ID del componente de la forma '#id-componente'
array = null,
valor = null,
texto = null
}) {
let select = elemento.substring(1) + '-checkboxes';
let opciones = '';
this.elemento.innerHTML = `
<div class="checkboxes" id="${select}">
${opciones}
</div>`;
}
crearSimpleSelect({
array = null,
valor = null,
texto = null
}) {
this.elemento.innerHTML = '';
get lista() {
return this.elemento;
}
2. Compruebe que con el mismo constructor también se puede crear una lista de
selección múltiple si se hace un ligero cambio a la instrucción 6 del caso 2:
3. Para continuar con los siguientes casos, se espera que pruebe esta clase con una
nueva aplicación que deseche lo implementado en los casos 1 y 2, pero que
continúe funcionando igual con la clase que aquí se plantea.
Caso 4: con lo explicado hasta aquí, es posible utilizar JS y CSS para generar
dinámicamente algunos elementos HTML. Ahora se requiere utilizar listeners, escuchas de
eventos, para permitir al usuario interactuar con dichos elementos. Veamos como:
Note que el parámetro event del callback es un objeto cuya accesor target retorna el
elemento de lista que pulsó el usuario. Sabiendo esto, es posible acceder a
cualquiera de los atributos del elemento de lista, en este caso el atributo value.
Esto no sólo es útil para conocer qué elemento eligió el usuario, sino que también
podría ser útil para crear listas dependientes, aquellas que actualizan los elementos
dependiendo del elemento pulsado en otra lista, por ejemplo, mostrar las
localidades, dependiendo del departamento elegido por el usuario.
3. El evento change está disponible también para otros elementos como por ejemplo
las casillas seleccionables. Para observar el comportamiento, defina la siguiente
casilla:
5. Pruebe a pulsar clic sobre la casilla para ver por consola uno de los dos mensajes
del log que indica cómo conmuta el estado checked del elemento.
7. Lo que se requiere es asignar a cada botón un evento clic. Esto se puede hacer
fácilmente así:
8. Continuando con los botones radio, implemente una función que retorne el atributo
value del botón seleccionado. Tenga en cuenta que dicha función debe funcionar
para cualquier grupo de botones radio y no sólo para los definidos en el punto 6.
Como la función debe servir para detectar el valor seleccionado para cualquier grupo
de botones, entonces el nombre de dicho grupo debe recibirse como argumento:
10. En el caso 2 se mostró cómo crear una lista de chequeo a partir de una array de
objetos. La lista de casillas seleccionables se caracteriza porque el nombre de cada
casilla empieza por el prefijo “itemchk-”. Se puede aprovechar esta particularidad
para referenciar en un array todas las casillas cuyo nombre empiece por dicho prefijo
y que además estén marcadas como seleccionadas (checked), para luego retornar
un array con los ID de las casillas marcadas. Veamos un accesor que hace esto:
get seleccionados() {
let seleccionados = document.querySelectorAll(
`${this.idElemento} input[name^='itemchk-']:checked`
);
return arraySeleccionados;
Nuevamente se recomienda estar familiarizado con los selectores CSS, que también
pueden ser usados con querySelector y querySelectorAll.
11. Para probar que el accesor creado en el punto anterior retorna un array con los ID
de las casillas seleccionadas, agregue en el script de pruebas el siguiente bloque de
código:
Si ejecuta la aplicación, cada vez que pulse clic sobre una casilla, debería ver por
consola el array de ID de las casillas seleccionadas.
Caso 5: la versión 5 de HTML proporciona varias propiedades de validación que pueden ser
usadas para verificar la correctitud de los datos que se ingresan en los formularios.
Enseguida se indican los pasos para realizar algunas pruebas.
1. Agregue a la página con la que está realizando las pruebas de estos casos, un
campo de texto de tipo email:
2. También agregue un último elemento de tipo button a la página con la que está
realizando las pruebas de estos casos:
<button id='index-btnenviar'>Enviar</button>
3. Agregue un listener al botón, para que cuando se pulse clic sobre él, se compruebe
si el correo introducido es correcto:
● El campo de entrada correo electrónico debe definirse de tipo “email” para que
HTML5 realice la validación respectiva y no podrá dejarse vacío.
● Otras restricciones:
{"aspirantes":[
{"correo":"...", "contratacion":2, ...},
...
]}
El origen de dichos datos serán las pruebas que vaya realizando y mostrando
por consola, hasta el momento de tener perfeccionado el formulario.
Presente un plan de trabajo en el que especifique las tareas que hay que desarrollar, y si
son dos o tres integrantes, quién es el encargado de cada una.
● Revisión de objetivos.
Es necesario que antes de seguir adelante, esta parte sea socializada con el director
del proyecto (en este caso el profesor de la asignatura).
Con base en el producto listo para producción, verifique qué nuevos conocimientos adquirió.
Finalmente prepare la presentación del producto, a partir de lo cual deberán hacerse las
revisiones del caso y las reflexiones sobre lo aprendido y lo que es necesario enfatizar.
Nota: si logra que a medida que el usuario vaya realizando los ingresos, se muestre por
consola el estado de un objeto como el que se muestra enseguida, tendra bono adicional:
let aspirante = {
correo: '',
Con estado se indica los valores que van siendo asignados en los atributos cada vez que el
usuario ingresa un dato o hace un cambio en el formulario.
● https://codepen.io
● https://jsfiddle.net
● Ionicons
● El diseño del Santo Grial
● Maquetación con grid
● CSS Grid, la solución a los problemas de float y flexbox
Este protocolo establece las pautas a seguir, los métodos de petición (llamados “verbos”),
bajo un esquema de petición-respuesta entre el cliente y el servidor. Un cliente puede ser
un explorador determinado, al que el servidor brinda una respuesta estructurada de modo
puntual y dotada de una serie de metadatos, que establecen las pautas para el inicio,
desarrollo y cierre de la transmisión de la información. Estos son los “métodos de petición”,
es decir, los comandos que disparan la ejecución de recursos determinados, cuyos archivos
residen en el servidor.
Por ejemplo: Al abrir una página web específica, el intercambio informativo entre nuestro
explorador web y el servidor donde reside la información establecerá de qué manera debe
transmitirse la información, en qué lugar están las imágenes y en qué orden se mostrarán,
etc. Este intercambio de comandos de solicitud y códigos de respuesta da como resultado la
representación en el computador cliente de la misma información contenida originalmente
en el servidor, que puede estar a miles de kilómetros de distancia o en una red local o
incluso en el mismo computador donde recide el navegador que hace la petición.
Se recomienda ver este video para acceder a una corta e interesante explicación de cómo
funciona el protocolo HTTP.
En aplicaciones del siglo pasado como ésta, era común hacer peticiones síncronas en las
que era necesario cargar toda la página cada vez que se hacía una petición al servidor,
actualmente dicha práctica ha caído en desuso y el acceso a recursos de un servidor se
realiza de manera asíncrona mediante Ajax o más recientemente, mediante Fetch, que
pretende ofrecer una nueva interfaz estándar de uso de Ajax, compatible en todos los
navegadores, a la vez que permite usar promesas, que nos facilitan la organización del
código asíncrono en las aplicaciones.
Tanto si se usa Ajax puro o una librería como JQuery o si se usa la API Fetch para hacer
solicitudes asíncronas, ya no será necesario recargar toda la página cada vez que se
obtiene una respuesta del servidor, sino que el contenido de la respuesta se podrá incrustar
en un elemento de la página actualmente desplegada, dando lugar a lo que se conoce como
SPA (Single Page Application), un tipo de aplicación web donde todo el contenido se
muestra en la misma página, sin necesidad de las recargas habituales en el siglo pasado.
Suponga que tiene en un nuevo proyecto el siguiente archivo JSON guardado como
../data/paises.json:
[{
"code": "AFG",
"name": "Afghanistan",
"continent": "Asia",
"region": "Southern and Central Asia",
"surfacearea": 652090,
"indepyear": 1919,
"population": 22720000,
"lifeexpectancy": 45.9,
"governmentform": "Islamic Emirate",
"capital": 1,
"codecapital": "AF"
},
...
{
"code": "UMI",
"name": "United States Minor Outlying Islands",
"continent": "Oceania",
"region": "Micronesia/Caribbean",
"surfacearea": 16,
"indepyear": 0,
"population": 0,
"lifeexpectancy": 0,
"governmentform": "Dependent Territory of the US",
"capital": 0,
"codecapital": "UM"
}
]
Y suponga que tiene el siguiente código en un scrip JS como los que viene trabajando:
fetch('https://www.datos.gov.co/resource/qi54-achv.json')
.then(response => response.json())
.then(json => console.log(json))
.catch(function(err) {
console.error(err);
});
});
Construya una tabla en la que muestre de manera paginada los registros del archivo JSON.