setInterval error en Chrome y Firefox

Hace unos días encontré un error en una animación que hice en jQuery, que hace uso de setInterval.  SetInterval existe para ejecutar una función cada determinada cantidad de tiempo. Supongamos que estoy en un sitio que hace uso de esta función, pero después voy a otro tab del browser, y me quedo navegando allí durante unos minutos, eso quiere decir que en otro tab (que no estoy viendo…) se debería estar ejecutando una función.

Firefox y Chrome evitan que las funciones con setInterval se ejecuten si uno está viendo otro tab. Tiene sentido, intentan ahorrar memoria para ponerla, justamente, donde el usuario esté mirando. El único problema es que en vez de hacer un «pause», lo que hacen es ir guardando todas las veces que se deberían ejecutar. Lo que provoca que cuando finalmente volvemos a hacer foco, se ejecutan una detrás de la otra!

La solución es increiblemente fácil cuando las funciones con setInterval involucran animaciones, como en mi caso.

Primero les muestro el código sin la corrección:

function magic(elemento){
	$(elemento).animate({
		left: '-=1',
		bottom: '+=2'
	}, 70, function() {
		// Animation complete.
		$(this).animate({
		left: '+=3'
		}, 70, function(){
			$(this).animate({
				left:'-=2',
				bottom:'-=2'
			}, 70)
		});
	});
}

Este código lo que hace es mover un div hacia la izquierda y abajo, y luego hacia la posición original, provocando un ligero temblor. Para ejecutarlo, uso por ejemplo:

setInterval("magic('.banner')",5000);

Lo que hace que cada 5 segundos, el div banner tiemble. Al perder el foco y luego volver al tab, la ejecuciòn en cadena hacia que el banner se fuera no 1, sino por ejemplo 200 pixeles hacia la izquierda (y hacia abajo…). Quedaba horrible por el hecho de quedar en cola de ejecución la función de temblor.

La solución es borrar lo que haya en memoria:

function magic(elemento){
	$(elemento).stop(true,true).animate({
		left: '-=1',
		bottom: '+=2'
	}, 70, function() {
		// Animation complete.
		$(this).animate({
		left: '+=3'
		}, 70, function(){
			$(this).animate({
				left:'-=2',
				bottom:'-=2'
			}, 70)
		});
	});
}

Así de simple…

Explorer atrasa

En mi vuelta al desarrollo web en relación de dependencia, me he vuelto a encontrar con un viejo conocido por todos aquellos que se dedican al diseño/programación/maquetación web: Internet Explorer 6.

Habiendo ya betas del IE9 dando vueltas, y estando en el mercado el IE7 e IE8 desde hace tanto tiempo ya, no tengo manera de imaginarme el tipo de usuario que elige al IE6 para navegar diariamente.

Justamente hoy, me entero de ie6countdown.com, una iniciativa que parte desde el mismísimo Microsoft.

Quienes me conocen saben la cantidad de luchas que le he ganado al IE6, como así también saben que ya no quiero hacer más nada compatible con este navegador.

Para todos aquellos que como yo aún deben «solucionar problemas» del IE6, les dejo un listado de herramientas que les pueden ser útiles:

  • Explorer 6: para testear, necesitamos el navegador. Antes solía usar Multiple-IE, pero hoy en día utilizo IETester, sobretodo por si lo que hay que testear es un formulario (los formularios en Multiple-IE no funcionan).
  • ie7.js Project: con este javascript convertimos al explorer 6 en casi casi un navegador en el que se puede maquetar un sitio web.
  • Companion JS: para cualquier versión de explorer, este javascript te permite tener un Firebug en el explorer, y hacer debug de javascript.

Hay miles de cosas más para testear y usar, acá les dejo un compilado más completo que el mío.

Guía de maquetación HTML para e-mails marketing

En el tiempo en que llevo trabajando en Interactive, aprendí que algo a lo que hay que prestarle un poco más de atención en la etapa de test es a los e-mail. Debido a la ausencia de estándares, y que corporativamente se utilizan clientes de email como Lotus u Outlook, pero el público en general utiliza webmails, uno se ve obligado a reducir las piezas html a una serie de reglas para performar correctamente en todos los medios.

Como no suelo encontrar guías en la web sobre este tema, comparto la que uso diariamente. Agreguen o corrijan lo que crean necesario:
Seguir leyendo