Avisar de contenido inadecuado
Expand

Javascript y jQuery: Consejos y Buenas Practicas (Parte I)

jQuery es una de las librerias mas utilizadas por los desarrolladores FrontEnd por su versatilidad y facilidad de uso. En Pixelovers somos autenticos fans de esta libreria.

http://stc.obolog.net/multimedia/fotos/309000/308801/308801-209198.jpg

Es por esto que queremos compartir con vosotros lo que consideramos que son unas buenas practicas a la hora de programar codigo Javascript ayudandonos de la libreria jQuery.

El objetivo de este compendio de buenas practicas es conseguir un codigo Javascript lo mas limpio, claro y eficiente posible.

Los tips que aqui incluimos estan sacados de nuestra propia experiencia y de conclusiones interesantes que hemos ido encontrando por la red y que hemos acoplado a nuestro repertorio.

Como son muchos los puntos tratados y para no cargar el post con demasiada informacion vamos a dividir este compendio en 2 partes.

En esta primera parte hablaremos de normas generales a seguir que te ayudaran a crear un codigo mas claro y eficiente. En un segundo post hablaremos de como solucionar de forma eficiente problemas concretos que nos solemos encontrar en nuestros desarrollos.

Y una vez dicho esto, vamos al lio...

Consideraciones Generales

  • Aprenderse bien la librería. Para utilizar siempre la solución mas optimizada posible. No está de mas tener a mano una chuleta de jQuery como comentabamos en otro post hace unas semanas o ir directamente a la documentacion oficial de jQuery
  • Utilizar librerias consolidadas, versatiles, con soporte y con proyecto de futuro. Por ejemplo jQuery como librería principal y jQuery Tools y jQuery UI como liberias adicionales de efectos
  • Trabajar en archivos separados. Mejor crear JS's diferentes para cada funcionalidad separable de nuestro site y luego utilizar algun sistema que junte todos estos JS's en uno final (comprimido y ofuscado)
  • Javascript no intrusivo. Nunca depender de JS en la medida de lo posible. Si está desactivado el javascript o falla, que la pagina muestre un aspecto normal. Javascript es una mejora, no un sistema de seguridad.
  • Optimiza el codigo haciendo pruebas de rendimiento. Con Firebug podemos medir el tiempo que tarda una funcion (o trozo de codigo) en ejecutarse:
    			
    	console.time('native');  
    	var l = array.length;
    		for (var i=0;i<l; i++) {
            array[i] = i;  
    	}  
    	console.timeEnd('native');  
    			 
    		
  • Comprimir el codigo al final. Al comprimir el codigo el archivo JS que tendrá que bajarse el usuario será de menor tamaño, aunque hay que valorar el rendimiento final ya que por el contrario el navegador tendrá que realizar el proceso adicional de descomprimir el codigo antes de ejecutarlo.Para comprimir el codigo disponemos de herramientas, tipo YUI Compressor aunque hay muchas mas
  • El marcado semantico y accesible viene primero. No adaptar el marcado para facilitar el JS sino que sea el JS el que se adapte al marcado. Con ID’s, herencia, y clases podemos acceder a cualquier elemento y asignarle funcionalidades

    Marcado horrible:

    			
    	<table>
    	    <tr>
    	    	<td onclick="doSomething();">First Option</td>
    	        <td>First option description</td>
    		</tr>
    		<tr>
    			<td onclick="doSomething();">Second Option</td>
    			<td>Second option description</td>
    		</tr>		
    	</table>
    			

    Marcado malo:

    	
            <dl>
    		<dt onclick="doSomething();">First Option</dt>
    		<dd>First option description</dd>
    		<dt onclick="doSomething();">Second Option</dt>
    		<dd>Second option description</dd>
    	</dl>
    		

    Buen marcado:

    			
    	<dl id="OptionList">
    	    <dt>First Option</dt>
    	    <dd>First option description</dd>
    	    <dt>Second Option</dt>
    	    <dd>Second option description</dd>
    	</dl>
    			
    
  • Encapsular lo maximo posible el codigo. Esto significa agrupar todas las funciones comunes dentro de una funcion padre, asi acotamos el contexto de cada funcionalidad (objeto si hace falta)

    Ejemplo:

    			
    	var mySite = new Object();
    	
    	mySite = {
    		
    		var1 : 1,
    		var2 : 2,
    		valorCalculado,
    		
    		init : function() {
    			// aqui hago varias cosas
    			this.valorCalculado = "hola";
    			this.funcionalidad1();
    		},
    		
    		funcionalidad1 : function() {
    			// aqui desarrollo una funcionalidad concreta
    		
    		}
    	}
    	
    	// desde fuera (o desde otro objeto) puedo llamar a las funciones de este objecto
    	mySite.funcionalidad1();
    					
    
  • Elimina consultas innecesarias. Podemos ahorrarnos la llamada al $(document).ready() lanzando el <script> justo antes de cerrar el tag </body> lo que nos asegura que todos los elementos que podemos necesitar están ya cargados en el árbol DOM.

    Menos eficiente:

    			
    	$(document).ready(function(){
    		mylib.article.init();
    	});
    			
    

    Mas eficiente:

    			
    		<script type="text/javascript>
            	  mylib.article.init();
    		</script>
    	</body>
    			
    
  • “Eval is evil” Evitar el uso de eval. Problemas de seguridad. Mas info de por qué puede ser un problema aqui. Una posible alternativa al uso de EVAL puede ser JSON.parse o JSONP

