¿ Que es AJAX ?

AJAX, acrónimo de Asynchronous JavaScript And XML (JavaScript asíncrono y XML), es una técnica de desarrollo web para crear aplicaciones interactivas o RIA (Rich Internet Applications). Estas aplicaciones se ejecutan en el cliente, es decir, en el navegador de los usuarios mientras se mantiene la comunicación asíncrona con el servidor en segundo plano. De esta forma es posible realizar cambios sobre las páginas sin necesidad de recargarlas, mejorando la interactividad, velocidad y usabilidad en las aplicaciones.

Ajax es una tecnología asíncrona, en el sentido de que los datos adicionales se solicitan al servidor y se cargan en segundo plano sin interferir con la visualización ni el comportamiento de la página. JavaScript es el lenguaje interpretado (scripting language) en el que normalmente se efectúan las funciones de llamada de Ajax mientras que el acceso a los datos se realiza mediante XMLHttpRequest, objeto disponible en los navegadores actuales. En cualquier caso, no es necesario que el contenido asíncrono esté formateado en XML.

Ajax es una técnica válida para múltiples plataformas y utilizable en muchos sistemas operativos y navegadores dado que está basado en estándares abiertos como JavaScript y Document Object Model (DOM).

Tecnologías incluidas en Ajax

Ajax es una combinación de cuatro tecnologías ya existentes:

XHTML (o HTML) y hojas de estilos en cascada (CSS) para el diseño que acompaña a la información.
Document Object Model (DOM) accedido con un lenguaje de scripting por parte del usuario, especialmente implementaciones ECMAScript como JavaScript y JScript, para mostrar e interactuar dinámicamente con la información presentada.
El objeto XMLHttpRequest para intercambiar datos de forma asíncrona con el servidor web. En algunos frameworks y en algunas situaciones concretas, se usa un objeto iframe en lugar del XMLHttpRequest para realizar dichos intercambios. PHP es un lenguaje de programación de uso general de script del lado del servidor originalmente diseñado para el desarrollo web de contenido dinámico también utilizado en el método Ajax.
XML es el formato usado generalmente para la transferencia de datos solicitados al servidor, aunque cualquier formato puede funcionar, incluyendo HTML preformateado, texto plano, JSON y hasta EBML.

Como el DHTML, LAMP o SPA, Ajax no constituye una tecnología en sí, sino que es un término que engloba a un grupo de éstas que trabajan conjuntamente.

Leer mas en http://es.wikipedia.org/wiki/AJAX

Que es el Objeto XMLHttpRequest

XMLHttpRequest (XHR), también referida como XMLHTTP (Extensible Markup Language / Hypertext Transfer Protocol), es una interfaz empleada para realizar peticiones HTTP y HTTPS a servidores Web. Para los datos transferidos se usa cualquier codificación basada en texto, incluyendo: texto plano, XML, JSON, HTML y codificaciones particulares específicas. La interfaz se implementa como una clase de la que una aplicación cliente puede generar tantas instancias como necesite para manejar el diálogo con el servidor.

El uso más popular, si bien no el único, de esta interfaz es proporcionar contenido dinámico y actualizaciones asíncronas en páginas WEB mediante tecnologías construidas sobre ella como por ejemplo AJAX.

La primera versión de la interfaz XMLHttpRequest fue desarrollada por Microsoft que la introdujo en la versión 5.0 de Internet Explorer.1 Esta primera versión se publicó utilizando un objeto ActiveX, lo que significa que podía ser utilizada desde cualquier entorno de desarrollo de software con soporte para esta tecnología, es decir, la práctica totalidad de plataformas generalistas de desarrollo para Microsoft Windows. Microsoft ha seguido manteniendo y actualizando esta tecnología incluyendo la funcionalidad dentro del Microsoft XML Parser (MSXML) en sus sucesivas versiones. A partir de la versión 7 de Internet Explorer la interfaz se ofrece de manera integrada.1 Al ser integrada, el acceso a la interfaz se realiza enteramente con objetos (JScript o VBScript) proporcionados por el navegador y no mediante bibliotecas externas.

El proyecto Mozilla incorporó la primera implementación integrada de XMLHttpRequest en la versión 1.0 de la Suite Mozilla en 2002. Esta implementación sería seguida por Apple a partir de Safari 1.2, Konqueror, Opera Software a partir del Opera 8.0 e iCab desde la versión 3.0b352.

El World Wide Web Consortium presentó el 27 de septiembre de 2006 el primer borrador de una especificación estándar de la interfaz.2 La versión actual de 17 de enero de 2012, denominada XMLHttpRequest Level 2 es el resultado de varias revisiones.3

Mientras no se alcance una versión definitiva, los desarrolladores de aplicaciones WEB deberán tener en cuenta las diferencias entre implementaciones o bien utilizar paquetes o frameworks que realicen esta función.

