1 of 83

Javascript

2 of 83

Agenda

  • Breve historia y presente
  • Javascript, ¿ para que ?
  • Vamos a aprender el lenguaje mientras hacemos un ejemplo.

3 of 83

Breve Historia

  • Desarrollado por Brendan Eich 1995.
  • Se llamó Mocha, después LiveScript.
  • Primer navegador con soporte: Netscape 2.
  • NO TIENE RELACIÓN CON JAVA

4 of 83

Presente

  • Es uno de los lenguajes de programación más utilizados.
  • Hay un intérprete en cada máquina (Navegadores).
  • Principal uso, del lado del cliente.
  • Por su popularidad se ha extendido a otras aplicaciones y entornos.
  • Existe también del lado del servidor (Node.js).

5 of 83

Estadísticas

2015

#Proy. En GitHub

#tags en StackOverflow

6 of 83

Javascript ¿para qué?

  • Se popularizó con DHTML (páginas dinámicas).
  • La web dejó de ser un conjunto de markup documents, para tener comportamiento de acuerdo al usuario.
  • DHTML = HTML + CSS + JavaScript + DOM

7 of 83

Javascript ¿para qué?

Algunos ejemplos:

  • Validar formularios (lo que no permita HTML5)
  • Reaccionar a lo que haga el usuario (click, teclear, etc)
  • Cambiar algo al pasar el mouse (si no lo permite CSS)
  • Partes de páginas que se muestran/ocultan.
  • Hacer cálculos complejos.
  • Carga dinámica de contenido (AJAX)

8 of 83

Atwood’s Law

Corolario del Principle of Least Power

Any application that can be written in JavaScript, will eventually be written in JavaScript.

Es la chica de moda de la programación hoy.

9 of 83

10 of 83

ECMAScript 6 (ES6)

11 of 83

ES6 - El estándar

  • ES6 es el anteúltimo estándar de JavaScript.
  • ES7 ya está aprobado y están trabajando en ES8.
  • Aprobado en Junio de 2015.
  • El más grande cambio en Javascript en años.
  • Cambios de sintaxis y estructura para un código más simple y compacto.
  • Ya soportado casi 100% por navegadores modernos.
  • Link para chequear compatibilidad

12 of 83

ES6 - Cambios

Entre los cambios más notables:

  • Una sintaxis más clara para la creación de objetos con herencias, similar a otros lenguajes orientado a objetos.
  • Mejora la declaración de variables.
  • Manejo de números en código binario y octal.
  • Arreglos tipados.
  • Organización de código basado en módulos, mejora estructura y la reusabilidad del código.
  • Nuevas funciones matemáticas.
  • Función Arrow, permite hacer una abreviación del código.

Vamos a indicar cambios de sintaxis del lenguaje con este icono

13 of 83

ES6 - Referencias

14 of 83

Ejemplo

Hacer una aplicación web que al apretar un botón simule el lanzamiento de dos dados 1000 veces, sumarlos y muestre en el HTML la cantidad de veces que se dá cada resultado posible.

15 of 83

16 of 83

¿Qué tenemos que hacer?

Aprender JS

Hacer algo cuando haga click

Tirar dos dado de 1 a 6

Mostrar los dados

Sumarlos

Guardar el resultado

Mostrar cuántas veces salió cada uno

Que se repita muchas veces

17 of 83

Analicemos el problema

  1. Incluir un archivo Javascript
  2. Ejecutar un código al presionar un botón.
  3. Hacer una función.
  4. Tirar los dados.
  5. Mostrar los dados en la página web.
  6. Contar las apariciones de cada suma.
  7. Tirar el dado muchas veces seguidas
    1. Que la cantidad de veces se lea desde la página web.

18 of 83

19 of 83

Resolver el problema

  • 1-Incluir un archivo Javascript

Ejemplo Paso 1: http://codepen.io/webUnicen/pen/gremaR

20 of 83

Como incluir un Javascript

Conviene incluir un archivo Javascript separado. Se ejecuta su código en la línea donde se incluye.

Incluirlo al final del body, luego de que ya se cargo el html con todos sus elementos.

Se pueden agregar varios archivos .js

21 of 83

Función Alert

  • La función alert nos muestra una alerta en nuestro navegador.
  • La forma de usarla es:

