Accediendo al DOM con jQuery: 10+ útiles snippets

0 - , , , , - 12/05/2012 20:12:42

Este post es una traducción libre del post Manipulating the DOM with jQuery: 10+ useful code snippets, publicado en catswhocode.

Añadir una clase CSS a un elemento
Una forma muy sencilla de cambiar el aspecto y funcionalidad de un elemento es añadirle un clase CSS.

('#mielemento').addClass('miclase');

Eliminar una clase CSS de un elemento
Al igual que es útil conocer como añadir clases CSS, también es interesante conocer como eliminar clases CSS no deseadas.

$('#mielemento').removeClass('miclase');

Comprobar si un elemento posee una clase CSS
Si en tu aplicación o sitio web se añaden y eliminan clases para un elemento en particular, puede ser muy útil ser capaces de comprobar si un elemento contiene cierta clase.

$('#mielemento').hasClass'miclase');

Cambiar de CSS usando jQuery
Tal y como hemos visto en los ejemplos anteriores, añadir o eliminar clases CSS a un elemento es muy sencillo utilizando jQuery. Pero, qué ocurre si lo que queremos es eliminar completamente una hoja de estilos y adjuntar una nueva. Es muy fácil, tal y como se muestra en el siguiente ejemplo:

$('link[media='screen']').attr('href', 'css_alternativo.css');

Anexar HTML a un elemento
Cuando necesitamos anexar html a un elemento, podemos utilizar el método append():

$('#mielemento').append('texto que será añadido');

Comprobar si un elemento existe
Cuando trabajamos con Javascript, a menudo necesitamos comprobar si un elemento existe o no. Usando jQuery y la propiedad length es muy sencillo hacerlo: si length == 0, no existen elementos usados en la página.

if ($('img').length) {
		alert('Se han encuntrado elementos img en la página');
} else {
		alert('No se han encontrado elementos img');
}

Obtener el padre de un elemento
Cuando trabajamos con el DOM, podemos necesitar conocer qué elemento es el padre directo de otro elemento. El método closest() nos permite averiguarlo.

var id = $("button").closest("div").attr("id");

Obtener los hermanos de un elemento
El método sibings() es una herramienta muy útil para obtener los hermanos de un elemento:

$('mielemento').siblings()

Eliminar una opción de una lista desplegable
Cuando trabajamos con listas desplegables puede ser útil actualizar su contenido de acuerdo a las acciones del usuario. Para eliminar una opción de un select, podemos utilizar el siguiente truco:

$("#selectList option[value='2']").remove();

Obtener la opción seleccionada como texto
Útil cuando deseamos conocer que es lo que un usuario ha seleccionado de un lista desplegable.

$('#selectList :selected').text();

Aplicar un efecto “cebra” a las tablas
Cuando usamos tablas, es una buena idea, para mejorar la legibilidad, aplicar un estilo "cebra" a las filas.

$("tr:odd").addClass("odd");

Contar los hijos de un elemento
Si queremos contar cuantos elementos div son hijos de #foo, la siguiente línea nos permitirá saberlo.

$("#foo > div").length

Efecto hover sobre imágenes con HTML5

2 - , , - 11/05/2012 19:22:51

Esta técnica, gracias a HTML5 y jQuery, nos permite crear un efecto de "hover" sobre imágenes, mostrándolas en escala de grises. Para lograr este efecto antes de HTML5, se necesitaban dos imágenes: una en color y otra versión en escala de grises. Ahora HTML5 lo permite de un modo más sencillo y rápido porque se genera la imagen en escala de grises a partir de la imagen original. Para terminar de comprender el efecto, lo mejor es ver el resultado final:

Ver ejemplo en funcionamiento » »