El 25 de febrero de 2008 se publicó la primera versión de la especificación XMLHttpRequest Level 2. Esta nueva especificación, que se inicia antes de haber publicado la versión definitiva de la interfaz, pretende añadir nuevas funciones como: peticiones entre dominios (cross-site), eventos de progreso y manejo de flujos de bytes (streams) tanto para el envío como para la recepción.

XMLHttpRequest es una interfaz para realizar llamadas mediante HTTP, por lo que es recomendable un buen conocimiento de este protocolo. Es importante el manejo correcto de la cache en el servidor HTTP, en los proxy cache intermedios y en el navegador WEB.

La interfaz se implementa en una clase de la que se debe crear una nueva instancia mediante el constructor adecuado. Es posible realizar peticiones síncronas y asíncronas al servidor. Cuando las operaciones son síncronas la ejecución del programa se detiene hasta que se completa la operación. En una llamada asíncrona el flujo de proceso no se detiene a esperar la respuesta sino que esta continúa en segundo plano y se define un manejador de evento que se ejecutará cuando se complete la petición.

Otro elemento importante en la especificación, es el manejo de juegos de caracteres u hojas de códigos. La codificación y decodificación de texto y su la identificación de los juegos de caracteres mediante cabeceras HTTP y tipos MIME. El estándar XMLHttpRequest recomienda UTF-8 para la codificación de cadenas de texto.3

Para determinar la codificación de los datos transmitidos se usa el siguiente algoritmo, utilizando la primera opción que se cumpla:

Si los datos transmitidos son XML o HTML, y así se identifica mediante la correspondiente cabecera Content-Type de HTTP, la codificación se detectará siguiendo las reglas de XML o HTML según corresponda.
Si la cabecera HTTP especifica un tipo MIME mediante Content-Type e identifica un juego de caracteres se utiliza dicho juego de caracteres.
Si los datos enviados especifican un BOM válido, se utilizará la variante UTF determinada por dicho BOM.
Utilizar UTF-8.

Si no se identifica correctamente la codificación, existe el riesgo de que en un sistema en el que se mezclen varias codificaciones puedan producirse errores de visualización de caracteres. Por ejemplo al incorporar funcionalidad AJAX, que por defecto utiliza UTF-8, a una página WEB codificada con ISO 8859-1.

fuente.http://es.wikipedia.org/wiki/XMLHttpRequest

Libro Gratis Sobre Ajax

Introducción a Ajax es un material publicado por Javier Eguíluz Pérez para LibrosWeb bajo una licencia Creative Commons.

Entre los catorce capítulos y más de 280 páginas de este libro encontramos una aproximación a temas como Javascript, DOM, eventos, técnicas Ajax, Frameworks y librerías.

Pese a que Introducción a Ajax comienza desde cero y llega hasta técnicas más avanzadas, se recomienda para su mejor comprensión poseer conocimientos básicos de JavaScript.

Este libro es un complemento de nuestra sección “Ajax a fondo” donde cualquier desarrollador que lo desee podrá obtener de forma gratuita una serie de manuales y talleres en español dedicados a explicar el trabajo y programación Ajax para el desarrollo de aplicaciones web complejas.

Interesados pueden acceder al visionado online o a la descarga en formato PDF de Introducción a Ajax desde www.librosweb.es.
fuente.desarrolloweb

Tipos de variables en Javascript

JavaScript divide los distintos tipos de variables en dos grupos: tipos primitivos y tipos de referencia o clases.

Tipos primitivos

JavaScript define cinco tipos primitivos: undefined, null, boolean, number y string. Además de estos tipos, JavaScript define el operador typeof para averiguar el tipo de una variable.

El operador typeof

El operador typeof se emplea para determinar el tipo de dato que almacena una variable. Su uso es muy sencillo, ya que sólo es necesario indicar el nombre de la variable cuyo tipo se quiere averiguar:

var variable1 = 7;
typeof variable1;  // "number"
var variable2 = "hola mundo";
typeof variable2;  // "string"

Los posibles valores de retorno del operador son: undefined, boolean, number, string para cada uno de los tipos primitivos y object para los valores de referencia y también para los valores de tipo null.

Variables de tipo undefined

El tipo undefined corresponde a las variables que han sido definidas y todavía no se les ha asignado un valor:

var variable1;
typeof variable1;  // devuelve "undefined"

El operador typeof no distingue entre las variables declaradas pero no inicializadas y las variables que ni siquiera han sido declaradas:

var variable1;
typeof variable1;  // devuelve "undefined", aunque la variable1 ha sido declarada
typeof variable2;  // devuelve "undefined", la variable2 no ha sido declarada

Variables de tipo null

