Valor por defecto en un campo con jQuery

0 - , - 20/12/2011 19:46:53

El siguiente snippet nos permite añadir un valor por defecto a un campo de texto y que cuando el usuario se disponga a introducir datos en él, este valor desaparezca. Esta técnica se suele utilizar para dar indicaciones sobre como rellenar el campo dentro del propio campo.

$("#caja").focus(function() {
           if( this.value == this.defaultValue ) {
           this.value = "";
           }
           }).blur(function() {
           if( !this.value.length ) {
           this.value = this.defaultValue;
           }
       });

Un ejemplo podría ser:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Menu Salto jQuery</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$(".caja").focus(function() {
           if( this.value == this.defaultValue ) {
           this.value = "";
           }
           }).blur(function() {
           if( !this.value.length ) {
           this.value = this.defaultValue;
           }
       });
});	
</script>
<style type="text/css">
.caja{
	padding:5px;
	font-size:11px;
	color:#666;
	background:#E8E8E8;
	border:1px solid #CCC;	
}
</style>
</head>
<body>
<p><label> Ejemplo 1:</label><input name="caja" class="caja" width="60" maxlength="200" value="valor por defecto" /></p>
<p><label> Usuario:</label><input name="caja" class="caja" width="60" maxlength="200" value="Al menos 5 caracteres" /></p>
</body>
</html>

Ver ejemplo en funcionamiento » »

Captcha con protección de colores (y 2)

0 - , , - 01/03/2011 17:00:06

A petición de algunos lectores, voy a publicar un pequeño ejemplo sobre la aplicación de mi anterior post "Captcha con protección de colores". Tanto el citado post como éste, son ejemplos. Deben ser tomados como puntos de partida y presuponen ciertos conocimientos de programación que se escapan del propósito de ambos posts. Dicho esto, veamos un ejemplo más completo. Necesitamos dos ficheros. El primero es el capcha, la imagen que el usuario deberá reconocer. Podemos nombrar el fichero como captha.php y el código sería el siguiente:

captha.php

<?php
session_start();
header("Content-type: image/png");
$anchura = 146;
$altura = 30;

$im = @imagecreate($anchura, $altura)or die("Cannot Initialize new GD image stream");
imagecolorallocate($im, 255, 250, 255);
$noise_color = imagecolorallocate($im, 207, 239, 250);
for($i=0; $i<($anchura*$altura)/3; $i++) {
	imagefilledellipse($im, mt_rand(0,$anchura), mt_rand(0,$altura), 1, 1, $noise_color);
}
for($i=0; $i<($anchura*$altura)/150; $i++ ) {
 imageline($im, mt_rand(0,$anchura), mt_rand(0,$altura), mt_rand(0,$anchura), mt_rand(0,$altura), $noise_color);
}

$texto_color[0] = imagecolorallocate($im, 255, 0, 0);
$texto_color[1] = imagecolorallocate($im, 51, 166, 207);

$caracteres = 'ABCDEFGHKLMNPRSTUVWYZ23456789';
$longitud = 5;
  function generarCodigo($longitud,$caracteres) {
    $code = '';
    for($i = 1, $cslen = strlen($caracteres); $i <= $longitud; ++$i) {
      $code .= strtoupper( $caracteres{rand(0, $cslen - 1)} );
    }
    return $code;
}
$texto = generarCodigo($longitud,$caracteres);

unset($_SESSION['captcha']);
$_SESSION['captcha']['blue'] = $_SESSION['captcha']['red'] = '';

for($j = 0; $j < mb_strlen($texto); $j++) {
	imagettftext($im, 20, 0, 5+($j*23), 24, $texto_color[$j%2], 'Includes/elephant.ttf', $texto[$j]);
	if(($j%2) == 1) {
		$_SESSION['captcha']['blue'] .= $texto[$j];
	}
	else {
		$_SESSION['captcha']['red'] .= $texto[$j];
	}
}
imagepng($im);
imagedestroy($im);
?>

Ahora necesitamos crear otro fichero (formulario.php) que se encargará de procesar los campos del formulario y comprobar que el captcha ha sido introducido correctamente.

formulario.php

