jQuery
jQuery.slideToggleMinHeight()
He actualizado el plugin para hacerlo un poco mas flexible.
Los ejemplos y documentacion de uso estan en:
Este es un tip rápido pero útil.
Escenario:
Tenes un div con el id “elDiv” con el siguiente CSS:
#elDiv {
border: 1px solid #336699;
float: right;
padding: 20px;
width: 500px;
}
Y en Firefox/Chrome/Safari/Opera al hacer $(“#elDiv”).height(); te entrega 400px por decir algo (el tamaño depende de lo que tenga dentro).
Pero curiosamente en Internet explorer te da un tamaño raro… de menos, unos 358px en nuestro ejemplo.
¿Qué pasa?
Pasa que no le especificaste un modo de renderizado al HTML por medio del DOCTYPE, y por culpa de ello Internet explorer va a renderizar el contenido en modo “Quirks Mode” http://es.wikipedia.org/wiki/Quirks_Mode.
Si no queres leer el articulo de Wikipedia te comento que lo único que tenes que hacer es poner lo siguiente por encima del tag <html>:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/DTD/strict.dtd">
PD: el valor de 358px en mi ejemplo viene de que en modo quirks, IE toma el tamaño del tamaño real menos el padding y el borde: 400 – 40 – 2 = 358.
Curiosidades y cosas útiles de jQuery
En addyosmani.com encontré 31 snippets para jQuery de los cuales algunos me parecen especialmente útiles:
Método .live():
Según comentan en el blog (y tiene razón) es mas útil que usar directamente el método .click(). ¿por que?, fácil, porque el método .live() es capaz de mantenerse a la escucha de cualquier elemento que machee con el selector aun si el elemento ha sido creado después de haberlos enlazado.
Un ejemplo:
$('.clickme').click(function() {
alert("Hola, me hiciste click");
});
El código anterior va a funcionar sobre todos los elementos que actualmente existan en el DOM, pero nos podemos ir olvidando que lo haga sobre cualquier contenido que se cree después de ese momento.
$('.clickme').live('click', function() {
alert(“¿ves? Me sigo ejecutando sobre cualquier elemento”);
});
Aquí la diferencia: Si yo después de haber ejecutado el anterior código, hiciera:
$(“body”).append(“<a href=”#” class=”clickme” >Soy nuevo</a>);
El nuevo elemento SI ejecutaría el código.
Agrupado de funciones:
Otra de las gracias que tiene jQuery es que permite apilar funciones:
jQuery('#foo').bind({
click: function() {
alert(“Me haces click”);
},
mouseover: function() {
alert(“Me pasas por encima”);
},
mouseout: function() {
alert(“No estás mas encima de mi”);
}
});
Se explica solo, pero por si quedan dudas lo que hicimos acá fue ahorrar código usando un único selector. Al elemento seleccionado le hemos pegado tres eventos junto a las funciones correspondientes. Geeeenial.
Método .sleep()
Siempre me hiso falta una manera de retardar algunas acciones, y de momento había estado usando query.timer.js (un plugin). Pero los tiempos cambian, y desde la versión 1,4 de jQuery ya viene esta característica incorporada.
Ejemplo:
$('#caja').slideUp(300).delay(1000).slideDown(400);
Traducción: #caja va a plegarse en 300 mili segundos, no va a hacer mas que esperar un segundo (1000 mili segundos) y va a desplegarse a lo largo de 400 mili segundos
Método .data()
Si necesitas almacenar información (temporalmente) podes usar variables.. Pero si lo que querés es “pegar” información a elementos del DOM lo que necesitas es esto.
Ejemplo:
$("div").data("nombre", 'Marcelo');
alert($("div").data("nombre") === 'Marcelo'); //imprime true
¿Para que sirve?. Está mas que claro. Si tuvieras una tabla, y a los <tr /> les quisieras establecer un id asociado…. ¿vas viendo la idea?
Shortcut para el metodología .find()
Si tenes que ir seleccionado elementos que están dentro de un elemento por lo general usamos el método .find(). Bueno resulta que podemos usar el método de una forma mas abreviada y clara:
$(“a”).find(“b”); //podemos expresarlo como: $(“a”, “b”);
Seleccionar elementos cuyo id contiene caracteres especiales:
si tratamos seleccionar un div que tenga en su id un par de corchetes como en el siguiente caso:
$("$item_[200]");
No va a funcionar. Pero podemos seleccionar este elemento de la siguiente forma:
$("$item_\\[200\\]");
Altos iguales entre DIVs con jQuery
Visto en la documentación oficial:
Creamos el metodo:
$.fn.equalizeHeights = function() {
return this.height(Math.max.apply(this, $(this).map(function(i, e) {
return $(e).height()
}).get()))
}
Para hacer uso de el sobre las columnas que deseamos equiparar:
$('.columnas').equalizeHeights();
No funciona jQuery change() en Internet Explorer
La situación: Probaste en Firefox el método change de jQuery sobre un checkbox, pero cuando lo probas en IE falla, no hace caso.
Esto se debe al pésimo soporte que ofrece Internet Explorer con javascript, pero esta nota no es para hablar mal de IE, para eso ya habrá un post entero y de varias paginas
La solución mas acertada es mantener el método change para todo navegador que no sea IE, y usar click para IE. Lo hacemos así porque si aplicamos click sobre un checkbox en un navegador serio, este no lanza nada porque para el no es un click, es un change.
$(document).ready(function() {
var che = $(".mi_checkbox");
if ($.browser.msie) {
che.click(function() {
alert("funciono ok");
});
} else {
che.change(function() {
alert("funciono ok");
});
}
});