Se trata de un tipo similar a undefined, y de hecho en JavaScript se consideran iguales (undefined == null). El tipo null se suele utilizar para representar objetos que en ese momento no existen.

var nombreUsuario = null;

Variables de tipo boolean

Además de variables de tipo boolean, también se suelen llamar variables lógicas y variables booleanas. Se trata de una variable que sólo puede almacenar uno de los dos valores especiales definidos y que representan el valor “verdadero” y el valor “falso”.

var variable1 = true;
var variable2 = false;

Los valores true y false son valores especiales, de forma que no son palabras ni números ni ningún otro tipo de valor. Este tipo de variables son esenciales para crear cualquier aplicación, tal y como se verá más adelante.

Cuando es necesario convertir una variable numérica a una variable de tipo boolean, JavaScript aplica la siguiente conversión: el número 0 se convierte en false y cualquier otro número distinto de 0 se convierte en true.

Por este motivo, en ocasiones se asocia el número 0 con el valor false y el número 1 con el valor true. Sin embargo, es necesario insistir en que true y false son valores especiales que no se corresponden ni con números ni con ningún otro tipo de dato.

Variables de tipo numérico

Las variables numéricas son muy utilizadas en las aplicaciones habituales, ya que permiten almacenar cualquier valor numérico. Si el número es entero, se indica directamente. Si el número es decimal, se debe utilizar el punto (.) para separar la parte entera de la decimal.

var variable1 = 10;
var variable2 = 3.14159265;

Además del sistema numérico decimal, también se pueden indicar valores en el sistema octal (si se incluye un cero delante del número) y en sistema hexadecimal (si se incluye un cero y una x delante del número).

var variable1 = 10;
var variable_octal = 034;
var variable_hexadecimal = 0xA3;

JavaScript define tres valores especiales muy útiles cuando se trabaja con números. En primer lugar se definen los valores Infinity y –Infinity para representar números demasiado grandes (positivos y negativos) y con los que JavaScript no puede trabajar.

var variable1 = 3, variable2 = 0;
alert(variable1/variable2);  // muestra "Infinity"

El otro valor especial definido por JavaScript es NaN, que es el acrónimo de “Not a Number”. De esta forma, si se realizan operaciones matemáticas con variables no numéricas, el resultado será de tipo NaN.

Para manejar los valores NaN, se utiliza la función relacionada isNaN(), que devuelve true si el parámetro que se le pasa no es un número:

var variable1 = 3;
var variable2 = "hola";
isNaN(variable1);  // false
isNaN(variable2);  // true
isNaN(variable1 + variable2);  // true

Por último, JavaScript define algunas constantes matemáticas que representan valores numéricos significativos:

Constante Valor Significado
Math.E 2.718281828459045 Constante de Euler, base de los logaritmos naturales y también llamado número e
Math.LN2 0.6931471805599453 Logaritmo natural de 2
Math.LN10 2.302585092994046 Logaritmo natural de 10
Math.LOG2E 1.4426950408889634 Logaritmo en base 2 de Math.E
Math.LOG10E 0.4342944819032518 Logaritmo en base 10 de Math.E
Math.PI 3.141592653589793 Pi, relación entre el radio de una circunferencia y su diámetro
Math.SQRT1_2 0.7071067811865476 Raíz cuadrada de 1/2
Math.SQRT2 1.4142135623730951 Raíz cuadrada de 2

De esta forma, para calcular el área de un círculo de radio r, se debe utilizar la constante que representa al número Pi:

var area = Math.PI * r * r;

Variables de tipo cadena de texto

Las variables de tipo cadena de texto permiten almacenar cuaquier sucesión de caracteres, por lo que se utilizan ampliamente en la mayoría de aplicaciones JavaScript. Cada carácter de la cadena se encuentra en una posición a la que se puede acceder individualmente, siendo el primer carácter el de la posición 0.

El valor de las cadenas de texto se indica encerrado entre comillas simples o dobles:

var variable1 = "hola";
var variable2 = 'mundo';
var variable3 = "hola mundo, esta es una frase más larga";

Las cadenas de texto pueden almacenar cualquier carácter, aunque algunos no se pueden incluir directamente en la declaración de la variable. Si por ejemplo se incluye un ENTER para mostrar el resto de caracteres en la línea siguiente, se produce un error en la aplicación:

var variable = "hola mundo, esta es 
una frase más larga";

La variable anterior no está correctamente definida y se producirá un error en la aplicación. Por tanto, resulta evidente que algunos caracteres especiales no se pueden incluir directamente. De la misma forma, como las comillas (doble y simple) se utilizan para encerrar los contenidos, también se pueden producir errores:

var variable1 = "hola 'mundo'";
var variable2 = 'hola "mundo"';
var variable3 = "hola 'mundo', esta es una "frase" más larga";