alert([mensaje])

  • Es útil para mostrar valores de validación en un formulario.
  • Ahora vamos a usarla para saber si se está ejecutando nuestro archivo Javascript.

Ejemplo Paso 2: http://codepen.io/webUnicen/pen/eZMvzo

22 of 83

Resolver el problema

2- Ejecutar un código al presionar un botón.

3- Hacer una función.

23 of 83

Sintaxis JavaScript

Sintaxis C-Like (similar a Java, PHP, C++, etc)

  • Operadores (+, *, =, !=, &&, ++, …)
    • Después vemos las diferencias...
  • Condicionales (if, else), (switch, case)
  • Bucles (for, while)

Así que la sintaxis básica ya la sabemos!

24 of 83

Funciones

“Una función es un conjunto de líneas de código que realizan una tarea específica y puede retornar un valor. Las funciones pueden tomar parámetros que modifiquen su funcionamiento.”�

25 of 83

Funciones - Creación

  • En Javascript no hay diferencia entre funciones y procedimientos.
  • Una función puede o no devolver datos.

function saludar()

{

alert(“Hola”);

}

26 of 83

Funciones - Ejecución

function saludar()

{

alert(“Hola”);

}

  • Para llamar a esta función tengo que invocar su “firma”.�

saludar();

  • Esto va a mostrar un cartel que diga Hola.

Ejemplo: http://codepen.io/webUnicen/pen/YZmNwZ

27 of 83

Comentarios

¿Qué tanto comentar el código?

  • Cada método o función (describiendo lo que hacen y los parámetros). Siempre y cuando el nombre y los parámetros no se auto-documenten.
  • Código difícil de entender (switch-case, números mágicos, etc)
  • Cosas que podrían parecer un error (usar = en lugar de == adrede, conviene aclararlo)

28 of 83

Eventos

  • Un evento es algo que ocurre en el sistema, originado por el usuario o otra parte del sistema y que se avisa al sistema.
  • Ejemplos:
    • El usuario hace click.
    • Se terminó de cargar la página.
    • Pasó un segundo desde que se terminó de procesar.
  • Las interfaces gráficas suelen programarse orientada a eventos.

29 of 83

Programación dirigida por eventos

Un programa dirigido por eventos sigue los siguientes pasos:�

  • Comienza la ejecución del programa.
  • Se llevan a cabo las inicializaciones y demás código inicial
  • El programa queda bloqueado “Escuchando” hasta que se produzca algún evento.��

30 of 83

Programación dirigida por eventos

31 of 83

Programación dirigida por eventos

Programación secuencial

  • Sabemos el flujo de la ejecución.�

Programamos dirigida por eventos

  • No sabemos la secuencia exacta de ejecución.
  • Se disparan diferentes códigos con diferentes acciones.�

Ev 1

Ev 1

Ev 1

Ev 2

Ev 2

Ev 3

Ev 3

Ev 3

Ev 2

Ev 2

Ev 2

32 of 83

Programación dirigida por eventos

Se definen:

  • Eventos (Click, Drag, Hover, Load, etc.)
  • Funciones que se ejecutan en esos eventos (Ej: mostrar un alert).
  • Se llama el “controlador de eventos”.

33 of 83

Eventos

  • Los eventos son capturados por manejadores (handlers).

  • HTML

  • Javascript

Evento

Función

(handler o callback)

No recomendado

(por ahora se hace así)

34 of 83

Eventos

Ejemplos de eventos:

Hay 50~100 eventos: http://www.w3schools.com/jsref/dom_obj_event.asp

Ejemplo Paso 2: http://codepen.io/webUnicen/pen/ZegLJz

35 of 83

Resolver el problema

4-Tirar los dados.

36 of 83

Variables y Constantes

Antes de ES6

ES6

Declarar una variable

var nombre = “Pepe”;

Declarar una constante

No existen

Declarar una variable

let nombre = “Pepe”;�

Declarar una constante

const cantDados = 2;

37 of 83

Tipado de Variables - Tipos

  • El tipado estático nos obliga a definir desde el principio el tipo de una variable. Lenguajes con tipado estático son C++, Java, C# (casi) entre otros.
  • El tipado dinámico nos da la facilidad de no definir los tipos al declarar una variable, algunos ejemplos son PHP, JavaScript, Grooby, Phyton, entre otros.
  • ¿Se les ocurren pros y contras?

