Contenido

Validar formularios con jQuery

25 Jun

+ 16

Hace unas semanas tuve que desarrollar una función que me permitiera validar formularios mediante Javascript de una forma fácil y rápida. Tenía que ser con jQuery por que es el framework que estamos usando ahora en el trabajo. Una de las premisas era que debido a la aplicación y a la tecnología, necesitaba que fuera lo más flexible posible, por ese motivo opté por el siguiente código:

El código

//Filtros
var filters = {
    requerido: function(el) {return ($(el).val() != ” && $(el).val() != -1);},
    email: function(el) {return /^[A-Za-z][A-Za-z0-9_]*@[A-Za-z0-9_]+\.[A-Za-z0-9_.]+[A-za-z]$/.test($(el).val());},
    telefono: function(el){return /^[0-9]*$/.test($(el).val());}};
// Extensiones
$.extend({
	stop: function(e){
        if (e.preventDefault) e.preventDefault();
        if (e.stopPropagation) e.stopPropagation();
    }
});
// Código
$(document).ready(function(){
	$(”form.validable”).bind(”submit”, function(e){
		if (typeof filters == ‘undefined’) return;
	    $(this).find(”input, textarea, select”).each(function(x,el){
	        if ($(el).attr(”className”) != ‘undefined’) {
	        $.each(new String($(el).attr(”className”)).split(” “), function(x, klass){
	            if ($.isFunction(filters[klass]))
	                if (!filters[klass](el))  $(el).addClass(”error”);
	        });
	        }
	    });
		if ($(this).find(”.error”).size() > 0) {
			$.stop(e || window.event);
			return false;
		}
	    return true;
	});
});
	

Explicación

Si no fijamos en el código podemos ver que este script, será ejecutado en cuando el contenido de la página esté completamente cargado, esto lo conseguimos gracias a $(document).ready(); que jQuery nos ofrece.

Una vez cargado el contenido, se encargará de recorrar todos los elementos y buscará todos los elementos <form class="validable">, a los que le añadirá un listener que será ejecutado en el momento que el formulario ejecute el método submit().

En ese momento, el script recoge todos los element <input />, <textarea /> y <select /> del formulario y revisa las clases de cada elemento. Dependiendo de la clase y si está está definida en el objeto filters, realizará una comprobación u otra.

El objeto filters, se compone de una serie de métodos que serán lanzados para validar cada uno de los elementos, por ejemplo:

//HTML
<input type=”text” name=”prueba” value=”" class=”requerido email noanieto” />

//Javascript (Filtros)
var filters = {
       requerido: function(el) {return ($(el).val() != ” && $(el).val() != -1);},
       email: function(el) {return /^[A-Za-z][A-Za-z0-9_]*@[A-Za-z0-9_]+\.[A-Za-z0-9_.]+[A-za-z]$/.test($(el).val());},
       noanieto: function(el){return !”anieto”.indexOf($(el).val());}
}

Como podemos ver el elemento <input />, le estamos indicando que es del tipo requerido, email y noanieto. Validaciones que definimos en el objeto filters. En caso de no existir una de las clases indicadas en el elemento <input /> (o cualquier otro), esta será omitida.

Si el elemento no cumple una de las condiciones, añadiremos una clase más al elemento (class="error") y pararemos la ejecución del submit().

Demo

He montado una pequeña demo para verlo funcionar. La podeis probar aqui.

Aclaraciones

Está claro que se trata de una validación Javascript y que su única función es mejorar la experiencia del usuario evitando que llegue a submitar una página con datos erroneos, para hacer las cosas bien, la página receptora, debería hacer la misma comprobación y devolver a la página anterior en caso de error, así los usuarios que no tengan la capacidad de ejecutar javascript, tendrán un resultado igual a los que sí, aunque tengan que esperar a la carga de la página.

Versión para MooTools

Epplestun, me pasa una adaptación del script para MooTools. Muchas gracias!!!