Si el contenido de texto tiene en su interior alguna comilla simple, se encierran los contenidos con comillas dobles (como en el caso de la variable1 anterior). Si el contenido de texto tiene en su interior alguna comilla doble, se encierran sus contenidos con comillas simples (como en el caso de la variable2 anterior). Sin embargo, en el caso de la variable3 su contenido tiene tanto comillas simples como comillas dobles, por lo que su declaración provocará un error.

Para resolver estos problemas, JavaScript define un mecanismo para incluir de forma sencilla caracteres especiales (ENTER, Tabulador) y problemáticos (comillas). Esta estrategia se denomina “mecanismo de escape”, ya que se sustituyen los caracteres problemáticos por otros caracteres seguros que siempre empiezan con la barra \:

Si se quiere incluir… Se debe sustituir por…
Una nueva línea \n
Un tabulador \t
Una comilla simple \
Una comilla doble \"
Una barra inclinada \\

Utilizando el mecanismo de escape, se pueden corregir los ejemplos anteriores:

var variable = "hola mundo, esta es \n una frase más larga";
var variable3 = "hola 'mundo', esta es una \"frase\" más larga";

Conversión entre tipos de variables

JavaScript es un lenguaje de programación “no tipado”, lo que significa que una misma variable puede guardar diferentes tipos de datos a lo largo de la ejecución de la aplicación. De esta forma, una variable se podría inicializar con un valor numérico, después podría almacenar una cadena de texto y podría acabar la ejecución del programa en forma de variable booleana.

No obstante, en ocasiones es necesario que una variable almacene un dato de un determinado tipo. Para asegurar que así sea, se puede convertir una variable de un tipo a otro, lo que se denomina typecasting:

Así, JavaScript incluye un método llamado toString() que permite convertir variables de cualquier tipo a variables de cadena de texto, tal y como se muestra en el siguiente ejemplo:

var variable1 = true;
variable1.toString();  // devuelve "true" como cadena de texto
var variable2 = 5;
variable2.toString();  // devuelve "5" como cadena de texto

JavaScript también incluye métodos para convertir los valores de las variables en valores numéricos. Los métodos definidos son parseInt() y parseFloat(), que convierten la variable que se le indica en un número entero o un número decimal respectivamente.

La conversión numérica de una cadena se realiza carácter a carácter empezando por el de la primera posición. Si ese carácter no es un número, la función devuelve el valor NaN. Si el primer carácter es un número, se continúa con los siguientes caracteres mientras estos sean números.

var variable1 = "hola";
parseInt(variable1);  // devuelve NaN
var variable2 = "34";
parseInt(variable2);  // devuelve 34
var variable3 = "34hola23";
parseInt(variable3);  // devuelve 34
var variable4 = "34.23";
parseInt(variable4);  // devuelve 34

En el caso de parseFloat(), el comportamiento es el mismo salvo que también se considera válido el carácter . que indica la parte decimal del número:

var variable1 = "hola";
parseFloat(variable1);  // devuelve NaN
var variable2 = "34";
parseFloat(variable2);  // devuelve 34.0
var variable3 = "34hola23";
parseFloat(variable3);  // devuelve 34.0
var variable4 = "34.23";
parseFloat(variable4);  // devuelve 34.23

Tipos de referencia

Aunque JavaScript no define el concepto de clase, los tipos de referencia se asemejan a las clases de otros lenguajes de programación. Los objetos en JavaScript se crean mediante la palabra reservada new y el nombre de la clase que se va a instanciar. De esta forma, para crear un objeto de tipo String se indica lo siguiente (los paréntesis solamente son obligatorios cuando se utilizan argumentos, aunque se recomienda incluirlos incluso cuando no se utilicen):

var variable1 = new String("hola mundo");

JavaScript define una clase para cada uno de los tipos de datos primitivos. De esta forma, existen objetos de tipo Boolean para las variables booleanas, Number para las variables numéricas y String para las variables de cadenas de texto. Las clases Boolean, Number y String almacenan los mismos valores de los tipos de datos primitivos y añaden propiedades y métodos para manipular sus valores.

Aunque más adelante se explica en detalle, el siguiente ejemplo determina el número de caracteres de una cadena de texto:

var longitud = "hola mundo".length;

La propiedad length sólo está disponible en la clase String, por lo que en principio no debería poder utilizarse en un dato primitivo de tipo cadena de texto. Sin embargo, JavaScript convierte el tipo de dato primitivo al tipo de referencia String, obtiene el valor de la propiedad length y devuelve el resultado. Este proceso se realiza de forma automática y transparente para el programador.

En realidad, con una variable de tipo String no se pueden hacer muchas más cosas que con su correspondiente tipo de dato primitivo. Por este motivo, no existen muchas diferencias prácticas entre utilizar el tipo de referencia o el tipo primitivo, salvo en el caso del resultado del operador typeof y en el caso de la función eval(), como se verá más adelante.

