History: Javascript

Revision made 8 years ago by Francisco Presencia. Go to the last revision.

Aprenderás cómo usar este lenguaje de interacción y a que ocurran cambios en la web a medida que el usuario vaya interactuando con la misma.

Si ya sabes algún lenguaje de programación, puedes leerte por encima la parte común a todos los lenguajes e ir directamente al apartado jQuery.

Vari­ables

There are many ways to re­present in­for­ma­tion. You can re­present the numb­er of students with an in­teg­er, your name with a str­ing (text), etc. But in pro­grams you might want to reuse these so you store them some­where: in vari­ables.

A vari­able is a place where you store some in­for­ma­tion. Im­agine that you want to store a hy­pot­het­ical numb­er of students of Libre Uni­vers­ity, 80. You would do so like this in javascript:

var students = 80;

We are creat­ing the vari­able students with the keyword var and as­sign­ing it the value of 80. Now we want to get the numb­er of students for next year, tak­ing into ac­count that 20 students will graduate and 30 new students will join. We could do it like this:

var students = 80;
var graduating = 20;
var joining = 30;
var nextyear = students + joining - graduating;

Vari­able types

Some ex­am­ples of vari­ables with a com­ment ( // ... ) nam­ing them:

// Number:
var years = 24;

// Boolean:
var married = true;

// String:
var address = "Street 24, New York";

// Array (of strings):
var friends = ["Mary", "John", "July"];

// Object
var friend = { firstname: "Peter", lastname: "Smith" };

To dis­play them you can use the func­tion alert() and a pop-up will show you the value.

Con­trol struc­tures

The pro­grams nor­mal­ly ex­ecute from top to bot­tom, line by line. Howev­er there are few struc­tures in javascript that can chan­ge this, one being con­trol struc­tures. The charac­teris­tic of them is that they are a single op­era­tion fol­lowed by a code block de­limited by { }, and that block is the part that gets modified.

if ( con­di­tion )

When using the vari­ables men­tioned above some­times you want that a piece of code is ex­ecuted in one situa­tion or not. For doing this we use the if clause:

var name = "John";

if (name == "Peter") {
  alert("Hello Peter");
}

if (name == "John") {
  alert("Hello John");
}

Notice how we use == in­stead of =. This is be­cause a single equal sign is used to as­sign a vari­able, while a doub­le (or tri­ple) equal is used to com­pare two th­ings.

But what do you do when you also want to do some­th­ing when the state­ment is not true? Then you can use the else clause:

var name = "Peter";
if (name == "Peter") {
  alert("Hello Peter");
}
else {
  alert("You are not Peter!");
}

We can com­pare any type of vari­able. You can also com­pare numb­ers and op­era­tions like great­er than or small­er than like this:

var age = 17;
if (age >= 18) {
  alert("You are allowed to see this page");
}
else {
  alert("This page is only for adults");
}

for ( in­iti­al ; con­di­tion ; chan­ge )

There's an­oth­er im­por­tant con­trol struc­ture cal­led for. It is used when you want to per­form an op­era­tion many times but you don't want to write the same code over and over again. For ex­am­ple, say Bloody Mary 3 times:

for(var i = 0; i < 3; i++) {
  alert("Bloody Mary");
}

Note how we put i < 3 to dis­play it three times, since it will be ex­ecuted when i is 0, when i is 1 and when i is 2. If we had said i <= 3 then we'd also ex­ecute the block when i is 3, so it'd be 4 times in total.

.forEach(func­tion(){})

A similar one would be .forEach(). It is used to loop an array, howev­er we'll see it later since it in­vol­ves met­hod and callbacks, some more ad­vanced tech­niques.

Func­tions

A func­tion is a piece of code that takes an input and re­turns an out­put. Let's see a typ­ical ex­am­ple, the func­tion "sum":

function sum (a, b) {
  return a + b;
}

This func­tion ac­cepts two ar­gu­ments and re­turn the sum of them. To use it you can test this code:

function sum (a, b) {
  return a + b;
}
var result = sum(5, 7);
alert(result);

Ob­jects and met­hods

An ob­ject is a type of vari­able that can con­tain other ele­ments cal­led pro­pert­ies. It is dif­ferent from an array in that each ele­ment has a name. For ex­am­ple, you can have the ob­ject per­son:

var person = {
  firstname: "John",
  lastname: "Doe",
  age: 21
};

To read or write one of the pro­pert­ies of per­son you can ac­cess them using a .:

var person = {
  firstname: "Jonh"
};

// Oops, we made a typo in firstname. Fix it:
person.firstname = "John";

// Display the name of the person
alert(person.firstname);

Ob­jects can also store func­tions. Let's allow for the pre­vi­ous per­son to say his name:

var person = {
  firstname: "John",
  sayHi: function(){
    alert("Hi, I'm John");
  }
};

// It shows "Hi, I'm John"
person.sayHi();

this

To ac­cess a vari­able with­in an ob­ject or func­tion, you can use this keyword. For the last ex­am­ple:

var person = {
  firstname: "John",
  sayHiTo: function(to){
    var name = this.firstname;

    // Join the string with the name
    alert("Hi " + to + ", I'm " + name);
  }
};

// It shows "Hi Peter, I'm John"
person.sayHiTo("Peter");

Async

There are some times that we want to execute an action when something special happens. For example, let's say we want to execute a function after 1 second. In other languages you'd do something like this:

some actions
sleep(1000) // sleep 1000ms
actionAfter1s()
other actions

However, we wouldn't be able to execute "other actions" until after we have executed the sleep(1000). This is bad to do many things at the same time, so javascript uses async functions to do that. There are some functions defined as async that accept a function as a variable and then execute it when the condition is met. For the same example as above, we would do this in javascript:

alert(1);

function actionAfter1s(){
  alert(3);
};

// Async function, 'setTimeout'
setTimeout(actionAfter1s, 1000);

alert(2);

In this way, we would see "1", "2" and then "3" after 1 second in that order on the screen. This is great so scripts don't block each other and many things can be executed independently.

However, you should also be careful, as if you are accesing outside variables they might have changed by the time you use them. This will display "3" three times instead of 1, 2 and 3:

for(var i = 0; i < 3; i++) {
  setTimeout(function(){
    alert(i);
  }, 1000);
}

jQuery

Por ahora hemos visto cómo funciona javascript como lenguaje de programación. Pero este también se usa para interactuar con la web, por lo que podemos acceder al HTML directamente desde el mismo. Normalmente se usa la librería jQuery, ya que facilita mucho las cosas.

La misma usa selectores de CSS para encontrar elementos en el html.

// Encuentra todos los parrafos en la web
var parrafos = $('p');

// Encuentra todos los elementos con la clase "button" (usamos ".")
var botones = $('.button');

Tras esto, podemos interactuar con los mismos. Por ejemplo, digamos que queremos cambiar todos los párrafos por un "Hola Mundo!". Podríamos hacerlo de la siguiente forma:

var parrafos = $('p');
parrafos.html('Hola Mundo!');

O podemos simplificarlo a:

$('p').html('Hola Mundo!');

Esta propiedad se llama "chainable", que quiere decir que podemos, con un mismo selector, aplicarle varias operaciones. Ahora añadiremos una clase a todos los párrafos, a parte de cambiarles el contenido:

$('p').html('Hola Mundo!').addClass('superparagraph');

Estos métodos (funciones), html() y addClass(), son definidos por jQuery y puedes encontrar una lista en la Documentación Oficial, pero estos son de los más usados:

.on()

.html(), .append(), .prepend()

.addClass(), .hasClass(), .removeClass()

.attr()

Y no sólo eso, sino que algunos de estos métodos tienen varios usos. Por ejemplo, si usamos el método .html() sin ningún parámetro nos devolverá el contenido del [primer] elemento seleccionado, mientras que si le ponemos algo dentro cambiará el html a todos los elementos seleccionados:

// Recupera el texto del primer párrafo
var texto = $('p').html();

// Cambia el texto de todos los párrafos
$('p').html('Hola mundo!');

También podemos hacer uso de eventos. Uno de los métodos más usados, .on(), se usa para cuando el usuario hace algo. Como por ejemplo click. Como esto es un evento asíncrono, le pasamos una función que será la que se ejecute cuando el usuario haga click en el elemento seleccionado:

$('button').on('click', function(){
  alert('Hola Mundo!');
});

Haciendo Like

Esto resulta muy útil cuando, por ejemplo, queremos cambiar algo cuando el usuario le da click a Like. Para esto, nos definiremos el siguiente HTML:

<button data-id="25">Like</button>

Con el siguiente estilo en CSS:

button {
  color: #000000; /* negro */
  background: #ffffff; /* blanco */
}

.liked {
  color: #ffffff; /* blanco */
  background: #ff0000; /* rojo */
}

Y el siguiente javascript:

// Cuando el usuario hace click en un elemento button
$('button').on('click', function(){

  // Le toggleamos (añadir/quitar) la clase "liked"
  // "this" es el elemento sobre el que has hecho click
  $(this).toggleClass('liked');
});

Puedes ver el resultado en jsfiddle.

AJAX, llamadas al servidor

Pero si nos fijamos, si hacemos "Like" y refrescamos la página el estado se habrá borrado. Esto es porque el servidor no sabe qué estamos cambiando, sólo lo sabe nuestro navegador. Para enviarle esta información al servidor usaremos AJAX (Asynchronous JavaScript and XML):

// Cuando el usuario hace click en un elemento button
$('button').on('click', function(){

  // Le toggleamos (añadir/quitar) la clase "liked"
  // "this" es el elemento sobre el que has hecho click
  $(this).toggleClass('liked');

  // Recuperamos el id del elemento
  var id = $(this).data('id');

  // Vemos si le hemos dado a like o lo hemos cancelado (true/false)
  var isLiked = $(this).hasClass('liked');

  var url = '/like';
  var data = { id: id, like: isLiked };
  var done = function(){
    alert('Hecho!');
  }

  // Enviamos la petición al servidor
  $.post(url, data, done);
});

Sin embargo, si lo probamos no funcionará ya que la url /like no existe ahora mismo. Es importante que veamos cómo enviar las peticiones, pero cómo y dónde recibirlas lo veremos en el siguiente capítulo.