Y hasta aqui la primera parte del asunto...

¿Que te han parecido los puntos aqui comentados? ¿Estas de acuerdo? ¿Algun punto que creas que falta en esta lista?

Enlaces y más

{
}
Expand

Cómo geoposicionar un dispositivo con el navegador

Geoposicionamiento

Hace unos días, el 27 de noviembre de 2009, publicaron un nuevo borrador en el W3C titulado: Geolocation API Specification. Esta especificación define una API que proporciona secuencias de comandos de acceso a la información de localización geográfica asociada con el dispositivo de alojamiento. ¿Verdad que suena interesante?

El objeto Geolocation lo podemos encontrar en la instancia navigator y debe implementar estos 3 métodos:

  • void getCurrentPosition (successCallback, errorCallback, options): Cuando se llama, de inmediato regresa y, a continuación, de forma asincrónica intenta obtener la ubicación actual del dispositivo.
  • long watchPosition (successCallback, errorCallback, options): inmediatamente devuelve un valor long que identifica unívocamente a una operación watch y, a continuación de forma asincrónica inicia la operación de watch. Esta operación sigue controlando la posición del dispositivo e invocando la función callback adecuada cada vez que el dispositivo cambia de posición. La operación continúa hasta que se llama al método clearWatch con el identificador correspondiente.
  • void clearWatch (watchId): el proceso identificado por el argumento watchId se interrumpe inmediatamente y dejan de invocarse los callbacks. Este identificador es el que devuelve la función watchPosition.

Nota: Estas funciones (getCurrentPosition y watchPosition) notificarán al usuario de nuestras intenciones y será él quién decida si permitir el acceso a esa información o no.

Firefox geoposicionamiento

Estas funciones se encuentran implementadas por un objeto llamdo Geolocation que se pertenece a la interfaz NavigatorGeolocation y debería implementarse por el objeto Navigator. Así que, podemos acceder a la posición actual del visitante mediante:

navigator.geolocation.getCurrentPosition(successCallback, errorCallback, options)

¿Y qué significa: successCallback, errorCallback, options y watchId? Pues los dos primeros argumentos son obligatoriamente funciones y el tercero un objeto. En más detalle tenemos:

successCallback

Funcion que recibe por parámetro Position position que contiene los atributos Coordinates coords y DOMTimeStamp timestamp. El atributo coords contiene la siguiente información:

Position.Coordinates

  • latitude: coordenadas geograficas  especificadas en grados.
  • longitude: coordenadas geograficas  especificadas en grados.
  • altitude: denota la altura especificada en metros.
  • accuracy: denota el nivel de precisión de las coordenadas de latitud y longitud, en metros.
  • altitudeAccuracy: denota el nivel de precisión de la altitud.
  • heading: representa la dirección del desplazamiento, tomado en grados en sentido horario desde el norte verdadero.
  • speed: indica la velocidad del dispositivo en metros por segundo.

La altitud, la precisión de la altitud, la dirección y la velocidad pueden existir o no dependiendiendo del dispositivo y en caso de no exisitir devolverán null

errorCallback

Función que recibe por parámetro PositionError error el cual contiene un short code y un DOMString message. El code puede tener un valor de 0 a 3 dependiendo de la causa, siendo:

  • UNKNOWN_ERROR = 0
  • PERMISSION_DENIED = 1
  • POSITION_UNAVAILABLE = 2
  • TIMEOUT = 3

options