La principal diferencia entre los tipos de datos es que los datos primitivos se manipulan por valor y los tipos de referencia se manipulan, como su propio nombre indica, por referencia. Los conceptos “por valor” y “por referencia” son iguales que en el resto de lenguajes de programación, aunque existen diferencias importantes (no existe por ejemplo el concepto de puntero).

Cuando un dato se manipula por valor, lo único que importa es el valor en sí. Cuando se asigna una variable por valor a otra variable, se copia directamente el valor de la primera variable en la segunda. Cualquier modificación que se realice en la segunda variable es independiente de la primera variable.

De la misma forma, cuando se pasa una variable por valor a una función (como se explicará más adelante) sólo se pasa una copia del valor. Así, cualquier modificación que realice la función sobre el valor pasado no se refleja en el valor de la variable original.

En el siguiente ejemplo, una variable se asigna por valor a otra variable:

var variable1 = 3;
var variable2 = variable1;
 
variable2 = variable2 + 5;
// Ahora variable2 = 8 y variable1 sigue valiendo 3

La variable1 se asigna por valor en la variable1. Aunque las dos variables almacenan en ese momento el mismo valor, son independientes y cualquier cambio en una de ellas no afecta a la otra. El motivo es que los tipos de datos primitivos siempre se asignan (y se pasan) por valor.

Sin embargo, en el siguiente ejemplo, se utilizan tipos de datos de referencia:

var variable1 = new Date(2009, 11, 25);  // variable1 = 25 diciembre de 2009
var variable2 = variable1;               // variable2 = 25 diciembre de 2009
 
variable2.setFullYear(2010, 11, 31);     // variable2 = 31 diciembre de 2010
// Ahora variable1 también es 31 diciembre de 2010

En el ejemplo anterior, se utiliza un tipo de dato primitivo que se verá más adelante, que se llama Date y que se utiliza para manejar fechas. Se crea una variable llamada variable1 y se inicializa la fecha a 25 de diciembre de 2009. Al constructor del objeto Date se le pasa el año, el número del mes (siendo 0 = enero, 1 = febrero, …, 11 = diciembre) y el día (al contrario que el mes, los días no empiezan en 0 sino en 1). A continuación, se asigna el valor de la variable1 a otra variable llamada variable2.

Como Date es un tipo de referencia, la asignación se realiza por referencia. Por lo tanto, las dos variables quedan “unidas” y hacen referencia al mismo objeto, al mismo dato de tipo Date. De esta forma, si se modifica el valor de variable2 (y se cambia su fecha a 31 de diciembre de 2010) el valor de variable1 se verá automáticamente modificado.

Variables de tipo Object

La clase Object por sí sola no es muy útil, ya que su única función es la de servir de base a partir de la cual heredan el resto de clases. Los conceptos fundamentales de los objetos son los constructores y la propiedad prototype, tal y como se explicarán en el siguiente capítulo.

Una utilidad práctica de Object es la conversión entre tipos de datos primitivos y sus correspondientes tipos de referencia:

var numero = new Object(5);             // numero es de tipo Number
var cadena = new Object("hola mundo");  // cadena es de tipo String
var conectado = new Object(false);      // conectado es de tipo Boolean

Variables de tipo Boolean

Utilizando el tipo de referencia Boolean, es posible crear objetos de tipo lógico o booleano:

var variable1 = new Boolean(false);

Sin embargo, en general no se utilizan objetos de tipo Boolean porque su comportamiento no siempre es idéntico al de los tipos de datos primitivos:

var variable1 = true, variable2 = false;
var variable3 = new Boolean(false);
variable2 && variable1;  // el resultado es false
variable3 && variable1;  // el resultado es true

El resultado de la última operación es realmente sorprendente, ya que se esperaba un resultado false. El problema reside en que los objetos no se comportan igual que los tipos primitivos. En una operación lógica, cualquier objeto que exista se convierte a true, independientemente de su valor.

Por este motivo, con los valores booleanos normalmente se utilizan tipos de datos primitivos en vez de objetos de tipo Boolean.

Variables de tipo Number

La clase Number permite definir variables de tipo numérico independientemente de si el valor es entero o decimal:

var variable1 = new Number(16);
var variable2 = new Number(3.141592);

Para obtener el valor numérico almacenado, se puede utilizar el método valueOf():

var variable1 = new Number(16);
var variable2 = variable1.valueOf();  // variable2 = 16

Uno de los métodos más útiles para los números es toFixed(), que trunca el número de decimales de un número al valor indicado como parámetro:

var variable1 = new Number(3.141592);
var variable2 = variable1.toFixed();   // variable2 = 3
var variable3 = variable1.toFixed(2);  // variable3 = 3.14
var variable4 = variable1.toFixed(10); // variable4 = 3.1415920000

En ocasiones, el método toFixed() no funciona como debería, debido a los problemas que sufren la mayoría de lenguajes de programación con los números decimales (en realidad, se denominan “números de coma flotante”):

var numero1 = new Number(0.235);
var numero2 = new Number(1.235);
 
numero3 = numero1.toFixed(2);  // numero3 = 0.23
numero3 = numero2.toFixed(2);  // numero3 = 1.24

Como se ve en el ejemplo anterior, el redondeo de los decimales no funciona de forma consistente, ya que el número 5 a veces incrementa el decimal anterior y otras veces no. De la misma forma, se pueden producir errores de precisión en operaciones aparentemente sencillas, como en la siguiente multiplicación:

var numero1 = new Number(162.295);
var numero2 = numero1 * new Number(100);
 
// numero2 no es igual a 16229.5
// numero2 = 16229.499999999998

Los errores de redondeo afectan de la misma forma a las variables numéricas creadas con tipos de datos primitivos. En cualquier caso, al igual que sucede con Boolean, se recomienda utilizar el tipo de dato primitivo para los números, ya que la clase Number no aporta mejoras significativas.

Variables de tipo String

La clase String representa una cadena de texto, de forma similar a los tipos de datos primitivos:

var variable1 = new String("hola mundo");

El objeto de tipo String es el más complejo de JavaScript y contiene decenas de métodos y utilidades, algunos de los cuales se verán más adelante. Como ya se ha comentado, siempre que sea necesario JavaScript convierte de forma automática las cadenas de texto de dato primitivo a dato de referencia. De esta forma, no es obligatorio crear objetos de tipo String para acceder a todas las utilidades disponibles para las cadenas de texto.

Operador instanceof

El operador typeof no es suficiente para trabajar con tipos de referencia, ya que devuelve el valor object para cualquier objeto independientemente de su tipo. Por este motivo, JavaScript define el operador instanceof para determinar la clase concreta de un objeto.

var variable1 = new String("hola mundo");
typeof variable1;             // devuelve "object"
variable1 instanceof String;  // devuelve true

El operador instanceof sólo devuelve como valor true o false. De esta forma, instanceof no devuelve directamente la clase de la que ha instanciado la variable, sino que se debe comprobar cada posible tipo de clase individualmente.

Variables en Javascript

Las variables se definen mediante la palabra reservada var, que permite definir una o varias variables simultáneamente:

var variable1 = 16;
var variable2 = "hola", variable3 = "mundo";
var variable4 = 16, variable5 = "hola";

El nombre de las variables debe cumplir las dos siguientes condiciones:

  • El primer carácter debe ser una letra o un guión bajo (_) o un dólar ($).
  • El resto de caracteres pueden ser letras, números, guiones bajos (_) y símbolos de dólar ($).

No es obligatorio inicializar una variable al declararla:

var variable6;

Si la variable no se declara mediante el operador var, automáticamente se crea una variable global con ese identificador y su valor. Ejemplo:

var variable1 = 16;
variable2 = variable1 + 4;

En el ejemplo anterior, la variable2 no ha sido declarada, por lo que al llegar a esa instrucción, JavaScript crea automáticamente una variable global llamada variable2 y le asigna el valor correspondiente.

El ámbito de una variable (llamado scope en inglés) es la zona del programa en la que se define la variable. JavaScript define dos ámbitos para las variables: global y local.

El siguiente ejemplo ilustra el comportamiento de los ámbitos:

function muestraMensaje() {
    var mensaje = "Mensaje de prueba";
}
 
muestraMensaje();
alert(mensaje);

Cuando se ejecuta el código JavaScript anterior, su resultado no es el esperado, ya que no se muestra por pantalla ningún mensaje. La variable mensaje se ha definido dentro de la función y por tanto es una variable local que solamente está definida dentro de la función.

Cualquier instrucción que se encuentre dentro de la función puede hacer uso de la variable. Sin embargo, cualquier instrucción que se encuentre en otras funciones o fuera de cualquier función no tendrá definida la variable mensaje.

Además de variables locales, también existe el concepto de variable global, que está definida en cualquier punto del programa (incluso dentro de cualquier función).

var mensaje = "Mensaje de prueba";
 
function muestraMensaje() {
    alert(mensaje);
}

El código JavaScript anterior define una variable fuera de cualquier función. Este tipo de variables automáticamente se transforman en variables globales y están disponibles en cualquier punto del programa.

De esta forma, aunque en el interior de la función no se ha definido ninguna variable llamada mensaje, la variable global creada anteriormente permite que la instrucción alert() dentro de la función muestre el mensaje correctamente.

