<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Alex Sancho</title>
<link>http://alexsancho.name/</link>
<description></description>
<dc:language>en-us</dc:language>
<dc:creator>alex@alexsancho.name</dc:creator>
<dc:rights>Copyright 2010</dc:rights>
<dc:date>2007-02-02T15:16:02+01:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=3.35" />
<admin:errorReportsTo rdf:resource="mailto:alex@alexsancho.name"/>
<sy:updatePeriod>hourly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
<item>
<title>Dos en uno</title>
<link>http://alexsancho.name/archives/2007/02/dos-en-uno/</link>
<description>Actualizacion de styled y window.growl</description>
<guid isPermaLink="false">1792@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Lamentablemente esta ha sido una semana complicada en el ámbito laboral, con lo que el weblog a quedado relegado a un segundo plano.

Ya hacia días que había actualizado styled y [window.growl][1] para trabajar con [jQuery 1.1][2], pero no he tenido tiempo para comunicar estas actualizaciones.

De manera muy rápida recordaros que [styled se puede descargar desde esta pagina][3], y   que para utilizar Growl con jQuery 1.1 tenemos que modificar las lineas 29 y 30 dejándolas como veréis a continuación,

[code javascript]
    $('#growlmsg').css({top: he+'px', left: we+'px'}).show().html(msg).fadeTo(1000,1);
    $('#growl').css({top: he+'px', left: we+'px'}).show().fadeTo(1000,0.8);
[/code]

P.D. Esta actualización de styled también corrige el problema por el cual IE7 no muestra los mensajes de Growl.

[1]: http://alexsancho.name/archives/2006/11/windowgrowl-con-jquery/
[2]: http://jquery.com/
[3]: http://alexsancho.name/archives/projects/styled/<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2007/02/dos-en-uno/#comments" title="Comentarios en: Dos en uno">Comentarios (0)</a></p>]]></content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2007-02-02T15:16:02+01:00</dc:date>
</item>
<item>
<title>Window.Growl con jQuery</title>
<link>http://alexsancho.name/archives/2006/11/windowgrowl-con-jquery/</link>
<description>Window.Growl basado en jQuery</description>
<guid isPermaLink="false">1744@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Esta es una modificación del script original ideado por [Daniel Mota][1] basada en la libreria jQuery.

[code javascript]
    var Growl = {
        init:function(width,height,duration) {
            Growl.msg = [];
	    Growl.active = false;
	    Growl.duration = (duration || 2)*1000;
	    Growl.height = height/2;
	    Growl.width = width/2;
	    $(document).ready(function() {Growl.create();});
        },
        create:function() {
	    $('body').append('<p id="growlmsg"></p><div id="growl" class="growl"></div>');
        },
        queue:function() {
	    var msg = Growl.msg.pop();
	    if(msg) Growl.show(msg);
        },
        show:function(msg) {
	    if(Growl.active) {
    	        Growl.msg.push(msg);
	        return;
	    }
	    Growl.active = true;
	    var top = document.documentElement.scrollTop || window.pageYOffset || 0;
	    var left = document.documentElement.scrollLeft || window.pageXOffset || 0;
	    var h = (window.innerHeight || document.documentElement.clientHeight || 0)/2;
	    var w = (window.innerWidth || document.documentElement.clientWidth || 0)/2;
	    var he = top+h-Growl.height, we = left+w-Growl.width;
	    $('#growlmsg').top(he+'px').left(we+'px').show().html(msg).fadeTo(1000,1);
	    $('#growl').top(he+'px').left(we+'px').show().fadeTo(1000,0.8);
	    setTimeout(function() {Growl.hide();}, Growl.duration);
        },
        hide: function() {
	    $('#growlmsg').fadeOut("slow",function() {Growl.display($(this));});
	    $('#growl').fadeOut("slow",function() {
	        Growl.display($(this));
	        Growl.active = false;
	        setTimeout(function() {Growl.queue();}, 200);
	    });
        },
        display: function(e) {
	    e.hide();
        }
    };