Objeto que consta de los siguientes atributos:

  • boolean enableHighAccuracy: proporciona un indicio de que la aplicación desea recibir los mejores resultados posibles. El valor por defecto es false.
  • long timeout: indica la duración máxima de tiempo (expresado en milisegundos) que se permite para pasar de la llamada a getCurrentPosition() o watchPosition() hasta que se invoca el successCallback correspondiente.
  • long maximumAge: indica que la aplicación está dispuesto a aceptar una posición en caché, cuya edad no sea mayor que el tiempo especificado en milisegundos.

¿Qué opinas de que un dispositivo pueda informar de la posición del mismo? ¿Se te ocurre alguna aplicación, o ya le estas dando uso y quieres compartirlo?

Expand

Chuleta de jQuery en PDF

Siguiendo con los post relacionados con las chuletas, ya os presentamos la chuleta de HTML5, hoy toca una chuleta de jQuery 1.3 en versión PDF, gracias al trabajo de Antonio Lupetti.

Espero que con esta ayuda tengais un desarrollo más ágil y no os perdáis detalle de los ejmplos que estamos incluyendo, como fue el caso de Namespace en eventos de jQuery.

Expand

Manifiesto “En defensa de los derechos fundamentales en internet”

#manifiesto / Eneko, 20minutos.esAnte la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que:

  1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
  2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
  3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
  4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
  5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
  6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
  7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
  8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red, en España ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
  9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
  10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

Este manifiesto, elaborado de forma conjunta por varios autores, es de todos y de ninguno. Se ha publicado en multitud de sitios web. Si estás de acuerdo y quieres sumarte a él, difúndelo por Internet.

También está disponible en otros idiomas, tales como Inglés, Francés, Portugués-brasileiro, Catalán, Gallego, Asturiano, Euskera, Aaragonés, Sueco y Chino.

{
}
Expand

Namespace en eventos de jQuery

Namespace o espacio de nombre (españolización que no se usa) es la contextualización de una variable o método, es decir, consiste en asociar un identificador a un grupo de variables y/o métodos.  En la vida real disponemos de muchos ejemplos, por ejemplo OboLog tiene el número de post 123, y Pixelover también puede tener el post 123 porque ambos están en namespaces diferentes, obolog y pixelover, respectivamente.

Ahora que sabemos que significa, vamos a ver como se aplica esto a los eventos en jQuery y luego veremos una aplicación práctica de los namespaced events. Todos sabemos como añadir un manejador de evento (click, por ejemplo) a un elemento mediante el método bind:

$("a").bind("click", function() { /* Code... */ });

Ahora si queremos contextualizar ese evento click, que pertenezca a un grupo utilizamos el siguiente código:

$("a").bind("click.namespace", function() { /* Code... */ });

Esto funcionará, igual que el anterior ejemplo, en cada click que se haga a los elementos a, pero además podremos llamar únicamente a esta función mediante el metodo trigger o desligar un grupo de funciones asociadas a un evento,

$("a").trigger("click.namespace");

Con esto hemos lanzamos el evento click con el espacio de nombre "namespace" de los elementos a.

$("a").unbind(".namespace");

Y con esto hemos desligado todos los tipos de eventos del espacio de nombre namespace, ya sean eventos click, dbclick, mousedown, mouseup, etc..

¿Se te ocurre como podrías utlizar los espacios de nombre en los eventos? Aquí te dejo un ejemplo simple de namespaced events. Consiste en un formulario que añade los valores que introduces en el campo "name" en una lista. La particularidad es que he dividido la tarea en 2 funciones, una para crear la lista y otra para añadir elementos, la primera de ellas la bindeo antes que la segunda y la desvindeo al acabarse ella misma. De esta manera consigo que la primera vez se llame a ambas funciones y las sucesivas solamente a la segunda.

HTML:

<form action="" method="post" id="addName">
<p>
  <label for="Name">Nombre:</label>
    <input type="text" name="name" value="" id="name"/>
  </p>
  <p><input type="submit" value="Añadir nombre"/></p>
</form>

Javascript:

//Bind Event for the first time
$('#addName').bind('submit.first', function(){
    $(this).after('<p>Lista de nombres:</p><ul id="listNames"></ul>').unbind('submit.first');
});

//Bind Event for ever
$('#addName').bind("submit", function(){
if('' == this.name.value) return false;
$('#listNames').append('<li>' + this.name.value + '</li>');
return false;
});