Si una variable se declara fuera de cualquier función, automáticamente se transforma en variable global independientemente de si se define utilizando la palabra reservada var o no. Sin embargo, en el interior de una función, las variables declaradas mediante var se consideran locales y el resto se transforman también automáticamente en variables globales.

Por lo tanto, el siguiente ejemplo si que funciona como se espera:

function muestraMensaje() {
    mensaje = "Mensaje de prueba";
}
 
muestraMensaje();
alert(mensaje);

En caso de colisión entre las variables globales y locales, dentro de una función prevalecen las variables locales:

var mensaje = "gana la de fuera";
 
function muestraMensaje() {
    var mensaje = "gana la de dentro";
    alert(mensaje);
}
 
alert(mensaje);
muestraMensaje();
alert(mensaje);

El código anterior muestra por pantalla los siguientes mensajes:

gana la de fuera
gana la de dentro
gana la de fuera

La variable local llamada mensaje dentro de la función tiene más prioridad que la variable global del mismo nombre, pero solamente dentro de la función.

Si no se define la variable dentro de la función con la palabra reservada var, en realidad se está modificando el valor de la variable global:

var mensaje = "gana la de fuera";
 
function muestraMensaje() {
    mensaje = "gana la de dentro";
    alert(mensaje);
}
 
alert(mensaje);
muestraMensaje();
alert(mensaje);

En este caso, los mensajes mostrados son:

gana la de fuera
gana la de dentro
gana la de dentro

La recomendación general es definir como variables locales todas las variables que sean de uso exclusivo para realizar las tareas encargadas a cada función. Las variables globales se utilizan para compartir variables entre funciones de forma rápida.

JavaScript básico

Sintaxis

La sintaxis de un lenguaje de programación se define como el conjunto de reglas que deben seguirse al escribir el código fuente de los programas para considerarse como correctos para ese lenguaje de programación.

La sintaxis de JavaScript es muy similar a la de otros lenguajes como Java y C. Las normas básicas que definen la sintaxis de JavaScript son las siguientes:

  • No se tienen en cuenta los espacios en blanco y las nuevas líneas: como sucede con XHTML, el intérprete de JavaScript ignora cualquier espacio en blanco sobrante, por lo que el código se puede ordenar de forma adecuada para su manejo (tabulando las líneas, añadiendo espacios, creando nuevas líneas, etc.)
  • Se distinguen las mayúsculas y minúsculas: al igual que sucede con la sintaxis de las etiquetas y elementos XHTML. Sin embargo, si en una página XHTML se utilizan indistintamente mayúsculas y minúsculas, la página se visualiza correctamente y el único problema es que la página no valida. Por el contrario, si en JavaScript se intercambian mayúsculas y minúsculas, las aplicaciones no funcionan correctamente.
  • No se define el tipo de las variables: al definir una variable, no es necesario indicar el tipo de dato que almacenará. De esta forma, una misma variable puede almacenar diferentes tipos de datos durante la ejecución del programa.
  • No es obligatorio terminar cada sentencia con el carácter del punto y coma (;): al contrario de la mayoría de lenguajes de programación, en JavaScript no es obligatorio terminar cada sentencia con el carácter del punto y coma (;). No obstante, es muy recomendable seguir la tradición de terminar cada sentencia con el carácter ;
  • Se pueden incluir comentarios: los comentarios se utilizan para añadir alguna información relevante al código fuente del programa. Aunque no se visualizan por pantalla, su contenido se envía al navegador del usuario junto con el resto del programa, por lo que es necesario extremar las precauciones sobre el contenido de los comentarios.