http://qbit.com.mx/blog/2012/01/16/tipado-estatico-vs-tipado-dinamico/

38 of 83

Tipos

  • Javascript tiene tipos dinámicos.
  • Una misma variable puede cambiar de tipo.
  • Puede causar confusiones (y errores que no encuentro durante horas).

let nombre = “Pepe”; //nombre es un string

nombre = 2; //nombre es un int (cambia tipo)

Mala práctica

39 of 83

Tipos de Datos

  • String
  • Number
  • Boolean
  • Null
  • Undefined
  • Object
    • Function
    • Array
    • Date
    • Expresiones Regulares (RegExp)

40 of 83

Conversión de tipos

  • Cuidado con los tipos, son dinámicos y no saber de qué tipo es una variable puede cambiar el resultado.

5 == “5”//true

“1” + 2 + 3;//"123"

//Conversion manual de tipos�parseInt(“1”, 10) + 2 + 3; //6

  • ES6 introduce una nueva forma de trabajar con Strings

'('+nombre+', '+apellido+')'

`(${nombre}, ${apellido})`

41 of 83

Variables

  • Las variables pueden declararse de forma implícita.
  • La primera vez que uso una variable se declara “automáticamente”.

let nombre = “Pepe”;

nombbre = “Juan”; //error, tipeo mal la variable, crea una variable global nueva

comparacion = (nombre == “Juan”) //false

42 of 83

Use Strict

  • Es una buena práctica escribir al comenzar un archivo Javascript.

“use strict”;

  • Convierte en obligatoria la declaración de variables.
  • Restringe otros posibles errores de sintaxis.

“El use strict hace que el navegador se ponga la gorra!

43 of 83

Naming

  • Usar nombres descriptivos (no importa que sean largos).
  • Las variables se nombran con sustantivos.
  • Las funciones comienzan con verbos.
  • En el caso de funciones booleanas, deben comenzar con "is", ej: isValid()
  • Evitar nombres sin significado como "aux" y "temp".

44 of 83

Operadores de comparación

  • = Asignación

let nombre = “Nacho”

  • == Igualdad (!=)

if( 5 == “5”) {

//true

}

  • === Identidad (!==)

if( 5 === “5”) {

//false

}

45 of 83

Siempre usar ===

  • Recordemos que (==) hace conversión automática de tipos
  • A veces el resultado de esta conversión no es obvia.
  • Evitar esto usando (===)
  • Lo mismo para != (usar !==)

46 of 83

Comparaciones cortas en JS

  • El ; es opcional, pero es una buena práctica usarlo.
  • Obligatorio cuando minificas el script.

  • If más corto:

let tmp = (bool) ? 1 : 2

es igual que

let tmp = 0;

if(bool)

tmp=1;

else

tmp=2;

47 of 83

Falsey evaluation

En Javascript, hay diferentes cosas que al convertirla a bool, se transforma a false automáticamente.

Null == undefined == 0 == false == ""

No es tan así, pero es una buena simplificación.

let a = null; let b; //undefined

let c = 0; let d = false;

let e = "";

if (a), if (b), if (c), if (d), if (e) //false

Puedo pasarme horas revisando un bug en una comparación, que era por un undefined en la variable.

48 of 83

Falsey Evaluation

  • Por costumbres de otros lenguajes, es normal escribir condicionales tipo C.
  • Los condicionales JS son más cortos y eficientes.

49 of 83

Funciones - Parámetros

  • Cualquier argumento puede ser omitido o agregado.

function sumar(a, b, c)

{

return a + b + c;

}

sumar(1, 2, 3); //6

sumar(1, 2); //NaN : Hace 1+2+undefined

sumar(1, 2, 3, 4, 5, 6); //6

50 of 83

Funciones - Parámetros

Concepto: Lista de argumentos.

function sumar()

{

let sum = 0;

let length = arguments.length;

for (let i=0; i<length; i++){

sum += arguments[i];

}

return sum;

}

Cuidado con esto, puede volver el código ilegible, y convertirse en una mala práctica.

sumar(1, 2, 3); //6

sumar(1, 2); //3

sumar("1" , 2, 3, 4, 5);

//"012345" /*TIPOS DINÁMICOS, APARECE UN 0 */

51 of 83