$(document).addEvent('domready', function() {
       $(document.body).getElements('form.validable').addEvent('submit', function(e) {
               if (typeof filters == 'undefined')
                       return;

          this.getElements("input, textarea, select").each(function(el) {
               if (el.getProperty("class").length) {
                       el.removeClass("error");
                               el.getProperty("class").split(" ").each(function(filtro) {
                                       if (!filters[filtro](el))
                                               el.addClass(”error”);
                               });
               }
          });

          this.getChildren().each(function(el) {
               if(el.hasClass(”error”)) {
                               e = new Event(e);
                               e.stop();
                       return false;
               }
          });

          return true;
       });

Texto vertical con jQuery.flipv()

16 Jun

+ 1

Curiosa utilidad desarrollada en Javascript usando jQuery en la que podremos poner texto en vertical en nuestras aplicaciones. Usando el elemento <canvas /> como base para plugin, flipv() nos facilita el trabajo considerablemente.

Ejemplo de uso

// Automáticamente mediante class
<p class='flipv'>Texto vertical</p>
// Manualmente
<p class="textovertical">Texto vertical</p>
<script type="text/javascript">$("p.textovertical").flipv()</script>

Demo y Descarga

Podemos verlo funcionando en este enlace y descargarlo directamente desde la página del autor.

jQuery UI 1.5, Un API para gobernarlos a todos

9 Jun

+ 2

Hoy anuncian la salida de jQuery UI 1.5, el script.aculo.us de jQuery. En la que al parecer han eliminado cerca del 95% de los métodos que se usaban previamente para centralizar más las llamadas a los efectos disponibles.

  • $(”div”).draggable() Crea un Draggable
  • $(”div”).draggable(”destroy”) Lo destruye
  • $(”div”).draggable(”method”) Llama al método del plugin

Tambien se ha eliminado jquery.dimensions.js ya que este ya forma parte del nuevo jQuery 1.2.6, ui.mouse.js y las dependencias *.ext.js, intrucción a ui.core.js.

En esta nueva versión, se ha añadido un sistema de traza de errores que facilita considerablemente el debug de nuestros scripts. Para ello han desarrollado un fichero jquery.simulates.js, que se encarga de emular los eventos lanzados por los navegadores y así testear nuestras aplicaciones sin lanzar los verdaderos eventos.

Y por si no fuera poco, nos deleítan con un Theme Creator para que nuestros plugins mediante jQuery UI sean mucho más fáciles de crear.

Combos dependientes accesibles con PHP y jQuery

27 May

+ 8

En el último proyecto en el que estoy desarrollando en el trabajo he tenido que crear unos combos dependientes, hasta el momento siempre los había hecho con Javascript, usando Ajax para cargar los datos de un combo a otro, pero para este proyecto quería hacerlo un poco más accesible.

Como ya hemos visto en muchos posts, el desarrollar pensando en ser accesibles para todo el mundo es complicado, pero no imposible.

Empecemos

Lo primero que tenemos que hacer es tener claro que es lo que queremos hacer, en el ejemplo, una select de destino que dependerá de una select padre llamada pais.

combos_dependientes_accesibles

Viendo que es lo que necesitamos crear, veamos como podría ser una aproximación al código PHP que necesitamos.

Al código…

Primero vayamos por partes, y como hay que empezar por alguna definamos la estructura en el servidor y ya iremos subiendo.

destino.php

<?php if ($_POST["type"] == “xml”)	header (”content-type: text/xml”); ?>
<select id=”destino” name=”destino”>
        <option value=”-1″>Selecciona una zona</option>
<?php if ($_POST["pais"] == “ES”){ ?>
	<option value=”PMI”>Palma de Mallorca</option>
	<option value=”AGP”>Malaga</option>
	<option value=”BCN”>Barcelona</option>
<?php } else if($_POST["pais"] == “FR”) { ?>
	<option value=”TOU”>Toulousse</option>
	<option value=”CHD”>Charles de Gaulle</option>
<?php } ?>
</select>

Este fichero es un ejemplo rápido de un XML bien formado, que a su vez hará de elemento <select /> en nuestro script. La primera línea nos condicionará, más adelante, el formato de salida que usaremos. Ahora veamos en donde lo incrustamos.

index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es_ES">
<head>
	<title>Combos dependientes accesibles</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
	<form id="form" method="post" action="<?=$url?>">
		<p class="pais">
		Pais:
			<select name="pais" id="pais">
				<option value="-1">Selecciona un pais</code>
				<option value="ES">España</code>
				<option value="FR">Francia</code>
			</select>
		</p>
		<p class="destino">
			<?php echo “Destino: “;
			      include(”destino.php”);
 			?>
		</p>
		<p class=”submit”>
			<input type=”submit” value=”Enviar” />
		</p>
	</form>
</body>
</html>

Como vemos, lo incluimos mediante un include normal, que nos generará el HTML necesario para que veamos un <select />.

Si ahora miramos el código resultante, nos encontramos con esto.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es_ES">
<head>
	<title>Combos dependientes accesibles</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
	<form id="form" method="post" action="<?=$url?>">
		<p class="pais">
		Pais:
			<select name="pais" id="pais">
				<option value="-1">Selecciona un pais</code>
				<option value="ES">España</code>
				<option value="FR">Francia</code>
			</select>
		</p>
		<p class="destino">
			Destino:
			<select id="destino" name="destino">
				<option value="-1">Selecciona una zona</option>
			</select>
		</p>
		<p class="submit">
			<input type="submit" value="Enviar" />
		</p>
	</form>
</body>
</html>

Como podemos ver, se trata de un HTML normal, sin ningún tipo de secreto. Ahora empezemos a ponerle polvos mágicos para que esata rana se convierta en principe.

Abracadabra…

Para hacer mágia, voy a usar jQuery (principalmente por su simplicidad para el ejemplo) y con él veremos lo fácil que es conseguir unos combos disponibles para todos. Primero hemos de volver a replantearnos los ficheros PHP

<?php
	$hayPais = false; // No hay pais por defecto
	if (isset($_POST["pais"])) $hayPais = true; //Si hay país

	// URL de destino
	$url =  ($hayPais)?”receptor.php”:”";
?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”
“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”es_ES”>
<head>
	<title>Combos dependientes accesibles</title>
	<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
</head>
<body>
	<form id=”form” method=”post” action=”<?=$url?>”>
		<p class=”pais”>
		Pais:
			<?php if ($hayPais) : ?>
				<input type=”text” name=”pais” value=”<?=$_POST["pais"]?>” />
			<?php else: ?>
		<select name=”pais” id=”pais”>
			<option value=”-1″>Selecciona un pais</code>
			<option value=”ES”>España</code>
			<option value=”FR”>Francia</code>
		</select>
		<?php endif;?>
		</p>
		<p class=”destino”>
			<?php if ($hayPais) {
				echo “Destino: “;
				include(”destino.php”);
			} else { ?>
				<noscript>
					<input type=”submit” value=”Buscar Destinos” />
				</noscript>
			<?php }	?>
		</p>
		<p class=”submit”>
			<input type=”submit” value=”Enviar” />
		</p>
	</form>
</body>
</html>

Vayamos por partes:

<?php
	$hayPais = false; // No hay pais por defecto
	if (isset($_POST["pais"])) $hayPais = true; //Si hay país
        /*
		Esta versión es más corta, pero menos ilustrativa.
		$hayPais = isset($_POST["pais"]); // ¿Existe $_POST["pais"];
	*/

	// URL de destino
	$url =  ($hayPais)?”receptor.php”:”";
?>

Con la variable $hayPais, arrastramos por todo el script un valor Booleano que nos permite conocer si el parámetro $_POST["pais"] existe. De esta forma, las futuras comprobaciones son más sencillas.

Acto seguido, nos encargamos de informar la variable $url, que contendrá la URL a donde ha de ser redirigido el formulario. Esto es simplemente para conseguir submitar al lugar correcto en cada paso.

<?php if ($hayPais) : ?>
	<input type="text" name="pais" value="<?=$_POST["pais"]?>” />
<?php else: ?>
	<select name=”pais” id=”pais”>
		<option value=”-1″>Selecciona un pais</code>
		<option value=”ES”>España</code>
		<option value=”FR”>Francia</code>
	</select>
<?php endif;?>

Al igual que la comprobación anterior, sabiendo que hemos recibido el parámetro $_POST["pais"], modificamos el <select /> por un elemento <input /> con el valor que hemos pasado previamente. Esto nos servirá para submitar el valor a la página siguiente.

<?php if ($hayPais) {
	echo "Destino: ";
	include("destino.php");
} else { ?>
        <noscript>
	<input type="submit" value="Buscar Destinos" />
	</noscript>
<?php }	?>

Aqui es donde está parte de la gracia del script, y curiosamente se llama <noscript />. Como podemos ver, en caso de haber pasado el parámetro $_POST["pais"], cargaremos el fichero destino.php y este ya se encargará de mostrar los datos relacionados al parámetro enviado. En caso de no enviar este parámetro, insertaremos el tag <noscript /> que contendrá un elemento <input type="submit" /> que se encargará de submitar el formulario con el valor necesario para cargar $_POST["pais"].

Hasta ahora, todo bien. Salvo para los que si tenemos Javascript activo. No nos olvidemos que el tag <noscript /> no será mostrado en caso de disponer de Javascript en nuestro navegador. Para ello, debemos extendernos a la siguiente capa, la del javascript.

Mejorando la experiencia del usuario

Como hemos dicho antes, usaremos jQuery para la capa de cliente. Así, que manos a la obra.

<?php
	$hayPais = false; // No hay pais por defecto
	if (isset($_POST["pais"])) $hayPais = true; //Si hay país

	// URL de destino
	$url =  ($hayPais)?”receptor.php”:”";
?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”
“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”es_ES”>
<head>
	<title>Combos dependientes accesibles</title>
	<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
	<script type=”text/javascript” src=”jquery.js”></script>
	<script type=”text/javascript”>
		$(document).ready(function(){
			// Creamos elemento destino y lo incrustamos en <p class=”destino”>
			$(”p.destino”).append(’Destino: <select id=”destino” name=”destino”><option value=”-1″>Seleciona un destino</option></select>’);

			// Modificamos el action del formulario a la página receptora.
			$(”form#form”).attr(”action”, “receptor.php”);

			// Definimos la petición de ajax, al fichero destino.php
			$(”#pais”).bind(”change”, function() {
			    $.post(”destino.php”, {pais: $(this).val(), type: “xml”}, function(xml){
			        $(”#destino”).empty();
			        $(xml).find(”option”).each(function(x,el) {
			         $(”#destino”).append(’<option value=”‘+$(el).attr(”value”)+’”>’ +$(el).text() + ‘</option>’);
			        });
			    }, “xml”);
			});

		});
	</script>
</head>
<body>
	<form id=”form” method=”post” action=”<?=$url?>”>
		<p class=”pais”>
		Pais:
			<?php if ($hayPais) : ?>
				<input type=”text” name=”pais” value=”<?=$_POST["pais"]?>” />
			<?php else: ?>
		<select name=”pais” id=”pais”>
			<option value=”-1″>Selecciona un pais</code>
			<option value=”ES”>España</code>
			<option value=”FR”>Francia</code>
		</select>
		<?php endif;?>
		</p>
		<p class=”destino”>
			<?php if ($hayPais) {
				echo “Destino: “;
				include(”destino.php”);
			} else { ?>
				<noscript>
					<input type=”submit” value=”Buscar Destinos” />
				</noscript>
			<?php }	?>
		</p>
		<p class=”submit”>
			<input type=”submit” value=”Enviar” />
		</p>
	</form>
</body>
</html>

Destripémoslo un poco para entenderlo mejor.

<script type="text/javascript" src="jquery.js"></script>

Cargamos jQuery para disponer de las ventajas que nos ofrece este framework.

// Creamos elemento destino y lo incrustamos en <p class="destino">
$("p.destino").append('Destino: <select id="destino" name="destino"><option value="-1">Seleciona un destino</option></select>');

Dentro del $(document).ready(... definimos las tareas que ayudarán al usuario. La que vemos arriba se encarga de añadir el <select /> de destinos vacio en el lugar apropiado, pendiente de ser relleneado con la petición ajax.

// Modificamos el action del formulario a la página receptora.
$("form#form").attr("action", "receptor.php");

Modificamos el action del formulario para que la ruta de submit sea la correcta.

// Definimos la petición de ajax, al fichero destino.php
$("#pais").bind("change", function() {
    $.post("destino.php", {pais: $(this).val(), type: “xml”}, function(xml){
      $(”#destino”).empty();
      $(xml).find(”option”).each(function(x,el) {
         $(”#destino”).append(’<option value=”‘+$(el).attr(”value”)+’”>’ +$(el).text() + ‘</option>’);
       });
    }, “xml”);
});

Con este código, lanzamos una petición a nuestro fichero destino.php con los parámetros pais y type, cargamos con los datos que necesitamos para que al detectar un cambio en el elemento <select id="pais" /> este envie la petición indicando que quiero recibir los datos en XML para luego recorrerlo y pintar las option que necesito para rellenar <select id="destino" />

Resultado

El resultado es una página en la que podemos acceder con dos posibles configuraciones, con Javascript o sin él. En caso de entrar con javascript, todo estará preparado para usarlo y hacer que selección de destino sea mediante Ajax y en un solo paso.

En caso de tener el javascript desactivado, tendremos que realizar un paso más para cargar los datos referentes al destino, pero al final enviaremos los mismo datos a la página siguiente.

Podeis probarlo en esta demo que he montado, solo he podido probar el JS en Firefox, así que si alguien me lo puede probar en otros navegadores se lo agradeceré.

Espero vuestras opiniones, y sugerencias.

Añade un Captcha maquero a tus aplicaciones web

20 May

+ 17

Actualmente los captchas son un problema para los usuarios de Internet y aunque cada vez es más normal ver este sistema como control de SPAM de nuestras aplicaciones, cada vez hay más problemas con ellos. Quizas la solución a nuestros problemas la haya traido Apple a nuestras puertas con el iPhone y su sistema de unlock.

slidecaptcha

Alex Boone ha desarrollado Slider, una versión de este sistema en Javascript usando jQuery. La verdad es que está muy conseguido y el resultado es bastante sorprendente, solo nos falta adaptarlos a nuestras aplicaciones web.

Como una aproximación, he montado un pequeño script que nos convertirá todos los elementos <input class=”slider” /> de nuestra aplicación en un Slide. Algo que nos permitirá mejorar la usabilidad de nuestro captcha.

¿Que necesito?

Implementación

Para hacerlo más o menos bien, tendremos que utilizar 3 lenguajes de programación.

1) PHP

En PHP generaremos el secureKey y lo alojaremos en sessión para ser comprobado posteriormente.

<?php
session_start();

function randomText($length) {
    $pattern = "1234567890abcdefghijklmnopqrstuvwxyz";
    for($i=0;$i<$length;$i++) {
      $key .= $pattern{rand(0,35)};
    }
    return $key;
}

$_SESSION["secureKey"] = randomText(6);
?>

2) Javascript

Ahora ya tenemos la secureKey en sessión, hemos de relacionarla con nuestro captcha, para ello usaremos un poco de javascript.

//Javascript
$(document).ready(function(){
	var secureKey = '<?=$_SESSION["secureKey"]?>‘;
	$(’input.slider’).each(function(x,el){
		// Recipiente
		$(el).before(’<div id=”slider_’+$(el).attr(”id”)+’”></div>’);

		//Slider
		new Slider(’slider_’+$(el).attr(”id”),{
			message: $(el).val(),
			color: “green”,
			handler: function(){
				$(el).val(secureKey);
			}
		}).init();

		//Ocultamos el input
		$(el).css(”display”, “none”);
	});
});

Como podemos ver, montamos la secureKey de Javascript a partir de los datos almacenados en $_SESSION, así mostraremos el valor que se ha de contrastar en siguientes pasos.

3) HTML

Para que el Javascript detecte el input que deseamos convertir en Slider, tendremos que declarar el elemento de una forma concreta.

//HTML
<input name="slide_captcha" type="text" class=”slider” value=”BOT” title=”Deslizame para activar” />

Recepción de datos

Al igual que cualquier otro elemento de un formulario, el Slide será tratado en el servidor de la misma forma, salvo que este será comprobado con el valor almacenado previamente en sessión.

<?php
session_start();
if ($_SESSION["secureKey"] != $_POST["slide_captcha"]) {
	die(”Eres un bot”);
} else {
	die(”NO eres un bot”);
}
?>

Aclaración

He cambiado el post, por que el anterior era erroneo y no funcionaba, oldlastman tenía razón y me he visto obligado a reescribirlo. Siento las molestias.

Actualización

Visto la repercusión que está teniendo este sistema de “captcha”, tanto por mail como comentarios, he decidido crear un pequeño plugin para sustituir el botón de submit de nuestros formularios de comentarios. El sistema en sí, es muy simple incluso me planteé 2 veces si hacer un plugin o simplemente explicar como añadir el código, pero por comodidad para todos vosotros, aqui lo teneis :D

SlideSubmit

Este sistema no es apto para sustituir a los captchas actuales (por desgracia), ya que este sistema expone al usuario la secureKey a los bots encargados de llenarme de SPAM. Habrá que buscar alguna otra forma si queremos deshacernos del sistema actual.

Aprende a hacer tabs con CSS y jQuery como si estuvieras en primero

15 May

+ 3

Si estás planteandote hacer un menú basado en Tabs, este manual podrá ayudaros a conseguir uno realmente elegante mediante el uso de CSS y el todopoderoso jQuery. [Demo]

prettyPhoto, el Lightbox de jQuery

15 Abr

+ 2

PrettyPhoto es una versión de lightbox para jQuery bastante bonita que nos permitirá mostrar a los usuarios imagenes de una forma elegante, dinámica y cada vez menos original.[Demo][Descargar]

Kwicks para jQuery

15 Abr

+ 6

Una de las peculiaridades de la página de MooTools es el menú superior, un deslizante muy colorido que hace más alegre la simple tarea de seleccionar una opción, a esto se le llama Kwick (lo he descubierto hoy).

Ahora los que disfrutamos del poder de jQuery tambien podemos disfrutar de una implementación de Kwicks para este gran framework.

Código

//HTML
<ul class=”kwicks”>
<li id=”kwick1″></li>
<li id=”kwick2″></li>
<li id=”kwick3″></li>
<li id=”kwick4″></li>
</ul>
//CSS
/* defaults for all examples */
.kwicks {
list-style: none;
position: relative;
margin: 0;
padding: 0;
}
.kwicks li{
display: block;
float: left;
overflow: hidden;
padding: 0;
cursor: pointer;
}
/* defaults for all examples */
.kwicks li {
width: 125px;
height: 100px;
margin-right: 5px;
}
#kwick1 { background-color: #53b388;}
#kwick1.active { background-color: #86e6bb;}
#kwick2 {background-color: #5a69a9;}
#kwick2.active {background-color: #8d9cdc;}
#kwick3 {background-color: #c26468;}
#kwick3.active {background-color: #f5979b;}
#kwick4 { background-color: #bf7cc7; margin-right: none;}
#kwick4.active {background-color: #efaffa;}
//Javascript
$().ready(function() {
     $(’.kwicks’).kwicks({
               maxWidth: 205,
               spacing:  5
      });
});

Opciones

La simplicidad de uso limita el número de opciones disponibles para la personalización de nuestro Kwick, pero se bastan para conseguir un resultado muy vistoso.

maxWidth: Requerido
Tamaño en px. del máximo de nuestro Kwick
duration: Default: 200
Número de milisegundos de la transición
easing:
Easing function para la animación (Requiere plugin Easing)
spacing: Default:0
Tamaño en px. de separación entre cada kwick
[Descargar][Demo]

Avalancha de Frameworks ¿Con cual nos quedamos?

10 Abr

+ 12

Cuando trabajamos con Javascript nos encontramos que por culpa de las diferencias entre los diferentes navegadores, tenemos que condicionar nuestro código dependiendo de estas diferencias. Para ello, y por la comodidad y claridad que aportan al código, los frameworks javascript llegan, y en masa, para hacer felices y fáciles las horas que dedicamos a este lenguaje.

Personalmente siempre que puedo, los evito. Por lo menos para hacerlo yo, aunque sea solo una vez, pero la comodidad de uso y la seguridad de que va a funcionar en la mayoría de casos, engancha.

Por eso, si estamos pensando en usar uno de ellos para nuestras aplicaciones, debemos conocer las posibles alternativas de las que podemos hacer uso.

1. Prototype (http://www.prototypejs.org/)

Pese a ser la más usada, es la que menos conozco de las más conocidas. Famosa por su peso y la integración con script.aculo.us. Muchisima documentación.

Ejemplo

//Nuevo elemento
var a = new Element(’a', { ‘class’: ‘foo’, href: ‘/foo.html’ }).update(”Next page”);
//Ajax
new Ajax.Request(’/some_url’,
{
method:’get’,
onSuccess: function(transport){
var response = transport.responseText || “no response text”;
alert(”Success! \n\n” + response);
},
onFailure: function(){ alert(’Something went wrong…’) }
});

Documentación / Descargar

2. MooTools (http://mootools.net/)

El primer framework que me enamoró, sin duda llegué atraido por la vistosidad de Moo.fx. Destinada principalmente para complementar el diseño de las aplicaciones web, con una gran cantidad de efectos. Todo ello sin descuidar las funcionalidades del día a día. Importante tener en cuenta la nueva versión 1.2 que será completamente diferente.

Ejemplos

// Crear un elemento
new Element(’a', {
’styles’: {
‘display’: ‘block’,
‘border’: ‘1px solid black’
},
‘events’: {
‘click’: function(){
//aaa
},
‘mousedown’: function(){
//aaa
}
},
‘class’: ‘myClassSuperClass’,
‘href’: ‘http://mad4milk.net’
});
//Ajax
var myAjax = new Ajax(url, {method: ‘get});
myAjax.request();

Documentación / Descargar

3. jQuery (http://jquery.com/)

Mi nuevo amor, hace cosa de un mes, que en los ratos libres voy migrando heySilver a jQuery. Intentando aprender los grandes y mejorando el código semana a semana. Sin lugar a dudas he descubierto que pese a no disponer de muchos efectos ni transiciones, dispone de todo lo necesario para hacer lo más fácil posible el trabajo diario.  La posibilidad de usar xPath y Selectores CSS para encontrar elementos de nuestro HTML es simplemente una maravilla.

// Nuevo elemento
$(”#elemento span”).append(’<p class=”clase”><a href=”…”>Enlace</a></p>’);
// Ajax
$.ajax({
type: “POST”,
url: “some.php”,
data: “name=John&location=Boston”,
success: function(msg){
alert( “Data Saved: ” + msg );
}
});

Documentación / Descargar

4. MochiKit (http://www.mochikit.com/)

Nunca he tenido la oportunidad de meterle mano, quizas ha sido por falta de tiempo, quizas por falta de interes o quizas la poca claridad del código, pero si revisamos la documentación nos damos cuenta de que no es un framework que podamos desechar sin por lo menos dedicarle un par de semanas.

//Nuevo elemento
P({”class” : “clase”});
//Ajax
var url = “/src/b/bo/bob/MochiKit.Async/META.json”;
var d = loadJSONDoc(url);
var gotMetadata = function (meta) {
if (MochiKit.Async.VERSION == meta.version) {
alert(”You have the newest MochiKit.Async!”);
} else {
alert(”MochiKit.Async ”
+ meta.version
+ ” is available, upgrade!”);
}
};
var metadataFetchFailed = function (err) {
alert(”The metadata for MochiKit.Async could not be fetched :(”);
};
d.addCallbacks(gotMetadata, metadataFetchFailed);

Documentación / Descargar

5. Script.aculo.us (http://script.aculo.us/)

Aunque técnicamente es un complemento de prototype, ya que sin él no funciona, es posiblemente más famoso que el propio Prototype. Con él todos los efectos, transiciones y transformaciones son mas fáciles desde que script. aculo.us apareció.

//Nuevo elemento
element = Builder.node(’p',{className:’error’},’An error has occurred’);
// Ajax
new Ajax.Request(’/foo/bar’, {method:’post’, postBody:escape(’thisvar=true&thatvar=Howdy’)});

6. Rialto (http://rialto.improve-technologies.com/wiki/)

Otra gran desconocida de este mundillo de líneas de código, pese a no estar compuesta de una gran cantidad de funcionalidades diarias, está cargado de widgets de fácil instalación que merece la pena ver.


//Nuevo Elemento (Combo)
var comb = new rialto.widget.Combo([["value1","text1"],["value2","text2"],["value3","text3"]],”MyComb”,5,10,100,CADRE2,{position:”absolute”,heightItem:25,suggest:false,enable:true});
//Ajax
var remote=new rialto.io.AjaxRequest({
url:’rialtoModel.xml’,
method: ‘get’,
callBackObjectOnSuccess:this,
withWaitWindow:false,
onSuccess: this.parseXmlForListValue
}) ;

Documentación / Descargar

7. Dojo (http://dojotoolkit.org/)

Documentación / Descargar

8. Spry Framework (http://labs.adobe.com/technologies/spry/)

Documentación / Descargar

9. ASP.NET Ajax Framework (http://asp.net/ajax/)

Documentación / Descargar

10. Clean Ajax (http://sourceforge.net/projects/clean-ajax/)

Documentación / Descargar

11. YUI (http://developer.yahoo.com/yui/)

Documentación / Descargar

12. Ext (http://extjs.com/)

Documentación / Descargar

13. Base2 (http://code.google.com/p/base2/)

Documentación / Descargar

14. DOMAssistant (http://domassistant.com/)

Documentación / Descargar

Muchos, pero muchos más.

markItUp!, mejora visualmente el contenido de tus textarea

24 Mar

+ 1

markItUp! es un wysiwyg destinado a facilitar el trabajo en la edición de código online. Para ello ayuda a mostrar de una forma más clara el código ubicado dentro de nuestro textarea. Gracias a su gran personalización se convierte en un interesante sistema a tener en cuenta para futuras implementaciones de wp-editarea.[Demo][Descargar]