FlipClock, tutorial para desarrollar un plugin de jQuery

Publicada el 02/03/2009 a las 06:03 y leída 3095 veces. Traducir ao galego Traducir ao galego.

Si os gusta el desarrollo web seguro que conoceis el framework de javascript jQuery. Personalmente yo comencé mis primeros desarrollos usando otros frameworks disponibles (sobre todo mootools) pero debido a la popularidad de jQuery y su integración en sistemas como Wordpress o Drupal he tenido que adaptarme a esta biblioteca.

A pesar de que jQuery tiene una muy buena documentación comparado con otros proyectos, en su momento eché en falta la información sobre como desarrollar un plugin básico para jQuery explicado de forma sencilla. Así que he desarrollado un pequeño plugin a modo de ejemplo para intentar solucionar las dudas iniciales que podais tener. Para ello vamos a programar un flip clock:

FlipClock for jQuery


Lo primero que necesitamos es crear un nuevo fichero que llamaremos jquery.flipclock.js. Editamos el archivo y escribimos la estructura básica del plugin:

JavaScript:
  1. (function($){
  2.  $.fn.flipclock = function(options) {
  3.   return this.each(function() {
  4.    return false;
  5.   });
  6.  };
  7. })(jQuery);

En este plugin necesitaremos llevar una serie de variables y opciones generales, así que definiremos unos valores por defecto al comienzo de la función flipclock:

JavaScript:
  1. // definimos variables generales
  2. var obj, divclock, divopt, flip, curtime;
  3. // establecemos las opciones
  4. var options = $.extend({
  5.   ampm: false,
  6.   dot: false,
  7.   msg: 'Hola Mundo'
  8. }, options);

Tras esto añadimos las funciones necesarias. En este plugin necesitamos dos: una para construir el reloj y otra para mostrar la barra de información.

La función que contruye el reloj básicamente lo que hace es obtener la fecha y generar dinámicamente el código HTML que se visualizará en la página. Tendrá en cuenta la opción de formato (ampm) para construir la hora en formato corto AM/PM o largo (24H):

JavaScript:
  1. // funcion encargada de recuperar la hora y generar el HTML
  2. var setclock = function() {
  3.   var gh, gm, hd, hh, md, mm, html;
  4.   html = '';
  5.   // obtenemos la hora y los minutos
  6.   gh = new Date().getHours();
  7.   gm =  new Date().getMinutes();   
  8.   // si usamos el formato de hora corta, modificamos la fecha y mostramos el AM/PM
  9.   if (options.ampm) {
  10.     html = '<span class="format">AM</span>';
  11.     if (gh>12) {
  12.       gh = gh - 12;
  13.       html = '<span class="format">PM</span>';
  14.     };
  15.   };
  16.   // desglosamos los digitos de la hora y minutos
  17.   if (gh>9) {
  18.     hd = gh.toString().substring(0,1);
  19.     hh = gh.toString().substring(1);
  20.   } else {
  21.     hd = '0';
  22.     hh = gh.toString();
  23.   };
  24.   if (gm>9) {
  25.     md = gm.toString().substring(0,1);
  26.     mm = gm.toString().substring(1);
  27.   } else {
  28.     md = '0';
  29.     mm = gm.toString();
  30.   };
  31.   // generamos el HTML
  32.   html += '<img class="n'+hd+'" src="img/blank.gif" alt="'+hd+'" /><img class="n'+hh+'" src="img/blank.gif" alt="'+hh+'" />';
  33.   if(options.dot) html += '<span class="dot"></span>';
  34.   html += '<img class="n'+md+'" src="img/blank.gif" alt="'+md+'" /><img class="n'+mm+'" src="img/blank.gif" alt="'+mm+'" />';
  35.   // recargamos el reloj si la hora es distinta a la mostrada actualmente
  36.   if(curtime!=gh.toString()+gm.toString()){
  37.     curtime = gh.toString()+gm.toString();
  38.     $(divclock).html(html);
  39.   };
  40. };

La función que construye la barra de información tan solo muestra un mensaje predefinido y activa un enlace para cambiar el formato de la hora:

JavaScript:
  1. // funcion encargada de mostrar la barra de opciones (mensaje + cambio de formato de hora)
  2. var setopt = function() {
  3.   // creamos el bloque de opciones
  4.   divopt = document.createElement('div');   
  5.   // asginamos su clase de estilo y su HTML
  6.   divopt.className = 'opt';
  7.   $(divopt).html(options.msg);
  8.   // construimos un enlace para alternar entre los modos de formato de fecha
  9.   ampm = document.createElement('a');
  10.   ampm.className = 'mode';
  11.   ampm.setAttribute('href', '#');
  12.   ampm.innerHTML = (options.ampm) ? '24h' : '12h';
  13.   // al pulsar sobre el enlace modificamos la opcion de formato y el texto del enlace
  14.   $(ampm).click (function (evt) {
  15.     evt.preventDefault();
  16.     if (options.ampm) {
  17.       ampm.innerHTML = '12h';
  18.       options.ampm = false;
  19.     } else {
  20.       ampm.innerHTML = '24h';
  21.       options.ampm = true;
  22.     };
  23.     return false;
  24.   });
  25.   // agregamos en enlace al bloque de opciones
  26.   $(divopt).prepend(ampm);
  27.   return false;
  28. };

Finalmente nos quedaría la llamada principal del plugin. Esta llamada se encarga de llamar a las otras funciones y generar un temporizador para que se actualice el reloj.

JavaScript:
  1. // llamada principal: construye el reloj en el elemento usado al llamar a flipclock
  2. return this.each(function() {
  3.  obj = $(this);
  4.  // creamos el bloque que va a contener al reloj
  5.  divclock = document.createElement('div');
  6.  // asginamos su clase de estilo
  7.  divclock.className = 'clock';
  8.  // creamos un intervalo de actualizacion del reloj
  9.  flip = setInterval(setclock, 1000);
  10.  // llamamos a la contruccion de la barra de opciones
  11.  setopt();
  12.  // agregamos el bloque del reloj y la barra de opciones al elemento principal
  13.  $(obj).append(divclock);
  14.  $(obj).prepend(divopt);
  15.  return false;
  16. });

Con nuestro plugin finalizado tan solo nos queda declarar la llamada en la página web. En este caso necesitamos llamar al plugin desde un elemento en el cual se construirá el reloj:

HTML:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2.   <title>FlipClock in jQuery for marcosesperon</title> 
  3.   <link rel="stylesheet" type="text/css" href="flipclock.css" media="screen" />  
  4.   <script type="text/javascript" src="js/jquery-1.2.3.pack.js"></script>      
  5.   <script type="text/javascript" src="js/jquery.flipclock.js"></script>
  6.   <script type="text/javascript"> 
  7.     $(document).ready(function(){
  8.       $("#flipclock").flipclock({ampm: true, dot: true});
  9.     }); 
  10.   </script>
  11. </head>
  12.   <div id="flipclock"></div>
  13. </body>
  14. </html>

Como podeis comprobar, en la llamada se pueden pasar los valores de las opciones que queremos que se sobreescriban.

Tan solo nos queda aplicar un poco de CSS al HTML generado para darle un toque más atractivo.

Podeis ver el resultado final de la demostración o descargar todo el ejemplo en este ZIP:

FlipClock plugin for jQuery
Ver: 0.1 Tam: 140 Kb

Otras entradas relacionadas

desarrollo web flip clock Javascript jquery plugin Programación reloj

dolcebita

  • @Facebook User: En el artículo de la Wikipedia tienes mucha información y enlaces relacionados.
  • Facebook User
    En que direcciones puedo encontrar información de como aprender a crear QR-CODE?
  • Mimi Kelan
    Interesantísimo este artículo, mi hijo es fanático de todo esto que tenga que ver con la informática. Que bueno saber si se le puede invitar a una página donde aprender lo básico para que luego pueda continuar solo, en el desarrollo de planes de trabajo.
  • @Felix: gracias por el aviso! ;)
  • Felix
    Cuando se intenta descargar el archivo...
    error: 'http://www.hnkweb.com/wp-content/uploads/2009/03/flipclock.zip' not found
  • Gran artículo!

    (y ni un comentario, eh? asco de blogosfera...)
blog comments powered by Disqus