Ese es un ejemplo para ver el funcionamiento del namespacing, pero en este caso, ya que eliminamos el evento en la primera ejecución sería más útil utilizar el atajo one, quedando el primer evento de la siguiente manera:

//Bind Event for the first time
$('#addName').one(function(){
    $(this).after('<p>Lista de nombres:</p><ul id="listNames"></ul>');
});

Aquí podéis ver el funcionamiento del código expuesto anteriormente:

Demo

¿Qué te aparecido? ¿Te resulta útil? Cuéntanos dónde y cómo lo has aplicado para que aprendamos todos trucos nuevos de jQuery.

Expand

The Smashing Book

Libro de Smashing MagazineYa por fin ha salido a la venta el libro de Smashing, en el que encontrarás las mejores prácticas en diseño Web moderno. Sus 313 páginas están llenas de consejos técnicos y buenas prácticas de codificación, usabilidad y optimización, adnás podrás aprender a como crear interfaces de usuario con éxito y aplicar los principios de marketing para aumentar las tasas de conversión. Todo esto no sería posible sin mostarte cómo obtener el máximo provecho de la tipografía, color y marca.

Un libro muy recomendable para los diseñadores web y desarrolladores de interfaces, que espero tener en mis manos muy pronto para poder contar de primera mano mis impresiones.

Expand

Chuleta de HTML5 en PDF

La semana pasada os hablamos de Reset CSS para HTML5 y esta semana os traemos una chuleta de HTMl5 publicada en Smashing Magazine en versión PDF para que podamos aprender las nuevas etiquetas e ir preparando nuestras webs y aplicaciones online y estar listos para cuando la mayoría de los navegadores lo soporten.

¿Qué os parece el HTML5? ¿Echáis de menos alguna etiqueta que se debería haber incluido? ¿Tienes ya tu web preparada y quieres compartirla con nosotros?

Expand

Reset CSS para HTML5

Ya os hablamos en CSS: Consejos y buenas prácticas sobre la importancia de resetear las propiedades CSS para eliminar diferencias entre navegadores desde el principio. Pues ahora os traemos de la mano de html5doctor.com un nuevo reset CSS adaptado a HTML5. Incluye las nuevas etiquetas y elimina las que ya no están permitidas en este lenguaje de marcado.


/*
html5doctor.com Reset Stylesheet
v1.4
2009-07-27
Author: Richard Clark - http://richclarkdesign.com
*/

html, body, div, span, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
abbr, address, cite, code,
del, dfn, em, img, ins, kbd, q, samp,
small, strong, sub, sup, var,
b, i,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, dialog, figure, footer, header,
hgroup, menu, nav, section,
time, mark, audio, video {
margin:0;
padding:0;
border:0;
outline:0;
font-size:100%;
vertical-align:baseline;
background:transparent;
}
body {
line-height:1;
}

article, aside, dialog, figure, footer, header,
hgroup, nav, section {
display:block;
}

nav ul {
list-style:none;
}

blockquote, q {
quotes:none;
}

blockquote:before, blockquote:after,
q:before, q:after {
content:'';
content:none;
}

a {
margin:0;
padding:0;
border:0;
font-size:100%;
vertical-align:baseline;
background:transparent;
}

ins {
background-color:#ff9;
color:#000;
text-decoration:none;
}

mark {
background-color:#ff9;
color:#000;
font-style:italic;
font-weight:bold;
}

del {
text-decoration: line-through;
}

abbr[title], dfn[title] {
border-bottom:1px dotted #000;
cursor:help;
}

table {
border-collapse:collapse;
border-spacing:0;
}

hr {
display:block;
height:1px;
border:0;
border-top:1px solid #cccccc;
margin:1em 0;
padding:0;
}

input, select {
vertical-align:middle;
}

Puedes descargar el código del proyecto html5resetcss en google code.

Expand

jQTouch - plugin de jQuery para desarrollo web para móviles

jQTouch¿Estás pensando en adaptar tu web al iPhone o al Android?, o quizá ¿quieres desarrollar una aplicación web para dispositivos móviles? Pues esto te puede interesar. Se trata de un plugin de jQuery para desarrollo web móvil para iPhone, iPod Touch y otros dispositivos con visión de futuro.

Este plugin te permite mediante una fácil configuración animaciones nativas de WebKit, precarga de imágenes, eventos callback, plantillas flexibles y extensiones. Dispone de una ámplia documentación y multiples ejemplos, por lo que no te costará poner en marcha la aplicación que tienes en mente.

Puedes descargarlo del proyecto jQTouch en Google Code.