<?php
session_start();
if($_POST['enviar']=="ok") {
	// LIMPIAMOS LO RECOGIDO EN EL FORMULARIO
	$captcha_recogido = filter_var($_POST['valores_captcha'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
	// CONVERTIMOS EN MAYUSCULAS
	$captcha_recogido = strtoupper($captcha_recogido);
	if(empty($captcha_recogido)) {
		echo "<strong>Debes introducir los caracteres en rojo que aparecen en la imagen.</strong>";
	}else{
		if($captcha_recogido==$_SESSION['captcha']['red']) {
			// HA INTRODUCIDO CORRECTAMENTE EL CAPTCHA Y
			// CONTINUAMOS PROCESANDO EL FORMULARIO
			echo "<strong>El formulario ha sido procesado.</strong>";
		}else{
			echo "<strong>Los caracteres introducidos no coinciden con los de la imagen. Inténtalo otra vez.</strong>";
		}
	}
}
?>
<form action="#" method="post" name="form_captha">
<!-- CAMPOS DEL FORMULARIO -->
<p><img src="01032011_captcha.php" alt="captcha" /></p>
<p><label>Teclea los caracteres en rojo</label><input type="text" name="valores_captcha" /></p>
<input name="enviar" type="submit" value="ok" />
<label>
</form>

Ver ejemplo en funcionamiento » »

WordPress: Listar páginas

0 - , - 12/02/2011 09:16:28

Si quieres listar todas las páginas disponibles en WordPress (ten en cuenta que páginas y entradas o "posts" tienen un significado diferente en WordPress) existe una función denominada wp_list_pages que lo permite de un modo muy sencillo. Cuando se utiliza sin parámetros, listará todas las páginas en orden alfabético.

<?php wp_list_pages();?>

Para listar páginas de modo específico se puede hacer pasando un parámetro a la función, haciendo referencia a los Id de las páginas a incluir. En el ejemplo siguiente se mostrarán sólo dos páginas (las páginas que tienen Ids 4 y 5).

<?php wp_list_pages('include=4,5');?>

También se pueden excluir determinadas páginas utilizando un parámetro de exclusión:

<?php wp_list_pages('exclude=4,5');?>

Como se ha mencionado anteriormente, el valor predeterminado de wp_list_pages para la ordenación es alfabético. Sin embargo, puede cambiar el orden de la lista mediante el parámetro sort_column. El parámetro sort_column puede tener los siguientes valores:

- post_content: ordena alfabéticamente (valor predeterminado)
- menu_order: ordena por el orden de las páginas
- post_date: ordena por fecha de creación
- post_modified: ordena por la fecha/hora de la última modificación
- ID: ordena por ID de página
- post_author: ordena por el ID del autor de la página
- post_name: ordena alfabéticamente por el slug

El siguiente código permite ordenar por fecha de creación en lugar de por orden alfabético, que es el predeterminado:

<?php wp_list_pages('sort_column=post_date'); ?>

Las páginas pueden tener subpáginas, y estas subpáginas pueden tener subpáginas. ¿Qué pasa si sólo deseas enumerar páginas de nivel superior y excluir sus subpáginas? Controlar la profundidad funciona muy bien cuando se utiliza para generar menús desplegables con submenús.

Se puede utilizar el parámetro profundidad así:

<?php wp_list_pages('depth=1'); ?>

jQuery: Cómo obtener las coordenadas del puntero del ratón

0 - , , - 11/02/2011 20:00:47

El siguiente código nos muestra la posición X e Y del puntero del ratón respecto a la página web.

<html>
<head>
<title>jQuery Cursor</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
	$(document).mousemove(function(e){
			$('#posicion_cursor').html("Pos x : " + e.pageX + " | Pos y : " + e.pageY);
	});
});
</script>
</head>
<body>
<div id="posicion_cursor"></div>
</body>
</html>

Ver ejemplo en funcionamiento » »

HTML5 Geolocalización

0 - , - 17/11/2010 13:48:02

HTML5 trae consigo muchas novedades y una de ellas es la integración con una nueva API de geolocalización. Dicha API no forma parte de forma estricta de HTML5, sino que está siendo normalizado por el Geolocation Working Group, que es independiente del HTML5 Working Group. El soporte para la API de geolocalización está disponible, de momento, para los navegadores más actuales como Firefox 3.5+ o Chrome 5+.

Un modo sencillo de acceso al API de geolocalización sería:

<!DOCTYPE HTML>
<html>
<head>
<title></title>
</head>
<body>
<script language="javascript">
function obtener_localizacion() {
  navigator.geolocation.getCurrentPosition(coordenadas);
}
function coordenadas(position) {
  var latitud = position.coords.latitude;
  var longitud = position.coords.longitude;
  alert('Tus coordenadas son: ('+latitud+','+longitud+')');
}
</script>
<a href="javascript:obtener_localizacion();">Mostrar Posición</a>
</body>
</html> 