Random

  • Para generar números al azar podemos usar

Math.random();

Así obtenemos un número al azar entre 0 y 1 (0 inclusive, 1 no).

Las caras de un dado son del 1 al 6, ¿cómo hacemos?

Ejemplo Parte 3: http://codepen.io/webUnicen/pen/RaMpoV

Más info: https://developer.mozilla.org/en-US/docs/Web/JavaScri...

52 of 83

Debug

  • Es ver paso a paso las tareas que realiza un programa, observando los pasos y los valores de las variables.
  • Se usa para la búsqueda y eliminación de errores (bugs).

Breakpoint:

  • Marca una sentencia a partir de la cual hacer el debug.

53 of 83

Debug

Solapa de códigos

Archivos

Consola

Breakpoint

(click para agregar)

Info útil

Menú Chrome > Más herramientas > Herramientas Desarrollador

Atajo de Teclado: Ctrl + Shift + I

54 of 83

Debug

  • Comando "debugger;" setea un breakpoint en esa línea.
  • "console.log("cadena")" imprime algo en la consola del debugger.

55 of 83

Syntax Error

Herramientas para analizar errores de sintaxis

56 of 83

Syntax Error

En Chrome se detectan errores luego de ejecutar el .js

57 of 83

Resolver el problema

5-Mostrar los dados en la página web.

58 of 83

DOM: El árbol HTML

Cuando estudiamos CSS vimos que podíamos representar la estructura del HTML con un árbol. Este árbol se llama DOM.

59 of 83

Introducción a DOM

El Document Object Model es una API (Application Programming Interface) para documentos HTML y XML.

  • Representación estructurada del documento
  • Permite modificar el contenido
  • Es lo que conecta las páginas web con Javascript.

El DOM es un árbol de objetos...

60 of 83

Objetos

  • En la vida real todos los objetos tienen una serie de características y un comportamiento.
  • Por ejemplo, una puerta tiene color, forma, dimensiones, material... (características) y puede abrirse, cerrarse... (comportamiento)
  • En POO, un objeto es una combinación de unos datos específicos y de las rutinas que pueden operar con esos datos.

61 of 83

Objetos

  • Campos o atributos: almacenan datos. Estos datos pueden ser de tipo primitivo y/o otro tipo de objeto (composición de objetos).
  • Rutinas o métodos: lleva a cabo una determinada acción o tarea con los atributos.

62 of 83

Objetos en el DOM y JS

Existen muchos objetos ya predefinidos. Algunos son:

  • Window: La ventana/pestaña del navegador. Es quien tiene el método “alert” que usamos antes.
  • History: El historial, nos permite ir adelante, atrás, etc
  • Location:La URL de la barra de navegación.
  • document: El DOM de los elementos del body y header de este archivo HTML.

63 of 83

Objetos en el DOM y JS

Al DOM podemos:

  • Agregarle nodos (es como escribir nuevas etiquetas en el HTML).
  • Editar nodos (es como cambiar el HTML) para alterar propiedades o el contenido interno (el HTML que contiene).
  • Borrar nodos (es como borrar las etiquetas).

64 of 83

Objetos en el DOM y JS

  • Si le diéramos name a todo podríamos navegarlo fácilmente.
  • Pero se volvería dependiente de la estructura.

<body>

<form name="mainForm">

<input type="text" name="textBox1" />

document.mainForm.textBox1. value;

65 of 83

Obtener nodos del DOM

  • Se pueden obtener elementos del DOM consultando por un ID, nombre, clase o un selector.

let elem = document.getElementById("identificador");

let arr = document.getElementsByName("nombre");

let imgTags = document.getElementsByTagName("img");�let singleElem = document.querySelector(".myclass");

let manyElems = document.querySelectorAll(".myclass");

Más info: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector

66 of 83

Recorrer el árbol DOM

Los elementos del DOM se pueden recorrer como un árbol:

  • element.childNodes
  • element.parentNode
  • element.nextSibling
  • element.previousSibling
  • element.firstChild
  • element.lastChild

67 of 83

Editar el DOM

  • La propiedad style permite cambiar el estilo CSS de ese elemento (como si lo hubiera escrito en el HTML).
  • Se usa para cambiar cosas a un elemento solamente (ocultar/mostrar, etc).

let lampImg = document.getElementById("lamp");