El siguiente código actuaría en todas las imágenes contenidas dentro de un elemento cuya clase sea "item".

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>  
<script type="text/javascript">
	$(window).load(function(){
		$(".item img").fadeIn(500);

		$('.item img').each(function(){
			var el = $(this);
			el.css({"position":"absolute"}).wrap("<div class='img_wrapper' style='display: inline-block'>").clone().addClass('img_grayscale').css({"position":"absolute","z-index":"998","opacity":"1"}).insertBefore(el)

.queue(function(){
				var el = $(this);
				el.parent().css({"width":this.width,"height":this.height});
				el.dequeue();
			});
			this.src = grayscale(this.src);
		});
		
		$('.item img').mouseover(function(){
			$(this).stop().animate({opacity:0}, 500);
		})
		$('.img_grayscale').mouseout(function(){
			$(this).parent().find('img:first').stop().animate({opacity:1}, 500);
			
		});		
	});
	
	function grayscale(src){
		var canvas = document.createElement('canvas');
		var ctx = canvas.getContext('2d');
		var imgObj = new Image();
		imgObj.src = src;
		canvas.width = imgObj.width;
		canvas.height = imgObj.height; 
		ctx.drawImage(imgObj, 0, 0); 
		var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
		for(var y = 0; y < imgPixels.height; y++){
			for(var x = 0; x < imgPixels.width; x++){
				var i = (y * 4) * imgPixels.width + x * 4;
				var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
				imgPixels.data[i] = avg; 
				imgPixels.data[i + 1] = avg; 
				imgPixels.data[i + 2] = avg;
			}
		}
		ctx.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
		return canvas.toDataURL();
    }
</script>

El código es una variación del visto en web designer wall. En este ejemplo la imagen pasa a escala de grises en el efecto "hover" y no al revés como ocurre en el ejemplo de web designer wall.

Visto en web designer wall » »

jQuery Map Marker

0 - , , - 07/05/2012 10:32:30

jQuery Map Marker es un plugin que facilita poner varios marcadores en un mapa utilizando Google Mapd API V3. Utiliza JSON para las ubicaciones que deben ser suministradas mediante coordenadas de latitud y longitud. Los pasos para su uso son los siguientes:

Incluir los ficheros javascript necesarios:

<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="js/mapmarker.jquery.js"></script>

Crear un conteneder para tu mapa y asignarle un identificador:

<div id="map" style="width: 550px; height: 450px; border:2px solid red;"></div>

Aplicar el plugin al elemento usando un código similar al siguiente:

<script type="text/javascript">
	$(document).ready(function(){
		//set up markers 
		var myMarkers = {"markers": [
				{"latitude": "31.42866311735861", "longitude":"-98.61328125", "icon": "img/house.png", "baloon_text": "This is <strong>Texas</strong>"},
				{"latitude": "35.101934057246055", "longitude":"-96.6796875", "icon": "img/castle.png", "baloon_text": "This is <strong>Oklahoma</strong>"},
				{"latitude": "38.61687046392973", "longitude":"-98.876953125", "icon": "img/house.png", "baloon_text": "This is <strong>Kansas</strong>"}
			]
		};
		//set up map options
		$("#map").mapmarker({
			zoom	: 5,
			center	: 'United States',
			markers	: myMarkers
		});

	});
</script>

jQuery Map Marker » »

jQuery: numerar una lista

0 - , - 11/02/2012 19:32:20

Supongamos que tenemos la siguiente lista:

<ul>
    <li>manzanas</li>
    <li>fresas</li>
    <li>peras</li>
</ul>
<ul>
    <li>tomates</li>
    <li>zanahorias</li>
</ul>

para numerarla mediante Jquery podemos utilizar la función prepend:

$(document).ready(function() {
        $('ul > li').each(function () {
            $(this).prepend("(" + 
                ($(this).index() + 1) + ") ");
        });
});

Ver ejemplo en funcionamiento » »

jQuery: Mostrar el último Tweet con JSON

1 - , , - 05/02/2012 19:43:02

El siguiente snippet permite extraer el último tweet mediante jQuery y JSON.

$.getJSON("http://twitter.com/statuses/user_timeline/username.json?callback=?", function(data) {
     $("#twitter").html(data[0].text);
});

Donde username es el nombre de usuario del que deseamos extraer el último tweet. Por ejemplo:

<!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>jquery tweet</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
<script src="js/modernizr.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$.getJSON("http://twitter.com/statuses/user_timeline/webintenta.json?callback=?", function(data) {
     $("#twitter").html(data[0].text);
});
});	
</script>
<style type="text/css">
#twitter{
	padding:5px;
    font-family: Arial, Helvetica, Sans-serif;
	font-size:13px;
	color:#666;
	background:#E8E8E8;
	border:1px solid #CCC;
    width:300px;
    margin:0 auto;
}
</style>
</head>
<body>
<div id="twitter"></div>
</body>
</html>

Ver ejemplo en funcionamiento » »

Visto en CSS Tricks » »