Ver ejemplo en funcionamiento » »

Con el anterior ejemplo, si el navegador soporta el acceso a la API, el usuario da su consentimiento y... no hay ningún problema se obtiene la geolocalización del usuario al hacer click sobre el enlace "Mostrar Posición".

Puesto que el éxito de la geolocalización depende de varios factores, lo mejor es gestionar los posibles errores que se puedan producir. Podemos añadir un segundo argumento a la función obtener_localizacion: una función para gestionar los errores. Los errores que se pueden obtener son:

Permiso denegado (1), cuando el usuario no comparte la posición y por tanto deniga el acceso a su localización.
Posición no disponible (2), si se ha perdido la conexión o no se puede contactar con los satélites que realizan el posicionamiento.
Timeout (3), si se ha tardado demasiado en calcular la posición del usuario.
Error desconocido (0), si ha fallado cualquier otra cosa.

<!DOCTYPE HTML>
<html>
<head>
<title></title>
</head>
<body>
<script language="javascript">
function obtener_localizacion() {
  navigator.geolocation.getCurrentPosition(coordenadas,gestiona_errores);
}
function coordenadas(position) {
  var latitud = position.coords.latitude;
  var longitud = position.coords.longitude;
  alert('Tus coordenadas son: ('+latitud+','+longitud+')');
}
function gestiona_errores(err) {
  if (err.code == 0) {
    alert("error desconocido");
  }
  if (err.code == 1) {
    alert("El usuario no ha compartido su posicion");
  }
  if (err.code == 2) {
    alert("no se puede obtener la posicion actual");
  }
  if (err.code == 3) {
    alert("timeout recibiendo la posicion");
  }
}

</script>
<a href="javascript:obtener_localizacion();">Mostrar Posición</a>
</body>
</html> 

Ver ejemplo en funcionamiento » »

Con el ejemplo anterior controlamos los errores durante el proceso de geolocalización pero no controlamos si el navegador soporta o no este servicio. Para hacer este último control podemos comprobar si existe el objeto navigator.geolocation.

<!DOCTYPE HTML>
<html>
<head>
<title></title>
</head>
<body>
<script language="javascript">
function obtener_localizacion() {
  if (navigator.geolocation) {
  		navigator.geolocation.getCurrentPosition(coordenadas,gestiona_errores);
  }else{
	alert('Tu navegador no soporta la API de geolocalizacion');  
  }
}
function coordenadas(position) {
  var latitud = position.coords.latitude;
  var longitud = position.coords.longitude;
  alert('Tus coordenadas son: ('+latitud+','+longitud+')');
}
function gestiona_errores(err) {
  if (err.code == 0) {
    alert("error desconocido");
  }
  if (err.code == 1) {
    alert("El usuario no ha compartido su posicion");
  }
  if (err.code == 2) {
    alert("no se puede obtener la posicion actual");
  }
  if (err.code == 3) {
    alert("timeout recibiendo la posicion");
  }
}

</script>
<a href="javascript:obtener_localizacion();">Mostrar Posición</a>
</body>
</html> 

Ver ejemplo en funcionamiento » »

Una vez hemos obtenido las coordenadas mediante la API es bastante sencillo integrar Google Maps para mostrar un mapa con la posición del visitante. El siguiente ejemplo utiliza jQuery para crear un mapa una vez obtenida la posición mediante la API de geolocalización.

<!DOCTYPE HTML>
<html>
<head>
<title></title>
</head>
<body>
<script language="javascript">
function obtener_localizacion() {
  if (navigator.geolocation) {
  		navigator.geolocation.getCurrentPosition(coordenadas,gestiona_errores);
  }else{
	alert('Tu navegador no soporta la API de geolocalizacion');  
  }
}
function coordenadas(position) {
  var latitud = position.coords.latitude;
  var longitud = position.coords.longitude;
  alert('Tus coordenadas son: ('+latitud+','+longitud+')');
}
function gestiona_errores(err) {
  if (err.code == 0) {
    alert("error desconocido");
  }
  if (err.code == 1) {
    alert("El usuario no ha compartido su posicion");
  }
  if (err.code == 2) {
    alert("no se puede obtener la posicion actual");
  }
  if (err.code == 3) {
    alert("timeout recibiendo la posicion");
  }
}

</script>
<a href="javascript:obtener_localizacion();">Mostrar Posición</a>
</body>
</html> 

Ver ejemplo en funcionamiento » »