[/code]

###Metodos de uso

* <code>Growl.show('Mensaje que queremos mostrar');</code> 

###Ejemplo

[Ver Growl en funcionamiento][2]

[1]: http://icebeat.bitacoras.com/post/212/window-growl
[2]: http://wp.alexsancho.name/index.php?wptheme=Styled
<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/11/windowgrowl-con-jquery/#comments" title="Comentarios en: Window.Growl con jQuery">Comentarios (8)</a></p>]]></content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2006-11-28T21:03:52+01:00</dc:date>
</item>
<item>
<title>Validacion de formularios con prototype</title>
<link>http://alexsancho.name/archives/2006/09/validacion-de-formularios-con-prototype/</link>
<description>validacion de formularios utilizando selectores css y prototype</description>
<guid isPermaLink="false">1652@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Siempre he cre&iacute;do que la mejor manera de verificar los datos de un formulario consta de dos partes.

En primer lugar, una validaci&oacute;n simple del lado del cliente mediante javascript, donde se comprueba que todos los campos requeridos contengan datos y que estos datos est&eacute;n en el formato que se esperan.

La segunda parte del proceso se ejecuta en el servidor y se basa en comprobaciones mas estrictas donde se verifica la integridad de los datos.

Para la primera validaci&oacute;n, la que se realiza en el lado del cliente antes de enviar ning&uacute;n dato, existe muchas combinaciones, en este caso, veremos como hacerlo de forma muy simple ayudados de la librer&iacute;a prototype.

Lo primero que tenemos que hacer es dise&ntilde;ar nuestro formulario y decidir que campos necesitamos comprobar.

[code html]
    <form action="." method="post" id="usrFrm" onsubmit="checkForm(this.id);">
        <fieldset>
            <legend>Datos del usuario</legend>
                <label for="name"><input type="text" id="name" class="required" value="nombre" /></label>
                <label for="email"><input type="text" id="email" class="required email" value="nombre" /></label>
                <label for="phone"><input type="text" id="phone" class="required numeric" value="nombre" /></label>
                <label for="url"><input type="text" id="url" class="required" value="nombre" /></label>
        </fieldset>
        <p><input type="submit" id="submit" value="Enviar" /></p>
    </form>
[/code]

Como se puede ver, utilizo tres clases diferentes para marcar los campos del formulario, con la siguiente funci&oacute;n podremos validar cada campo utilizando selectores css, es decir, se comprobara que todos los campos marcados con la clase "required" contengan datos, adem&aacute;s, se comprobara el formato de los datos en los campos marcados como "email" o "numeric",

[code javascript]
    function checkForm(id) {
        var error = false;
        $$('form#'+id+' .required').each(function(node){
            if (node.value == "") {
                error = true;
                node.style.background = "#F00";
            }
        });
        $$('form#'+id+' .email').each(function(node){
            if ((node.value.indexOf(".") > 2) && (node.value.indexOf("@") > 0)) {
                error = true;
                node.style.background = "#F00";
            }
        });
        $$('form#'+id+' .numeric').each(function(node){
	    var strChars = "0123456789.-";
	    for (i = 0; i < node.value.length; i++) {
	        strChar = node.value.charAt(i);
	        if (strChars.indexOf(strChar) == -1) {
                    error = true;
                    node.style.background = "#F00";
                }
            }
        });
        if (error == true) {
            alert('Asegurate de rellenar todos los campos requeridos');
        } else {
        		$(id).submit();
        }
    }
[/code]