lampImg.style.width = "100%";

68 of 83

Editar el DOM

Las propiedades se pueden editar desde Javascript.

let lampImg = document.getElementById("lamp");

lampImg.src = "foto.png";

let unDiv = document.getElementById("unDiv");

unDiv.innerHTML = "Cambiar contenido";

let unBoton = document.getElementById("unBoton");

unBoton.className = "activo";

Ejemplo Parte 4: http://codepen.io/webUnicen/pen/LNdWxN

69 of 83

Resolver el problema

6-Contar las apariciones de cada suma.

70 of 83

Arreglos

Los arreglos almacenan elementos en una colección de datos ordenados.

Los elementos se acceden por índice (comienzan en 0).

let cars = ["Saab", "Volvo", "BMW"];

Acceder a un arreglo:

let car = cars[0];

console.log(car); //”Saab”

71 of 83

Arreglos

let arr = [1,2,3]

// definición

arr[0]

// 1

arr[5]

// undefined

arr[5] = “texto”

// [1,2,3,undefined, undefined, “texto”]

delete arr[2]

// [1,2,undefined,undefined, undefined, “texto”]

72 of 83

Recorriendo Arreglos

let arr = [1,2,3]

// Antesfor (var i=0; i<arr.length; i++) { // 1, 2, 3var elem = arr[i];� console.log(elem);

}

// ES6for (let elem of arr) { // 1, 2, 3� console.log(elem);�}

73 of 83

Resolver el problema

7-Tirar el dado muchas veces seguidas (para mostrar uso

de bucles-for).

7b-Que la cantidad de veces se lea desde la página web.

74 of 83

Complicarla un poco

  • Tirar muchas veces el dado

Ejemplo Parte 6: http://codepen.io/webUnicen/pen/BKrWrV

75 of 83

Resolver el problema

8-Tirar los dados automáticamente cada cierto tiempo.

76 of 83

Eventos en ES6

Asignar handlers en HTML es mala práctica

porque mezcla HTML y JavaScript.

En ES6, primero buscamos el elemento y luego le asociamos el handler

HTML

JS

<button type="button" class="btn" id="btn-enviar">Enviar</button>

<button type="button" class="btn" onclick="verificarFormulario();">Enviar</button>

let btn = document.getElementById("btn-enviar")

btn.addEventListener("click", verificarFormulario)

No recomendado

77 of 83

Eventos en ES6

¿Qué pasa si la función tiene parámetros?

JS

let btn = document.getElementById("btn-enviar")

let inputEmail = document.getElementById("input-email")

let inputConsulta = document.getElementById("input-consulta")

btn.addEventListener("click", function(e){

verificarFormulario(inputEmail,inputConsulta)

} )

function verificarFormulario(email, consulta)

{

...

Live: https://codepen.io/webUnicen/pen/qmZOaV

Una nueva función que llama a verificarFormulario con sus parámetros

78 of 83

Eventos de tiempo

Se puede programar un evento, para ejecutar una función dentro de M milisegundos.

//dispara (ejecuta bang) en 5 segundos

let timer = setTimeout('bang()', 5000);

Ejemplo Parte 7: http://codepen.io/webUnicen/pen/jqzBpJ

79 of 83

Eventos de tiempo

Otra forma:

let timer = setInterval('clock()', 1000);

clearInterval(timer);

setInterval llama a la función cada 1000 milisegundos, hasta que se limpie el intervalo.

Es una mejor opción para este caso.

80 of 83

Ejemplos

81 of 83

Ejercicios

Ejercicio #1

  • Utilizando lo visto en esta clase, crear una función Javascript que oculte y muestre un div que contiene información.
  • Analizar cómo modificar el ejercicio para que sea un código reutilizable (poder poner muchos botones que oculten o muestren un div respectivo)

Ejercicio #2

  • Tengo una lista de tareas, y quiero dinámicamente (sin refrescar la página) agregar tareas.

82 of 83

Más Información

Libros

  • Javascript and Jquery : Interactive Front-End Web Development, Jon Duckett Willey 2014
  • Learning Web Design: A Beginner's Guide to HTML, CSS,
  • JavaScript, and Web Graphics, Jennifer Niederst Robbins O'Reilly Media 2012

Eventos

83 of 83

AHORA LES TOCA PRACTICAR :D