JavaScript define dos tipos de comentarios: los de una sola línea y los que ocupan varias líneas. Los comentarios de una sola línea se definen añadiendo dos barras oblicuas (//) al principio de cada línea que forma el comentario:

// a continuación se muestra un mensaje
alert("mensaje de prueba");

También se pueden incluir varios comentarios seguidos de una sola línea:

// a continuación se muestra un mensaje
// y después se muestra otro mensaje
alert("mensaje de prueba");

Cuando un comentario ocupa más de una línea, es más eficiente utilizar los comentarios multilínea, que se definen encerrando el texto del comentario entre los caracteres /* y */

/* Los comentarios de varias líneas son muy útiles
cuando se necesita incluir bastante información
en los comentarios */
alert("mensaje de prueba");

Las normas completas de sintaxis y de cualquier otro aspecto relacionado con JavaScript se pueden consultar en el estándar oficial del lenguaje que está disponible en http://www.ecma-international.org/publications/standards/Ecma-262.htm

Introducción a AJAX

El término AJAX se presentó por primera vez en el artículo “Ajax: A New Approach to Web Applications” publicado por Jesse James Garrett el 18 de Febrero de 2005. Hasta ese momento, no existía un término normalizado que hiciera referencia a un nuevo tipo de aplicación web que estaba apareciendo.

En realidad, el término AJAX es un acrónimo de Asynchronous JavaScript + XML, que se puede traducir como “JavaScript asíncrono + XML“.

El artículo define AJAX de la siguiente forma:

Ajax no es una tecnología en sí mismo. En realidad, se trata de varias tecnologías independientes que se unen de formas nuevas y sorprendentes.

Las tecnologías que forman AJAX son:

  • XHTML y CSS, para crear una presentación basada en estándares.
  • DOM, para la interacción y manipulación dinámica de la presentación.
  • XML, XSLT y JSON, para el intercambio y la manipulación de información.
  • XMLHttpRequest, para el intercambio asíncrono de información.
  • JavaScript, para unir todas las demás tecnologías.
Tecnologías agrupadas bajo el concepto de AJAX

Tecnologías agrupadas bajo el concepto de AJAX

Desarrollar aplicaciones AJAX requiere un conocimiento avanzado de todas y cada una de las tecnologías anteriores.

En las aplicaciones web tradicionales, las acciones del usuario en la página (pinchar en un botón, seleccionar un valor de una lista, etc.) desencadenan llamadas al servidor. Una vez procesada la petición del usuario, el servidor devuelve una nueva página HTML al navegador del usuario.

En el siguiente esquema, la imagen de la izquierda muestra el modelo tradicional de las aplicaciones web. La imagen de la derecha muestra el nuevo modelo propuesto por AJAX:

Comparación gráfica del modelo tradicional de aplicación web y del nuevo modelo propuesto por AJAX.

Comparación gráfica del modelo tradicional de aplicación web y del nuevo modelo propuesto por AJAX.

Esta técnica tradicional para crear aplicaciones web funciona correctamente, pero no crea una buena sensación al usuario. Al realizar peticiones continuas al servidor, el usuario debe esperar a que se recargue la página con los cambios solicitados. Si la aplicación debe realizar peticiones continuas, su uso se convierte en algo molesto

AJAX permite mejorar completamente la interacción del usuario con la aplicación, evitando las recargas constantes de la página, ya que el intercambio de información con el servidor se produce en un segundo plano.

Las aplicaciones construidas con AJAX eliminan la recarga constante de páginas mediante la creación de un elemento intermedio entre el usuario y el servidor. La nueva capa intermedia de AJAX mejora la respuesta de la aplicación, ya que el usuario nunca se encuentra con una ventana del navegador vacía esperando la respuesta del servidor.

El siguiente esquema muestra la diferencia más importante entre una aplicación web tradicional y una aplicación web creada con AJAX. La imagen superior muestra la interación síncrona propia de las aplicaciones web tradicionales. La imagen inferior muestra la comunicación asíncrona de las aplicaciones creadas con AJAX.

Comparación entre las comunicaciones síncronas de las aplicaciones web tradicionales y las comunicaciones asíncronas de las aplicaciones AJAX

Comparación entre las comunicaciones síncronas de las aplicaciones web tradicionales y las comunicaciones asíncronas de las aplicaciones AJAX

Las peticiones HTTP al servidor se sustituyen por peticiones JavaScript que se realizan al elemento encargado de AJAX. Las peticiones más simples no requieren intervención del servidor, por lo que la respuesta es inmediata. Si la interacción requiere una respuesta del servidor, la petición se realiza de forma asíncrona mediante AJAX. En este caso, la interacción del usuario tampoco se ve interrumpida por recargas de página o largas esperas por la respuesta del servidor.

Desde su aparición, se han creado cientos de aplicaciones web basadas en AJAX. En la mayoría de casos, AJAX puede sustituir completamente a otras técnicas como Flash. Además, en el caso de las aplicaciones web más avanzadas, pueden llegar a sustituir a las aplicaciones de escritorio.

A continuación se muestra una lista de algunas de las aplicaciones más conocidas basadas en AJAX:

Códigos javascript para manipular imágenes

Una serie de diez códigos Javascript que facilitan el manejo de las imágenes para mejorar el diseño e interactividad de tu página web.

En Blog Oh! Blog nos presentan el Top 10 Javascript for Image Manipulation, una serie interesante con diferentes características pero con un mismo objetivo, la manipulación de las imágenes y obtener el efecto deseado.

Reflex.js, Curls.js, Edge.js, Corner.js, Slided.js, Glossy.js, Filmed.js, Loupe.js, Instant.js, Bevel.js.

javascripts

El ejemplo de las imágenes hablan por si mismas, nos muestran el código aplicado a cada imagen, ahora revisa la lista y selecciona el Javascript que deseas aplicar. Además, en cada link encontrarás una serie de ejemplos y características sobre el código.