esta claro que no podemos basar la integridad de los datos en este tipo de comprobaciones, pero son un primer filtro que le da mas dinamismo a la aplicacion ya que permite al usuario corregir errores sin tener que esperar a las comprobaciones del servidor, que por norma suelen ser mas lentas.<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/09/validacion-de-formularios-con-prototype/#comments" title="Comentarios en: Validacion de formularios con prototype">Comentarios (2)</a></p>]]></content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2006-09-17T13:04:50+01:00</dc:date>
</item>
<item>
<title>Prototype+scriptaculous+dom</title>
<link>http://alexsancho.name/archives/2006/09/protypescriptaculousdom/</link>
<description>diferentes metodos para manejar el dom ayudados por estas librerias</description>
<guid isPermaLink="false">1642@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Trabajar con el modelo de documento en la web (DOM) no siempre es tarea f&aacute;cil, sobretodo cuando lidiamos con paginas din&aacute;micas, personalmente gasto mas horas al desarrollar intentando dar con los nodos, hijos y padres que en cualquier otra tarea.

Con la ultima revisi&oacute;n de prototype todo se simplifica un poco, ahora podemos acceder a las diferentes partes de documento con un m&iacute;nimo de esfuerzo.

Si utilizamos el siguiente bloque html como referencia,

[code html]
    <div id="block">
        <ul id="nav">
            <li class="btn"><a href="#"></a></li>
            ....
        </ul>
    </div>
[/code]

Para recorrer los diferentes nodos solo tenemos que elegir el objeto desde el que partimos,

[code javascript]
    $('nav').up; // parentNode <div id="block">
    $('nav').down // element.fistChild <li class="btn">
[/code]

Esto es solo una peque&ntilde;a muestra de las nuevas posibilidades que ofrece prototype, combinandolas con la posibilidad de asignar funciones segun selectores y eventos,

[code]
    $$('#block ul#nav .btn a').each(function(node) {
        Event.observe(node, "click", function(e) {
            ...
        }
    }
[/code]

realmente disponemos de todo un arsenal de recursos para acceder al documento de principio a fin con unas pocas lineas de c&oacute;digo.

Scriptaculous tambi&eacute;n actualiza versi&oacute;n, pero en cualquier caso lo que me interesa ahora es que al igual que prototype cuenta con una clase para manejar el dom, pero de una forma diferente a prototype, en este caso, lo que nos ofrece es la posibilidad de crear nuevos elementos dentro del documento.

Continuando el ejemplo, para a&ntilde;adir un nuevo hijo a nuestra lista, 

[code javascript]
    bloque = Builder.node('li', {class:'btn'}, [
        Builder.node('a', {href:'#'})
    ]);
    $('nav')appendChild(bloque);
[/code]

creo que mas sencillo no puede ser, podemos crear nodos simplemente incluyendo uno dentro de otro tal y como queremos que aparezcan en el documento.

Cada d&iacute;a voy descubriendo nuevas posibilidades de amabas librer&iacute;as y a medida que las conozco mejor mas me gustan, el peque&ntilde;o precio que hay que pagar por los kb extra bien merecen la pena.

Si estas utilizando alguna de ellas en tus proyectos no dejes de actualizar esta ultima versi&oacute;n de scriptaculous que sobretodo arregla algunos bus con IE.<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/09/protypescriptaculousdom/#comments" title="Comentarios en: Prototype+scriptaculous+dom">Comentarios (0)</a></p>]]></content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2006-09-06T19:34:47+01:00</dc:date>
</item>
<item>
<title>Esquinas personalizadas con javascript</title>
<link>http://alexsancho.name/archives/2006/07/esquinas-personalizadas-con-javascript/</link>
<description>Otra tecnica para crear esquinas personalizadas a traves del dom</description>
<guid isPermaLink="false">1535@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Existen diferentes m&eacute;todos para conseguir este efecto, este que propongo es una mezcla de t&eacute;cnicas que creo que destaca por su sencillez y porque ofrece la posibilidad de aplicar el efecto a mas de un elemento en la misma pagina.

Combinando el uso de javascript y css manipularemos el dom para aplicar el marcado necesario a los elementos que deseemos, el funcionamiento del script se resume de la siguiente manera, al cargarse el documento, recorre el &aacute;rbol de elementos buscando aquellos marcados con la clase rounded, a los que le a&ntilde;ade cuatro elementos "span" posicionados de manera absoluta en las esquinas. Luego, por medio de css, decoramos estos cuatro elementos con la imagen que creara el efecto.

Una de las ventajas de utilizar esta t&eacute;cnica es que se puede aplicar a cualquier elemento, e incluso a varios dentro del mismo documento.

Pod&eacute;is ver el efecto en marcha en el [siguiente ejemplo][1].

Pasemos a la "magia" del asunto,

Para el ejemplo he creado un script con tres funciones, de las cuales dos son auxiliares y las comentare brevemente, la que realmente aplica el efecto y comentare con mas detalle es la siguiente:

[code javascript]
    function roundCorners() {
        var rd = getElementsByClass("rounded");
        for (var i = 0; i < this.rd.length; i++) {
            for(var j = 1; 4 >= j;  j++) {
                var corn = document.createElement('span');
                corn.className = 'corn'+j;
                rd[i].appendChild(corn);
            }
        }
    }
[/code]

B&aacute;sicamente lo que estamos haciendo es leer el documento en busca de los elementos marcados con la clase "rounded", para esto utilizamos la funci&oacute;n [getElementsByClass escrita por Dustin Diaz][2], que nos devuelve un *array* con todos los objetos, a partir de aqu&iacute; entran en marcha dos bucles, el primero se ejecutara tantas veces como elementos contenga el array y el segundo a&ntilde;adir&aacute; el marcado necesario a cada elemento.

La segunda funci&oacute;n auxiliar es la conocida [addLoadEvent escrita por Simon Willison][3] y se encarga de que todo esto se realice durante la carga del documento, evitando tener que utilizar lanzadores adicionales dentro del c&oacute;digo html.

[code html]
    Antes:
    <p class="rounded">
        <a href="http://example.com">ejemplo</a>
    </p>
    -------------------------------------------------------------
    Despues:
    <p class="rounded">
        <a href="http://example.com">ejemplo</a>
        <span class="corn1" />
        <span class="corn2" />
        <span class="corn3" />
        <span class="corn4" />
    </p>
[/code]

Esta sera la parte de la hoja de estilos,

[code css]
    /* contenedor principal */
    .rounded {
        position:relative;
    }
     /* elementos a&ntilde;adidos */
    .rounded span {
        position:absolute;
        display:block;
        z-index:2;
        height:8px;
        width:8px;
    }
    .corn1 { /* esquina superior derecha */
        background:transparent url(../img/tr.png) top right no-repeat;
        top:0;
        right:0;
    }
    .corn2 { /* esquina superior izquierda */
        background:transparent url(../img/tl.png) top left no-repeat;
        top:0;
        left:0;
    }
    .corn3 { /* esquina inferior derecha */
        background:transparent url(../img/br.png) bottom right no-repeat;
        bottom:0;
        right:0;
    }
    .corn4 { /* esquina inferior izquierda */
        background:transparent url(../img/bl.png) bottom left no-repeat;
        bottom:0;
        left:0;
    }
[/code]

la primera regla aplica una posicion relativa al contenedor principal, mientras que los demas elementos que hemos a&ntilde;adido se posicionaran de manera absoluta con un z-index superior para superponerlos sobre el principal.

Esto seria todo, solo quedan las imagenes, que para el ejemplo tienen unas dimensiones de 12x12 pixels y estan en formato png de 24 bits, por lo que el efecto quedara un poco deslucido si se visualiza con IE. Esto no significa que exista ninguna limitacion a la hora de utilizar otro formato de imagen, ni que no se pueda incluir algun tipo de "trampa" para que IE renderize los png con transparencias de forma correcta si es necesario, esto lo dejo para la imaginacion de cada uno.

###Otros metodos similares

* [Rounded Images using CSS and some optional JavaScript][4]
* [Rounded Corners with CSS and JavaScript][5]

[1]: http://alexsancho.name/archives/examples/dom/corners/
[2]: http://www.dustindiaz.com/getelementsbyclass/
[3]: http://simon.incutio.com/archive/2004/05/26/addLoadEvent
[4]: http://www.elliotswan.com/2006/06/07/rounded-images/
[5]: http://www.sitepoint.com/article/rounded-corners-css-javascript
<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/07/esquinas-personalizadas-con-javascript/#comments" title="Comentarios en: Esquinas personalizadas con javascript">Comentarios (3)</a></p>]]></content:encoded>
<dc:subject>Diseño</dc:subject>
<dc:date>2006-07-18T07:07:59+01:00</dc:date>
</item>
<item>
<title>Javascript no intrusivo, scripts remotos</title>
<link>http://alexsancho.name/archives/2006/05/javascript-no-intrusivo-scripts-remotos/</link>
<description>mejorar la accesibilidad de un sitio web, no es cuestion de tecnologia, es cuestion de actitud</description>
<guid isPermaLink="false">1344@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Cuando me decido a incluir alg&uacute;n tipo de script que dependa del soporte del navegador, siempre me gusta ofrecer una opci&oacute;n alternativa intentando que el funcionamiento resulte lo mas similar posible en todos los escenarios.

De nuevo, la librer&iacute;a [prototype][1] hace que esto sea sumamente sencillo, supongamos el siguiente ejemplo, tenemos un bloque de texto que contiene un enlace, nuestra intenci&oacute;n es que el enlace apunte a una url real, en el caso de que el usuario soporte JavaScript, el contenido se actualizara sin necesidad de que el navegador refresque la ventana, en caso contrario el enlace actuara de forma normal.

Como siempre, para facilitarnos las cosas, le asignaremos una <code>id</code> al enlace, lo que nos permitir&aacute; acceder a el de una forma limpia, recordad, con prototype acceder a un elemento por su id es tan sencillo como <code>$('id-del-objeto');</code>.

El truco para que todo esto funcione se basa en que prototype pasa una cabecera propia con cada llamada remota, caracter&iacute;stica que se puede aprovechar en nuestro script para que responda de forma diferente seg&uacute;n el tipo de petici&oacute;n.

[code php]
    <?php
    function isAjax() {
        return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER ['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
    }
    if (isAjax()) {
    ?>
    <p>respuesta a una llamada remota</p>
    <?php
    } else {
    ?>
    ...
    <p>respuesta normal</p>
    ...
    <?php } ?>
[/code]

Creo que se entender&aacute; mejor si veis el [ejemplo][2] que he preparado, todas las lineas de la funci&oacute;n JavaScript est&aacute;n comentadas, con lo que estoy seguro de que no quedaran dudas, aunque como siempre, ten&eacute;is el formulario para hacer vuestros comentarios. 

[1]: http://prototype.conio.net/
[2]: http://alexsancho.name/archives/examples/ajax/unintrusive/<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/05/javascript-no-intrusivo-scripts-remotos/#comments" title="Comentarios en: Javascript no intrusivo, scripts remotos">Comentarios (0)</a></p>]]></content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2006-05-26T20:00:32+01:00</dc:date>
</item>
<item>
<title>Ajax.PeriodicalUpdater</title>
<link>http://alexsancho.name/archives/2006/05/ajaxperiodicalupdater/</link>
<description><![CDATA[Un peque&ntilde;o ejemplo de como utilizar esta funcion de prototype]]></description>
<guid isPermaLink="false">1320@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Otra de las funciones disponibles con la librer&iacute;a [prototype][1] es <code>Ajax.PeriodicalUpdater()</code> y provee de un m&eacute;todo sencillo para realizar llamadas remotas en intervalos de tiempo definidos.

Para el ejemplo utilizo un script php que muestra las ultimas canciones que he escuchado en [last.fm][2], el script es publico y se puede obtener en esta direcci&oacute;n [RecenTracksMagpie][3], junto a las instrucciones para ponerlo en marcha.

La parte del JavaScript es bien sencilla, solo necesitamos una copia de la librer&iacute;a prototype y la siguiente funci&oacute;n,

[code html]
    <script type="text/javascript">
	function lastSpy() {
	    var target = $('tracks');
	    if (!target) return false;
	    new Ajax.PeriodicalUpdater(target, '/ruta/del/script.php',{frequency:'30'});
	}
        Event.observe(window, 'load', lastSpy, false);
    </script>
[/code]

Para que todo esto funcione, tenemos que a&ntilde;adir un bloque <code>div</code> con la **id="tracks"** que sera donde aparezca la informaci&oacute;n,

<div id="tracks"></div>

En el caso del feed de audiscrobbler el efecto queda un poco apagado por el hecho de que el feed no se actualiza muy a menudo, pero es un m&eacute;todo genial para mostrar informaci&oacute;n en "tiempo real" como podr&iacute;a ser el numero de usuarios online o incluso la informaci&oacute;n meteorol&oacute;gica, dejo para vosotros las ideas creativas.

Salu2

[1]: http://prototype.conio.net/
[2]: http://last.fm
[3]: http://www.audioscrobbler.net/wiki/RecentTracksMagpie
<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/05/ajaxperiodicalupdater/#comments" title="Comentarios en: Ajax.PeriodicalUpdater">Comentarios (4)</a></p>]]></content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2006-05-23T23:55:33+01:00</dc:date>
</item>
<item>
<title>Capturar eventos con prototype</title>
<link>http://alexsancho.name/archives/2006/05/capturar-eventos-con-prototype/</link>
<description>protype ofrece sencillos metodos para realizar funciones basicas con javascript</description>
<guid isPermaLink="false">1299@http://alexsancho.name/</guid>
<content:encoded><![CDATA[La librer&iacute;a prototype entre otras cosas nos permite capturar eventos de una manera sencilla, supongamos que necesitamos lanzar una funci&oacute;n en el momento que carga la ventana, con prototype solo tenemos que a&ntilde;adir la siguiente linea que se encargara de realizar el trabajo.

[code javascript]
    Event.observe(window, "load", funcion.a.ejecutar, false);
[/code]

Si por el contrario lo que necesitamos es ejecutar una funci&oacute;n en el momento que se env&iacute;a un formulario, lo podemos hacer de la siguiente manera,

[code javascript]
        this.form = $('form-id');
        Event.observe(this.form, "submit", funcion.a.ejecutar.bind(this), false);
[/code]

como pod&eacute;is ver, a la funci&oacute;n a ejecutar le a&ntilde;ado <code>.bind(this)</code> que es otra funci&oacute;n nativa de prototype, y se encargara de evitar que el evento se propague, lo que nos permite manipular la forma en la que se comporta el formulario, si por ejemplo deseamos que el evento se detenga por completo, al final de nuestra funci&oacute;n podemos incluir <code>Event.stop(this)</code>.

Estas t&eacute;cnica son ideales para trabajar con el DOM y as&iacute; poder separar totalmente el c&oacute;digo JavaScript del contenido.

&iquest;Sencillo, no?<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/05/capturar-eventos-con-prototype/#comments" title="Comentarios en: Capturar eventos con prototype">Comentarios (2)</a></p>]]></content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2006-05-18T19:09:24+01:00</dc:date>
</item>
<item>
<title>Javascript no intrusivo: moo.ajax</title>
<link>http://alexsancho.name/archives/2006/02/javascript-no-intrusivo-mooajax/</link>
<description>Experimentando con el DOM y ajax</description>
<guid isPermaLink="false">1045@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Hace unos d&iacute;as comente algo sobre los beneficios de utilizar JavaScript de forma no intrusiva, hoy me gustar&iacute;a mostrar un ejemplo de lo sencillo que resulta implementar estas t&eacute;cnicas, y los sorprendentes resultados que se pueden conseguir.

Antes de comenzar, un par de detalles, la idea general del script es realizar una b&uacute;squeda en mi weblog sin tener que recargar la pagina, esta se realiza en tiempo real mediante una llamada a la [API de Yahoo! Search][1].

Para el ejemplo echare mano de dos bibliotecas, moo.ajax y prototype.lite, ambas de muy reducido tama&ntilde;o y que incluyen una serie de funciones de gran utilidad.

Comenzando por el c&oacute;digo html, todo el funcionamiento de nuestro script se basara en el formulario de b&uacute;squeda, crearemos una serie de elementos en el DOM que se a&ntilde;adir&aacute;n a diferentes partes del formulario. Para esto tendremos que definir algunas identidades en &eacute;l como veis aqu&iacute; abajo

[code html]
    <form action="search.php" method="post" id="sform">
    <fieldset><legend>Introduce el termino a buscar &raquo;</legend>
    <div><label for="p">Search Terms<input name="p" type="text" /></label></div>
    <p><input type="submit" value="search" id="sbtn" /></p>
    </fieldset>
    </form>
[/code]

esto es casi todo lo que necesitamos del html. Pasemos a nuestro script

[1]: http://developer.yahoo.net/<p><a href="http://alexsancho.name/archives/2006/02/javascript-no-intrusivo-mooajax/" title="Continuar Leyendo: Javascript no intrusivo: moo.ajax">Continuar leyendo Javascript no intrusivo: moo.ajax...</a></p><p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/02/javascript-no-intrusivo-mooajax/#comments" title="Comentarios en: Javascript no intrusivo: moo.ajax">Comentarios (3)</a></p>]]></content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2006-02-06T20:42:43+01:00</dc:date>
</item>
<item>
<title>Servicios web y weblogs</title>
<link>http://alexsancho.name/archives/2006/02/servicios-web-y-weblogs/</link>
<description>Una de Ajax, weblogs y Servicios Web</description>
<guid isPermaLink="false">1041@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Cada d&iacute;a es mayor el n&uacute;mero de servicios web dirigidos ha potenciar el uso de los weblogs, algunos ofrecen opciones realmente interesantes como es el caso de [Flickr][1], que permite mantener una colecci&oacute;n de fotograf&iacute;as, [Technorati][2], que nos ofrece un &iacute;ndice de las tendencias que mueven la blogosfera, [del.icio.us][3], personalmente mi preferido, que como casi todos sabemos, es la mejor opci&oacute;n para salvar los marcadores de nuestras paginas favoritas.

La lista es mucho m&aacute;s extensa, pero por lo pronto quiero centrarme en estos tres. Hace tiempo que uso mas o menos asiduamente estos servicios, y he aprovechado este fin de semana para realizar un peque&ntilde;o experimento de integraci&oacute;n.

Basandome en la idea de ofrecer recursos relacionados a los art&iacute;culos que escribo, y haciendo un extenso uso de las librer&iacute;as javascript [prototype][4] y [script.aculo.us][5], he a&ntilde;adido una sencilla interfase que permite importar elementos desde cualquiera de estos tres servicios.

Espero que os resulte de utilidad, no es que haya probado intensivamente el invento, con lo que si encontr&aacute;is que no funciona como se espera, enviarme un correo o dejad un comentario en esta entrada.

[1]: http://www.flickr.com/
[2]: http://technorati.com/
[3]: http://del.icio.us/
[4]: http://prototype.conio.net/
[5]: http://script.aculo.us/<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/02/servicios-web-y-weblogs/#comments" title="Comentarios en: Servicios web y weblogs">Comentarios (0)</a></p>]]></content:encoded>
<dc:subject>Web Services</dc:subject>
<dc:date>2006-02-06T12:44:08+01:00</dc:date>
</item>
<item>
<title>Javascript no intrusivo</title>
<link>http://alexsancho.name/archives/2006/01/javascript-no-intrusivo/</link>
<description>Behaviour, es una imprescindible libreria que nos permite programar con javascript de manera mas sencilla</description>
<guid isPermaLink="false">1006@http://alexsancho.name/</guid>
<content:encoded><![CDATA[Una de las premisas mas importantes planteadas al dise&ntilde;ar mediante el uso de est&aacute;ndares es la separaci&oacute;n de capas l&oacute;gicas, es decir, por un lado tenemos el maquetado, que se representa mediante lenguaje (x)html, por otra parte esta el dise&ntilde;o visual, que normalmente se adjunta mediantes hojas de estilo (css) hasta aqu&iacute; todo esta muy claro.

Pero que ocurre con el comportamiento que se le quiera asignar a algunos objetos del documento, aqu&iacute; es donde entra en juego el lenguaje JavaScript.

Imaginemos por ejemplo que tenemos un enlace al que le queremos dar una funcionalidad un poco diferente al resto, abrirlo en una ventana nueva por ejemplo, a la mayor&iacute;a lo primero que nos viene en mente es hacer algo mas o menos similar a lo siguiente:

[code html]
    <a href="popup.html" onclick="window.open('popup.html', 'width=400,height=450,resizable=yes')">Abrir popup</a>
[/code]

Lamentablemente esta linea acaba con toda nuestra teor&iacute;a de separaci&oacute;n de capas, por fortuna, existen maneras alternativas para asignar eventos usando JavaScript, en el caso concreto de este ejemplo una manera mas limpia de realizar lo mismo necesitaba algo mas de c&oacute;digo para poder llevarse a cabo.

Primero tendremos que asignar una identidad &uacute;nica al enlace, y luego mediante el DOM asignaremos el evento a dicha id, algo mas o menos tal que as&iacute;.

[code html]
    <a href="popup.html" id="mypopup">Abrir popup</a>
[/code]

[code js]
    <script type="text/javascript">
    var x = getElementByID('mypopup');
    x.onclick = function() {
        window.open('popup.html', 'width=400,height=450,resizable=yes')
    }
    </script>
[/code]

Sencillo, &iquest;no? bueno, quiz&aacute;s no resulte tan sencillo, pero gracias a mentes inquietas como la de  [Ben Nolan][1], disponemos de algunas herramientas que si que hacen que resulte una tarea sencilla.

Me refiero a [behaviour][2], una librer&iacute;a JavaScript basada en la funci&oacute;n document.getElementsBySelector escrita por [Simon Willison][3]. Este fant&aacute;stico "trozo de c&oacute;digo" nos permite olvidarnos de programar complejas funciones que asignen eventos seg&uacute;n clase, id o selector.

Continuando con el ejemplo anterior, si incluimos esta librer&iacute;a podemos conseguir el mismo efecto asignando la funci&oacute;n directamente al id seleccionado,

[code js]
    <script type="text/javascript">
      var myrules = {
                  '#mypopup' : function(element){
                        element.onclick = function(){
                              window.open('popup.html', 'width=400,height=450,resizable=yes')
                  }
            }
      };
    Behaviour.register(myrules);
    </script>
[/code]

Personalmente creo que resulta una librer&iacute;a de inmensa utilidad, ahora solo falta ver como poder sacarle partido de manera &oacute;ptima.

Salu2 y buen fin de semana

[1]: http://bennolan.com/
[2]: http://bennolan.com/behaviour/
[3]: http://simon.incutio.com/
<p style="font-family:Verdana, Arial, sans-serif; font-size:11px; color: #333333; background-color: #f5f5f5; border: 1px solid #c0c0c0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 4px; display: block;"><a href="http://alexsancho.name/archives/2006/01/javascript-no-intrusivo/#comments" title="Comentarios en: Javascript no intrusivo">Comentarios (4)</a></p>]]></content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2006-01-20T15:24:37+01:00</dc:date>
</item>

</channel>
</rss>