Sofa Naranja ahora, con un 125% más de naranja

Posts con la etiqueta “JavaScript

Publicado
1 February 2007 @ 9pm

Categorías
JavaScript, TextMate, Web

TextMate JavaScript Bundle

Si programas JavaScript de una manera más o menos asidua, y usas TextMate, tienes que probar el bundle “JavaScript Tools”

Textmate Javascript Tools

Javascript Tools pone a tu disposición dos herramientas que (dependiendo de tu nivel programando Javascript) pueden ser una bendición o una pesadilla:

JSLint, un verificador de sintaxis para Javascript. JSLint detecta errores tan comunes como:

  • Los ; que siempre se te olvidan al final de una línea.
  • Código que nunca se ejecuta.
  • case sin su switch correspondiente.
  • Comentarios dentro de comentarios.
  • Uso de = en comparaciones (en lugar de ==)
  • Etc, etc…

JSMin, un compresor de ficheros .js que te ahorrará un pico en tu factura de hosting.

La gracia del asunto está en que las dos herramientas se integran perfectamente con TextMate, y si tienes un error en tu código, JSLint te dirá dónde está (con un bonito enlace que te lleva a la línea y columna donde está el error).

Jslint en Textmate

De regalo, el bundle incluye un comando que verifica la sintaxis cada vez que guardas el fichero, mostrándote un tooltip si hay algún problema.

Jslint en Textmate 2

Así que ya tardan en descargarse el bundle y darle las gracias al autor :)

Technorati tags: , ,

Publicado
27 September 2006 @ 1am

Categorías
Código, JavaScript, Web

Javascript no intrusivo con jQuery

Tenía a jQuery en mi lista de “cosas que tengo que probar un día de estos” desde hace tiempo.

Para un proyecto que tenemos, he empezado a trastear con esta librería, y los resultados (inmediatos) me han dejado muy buen sabor de boca.

Vamos con unos ejemplitos de lo que sabe hacer jQuery:

Lista de resultados “con pijama”…

Este es un quebradero de cabeza clásico, para el que se han planteado muchas soluciones. La que he encontrado, usando los selectores CSS + DOM de jQuery es tan simple que casi da miedo:

$("#lista ul li:even").addClass("even");

Que viene a decir: “dentro del div #lista, me seleccione todos los li impares dentro de un ul, y les añada la clase ‘even’”

El HTML que estoy usando es bastante limpito:

<div id="lista">
    <ul>
        <li>Elemento 1</li>
        <li>Elemento 2</li>
        <li>Elemento 3</li>
        <li>Elemento 4</li>
    </ul>
</div>

Pero dejarlo así sería desaprovechar toda la potencia de jQuery (y manchar un poco el HTML, en realidad). Así que, después de mirar un rato (10 minutos) la documentación, me encuentro con que puedo dejar mi HTML tal que así:

<ul>
    <li>Elemento 1</li>
    <li>Elemento 2</li>
    <li>Elemento 3</li>
    <li>Elemento 4</li>
</ul>

¿Y entonces cómo sé a qué lista tengo que ponerle el pijama? Aquí es donde entra en juego toda la potencia de los pseudo-selectores de jQuery (el li:even) es uno de ellos, pero hay muchos más

$(body ul:first li:even).addClass("even");

Que es como decir: “le añada la clase ‘even’ a los li impares de la primera ul que aparezca en el body” (en este caso he hecho trampa, porque sé que mi ul será la primera que aparezca en el documento)

Añadir un icono a los enlaces externos…

Este es un asunto que ya visitamos en un artículo anterior (Destacando enlaces externos en WordPress)

Usando jQuery hay varias maneras de hacer esto, pero voy a elegir una particularmente curiosa: usar una expresión XPath.

$("//a[not(contains(@href,'sofanaranja.com'))]").addClass("externo");

Esto sería el equivalente a “busca todos los elementos ‘a’ cuyo atributo src no contenga la cadena ’sofanaranja.com’, y les añades la clase ‘externo’”.

(Lo de escribir expresiones XPath se sale un poco de la temática del post… : )

Javascript no intrusivo

Como vemos con este par de ejemplitos, los selectores de jQuery nos permiten hacer toda clase de perrerías (tanto en presentación como en comportamiento) sobre el DOM de nuestro documento sin (practicamente) guarrear el HTML.

Usando jQuery no hay excusa para ese crimen que es

... href="javascript:abreVentana()" ...

Me temo que seguiré comentando las bondades de jQuery una temporadita :D

Por qué me gusta jQuery, personalmente

  • Porque ocupa poco (15Kb comprimida)
  • Porque no le sobra nada, y lo poco que le falta es, casi siempre, innecesario :)
  • Porque la documentación está actualizada, bien escrita, y tiene ejemplos claros de qué se puede hacer y cómo.
  • Porque seleccionar elementos del DOM usando selectores CSS y XPath es droga dura: una vez que lo pruebas no puedes vivir sin ello.

Recursos interesantes…

Para trabajar con XPath, hace tiempo me encontré con AquaPath, una utilidad para Mac que vale su peso en oro…


Publicado
17 February 2006 @ 10am

Categorías
Código, JavaScript

Efecto :hover sobre cualquier cosa, v2.0

En respuesta a un comentario en el post sobre “Efecto :hover en cualquier cosa”, me puse a jugar con prototype.js para ver si se podía hacer lo mismo de una forma menos farragosa.

El resultado:

function setHover(className,hoverClassName) {
    var hoverDivs = document.getElementsByClassName(className);
    hoverDivs = $A(hoverDivs);
    hoverDivs.each(
        function(div){
            div.onmouseover = function(){
                Element.addClassName(this,hoverClassName);
            }
            div.onmouseout = function(){
                Element.removeClassName(this,hoverClassName);
            }
        }
    );
    }
function init (){
    setHover('hover','hoverclass');
}
Event.observe(window, 'load', init, false);

La idea es que a todos los elementos que queramos hacerles un hover les asignamos la clase “hover”, y definimos en otra clase “hoverclass” los atributos del estado hover.

A pesar de que en el código se usa una variable llamada ‘div’, funciona con cualquier elemento de la página…

Lo que hacemos, igual que con el método anterior, es buscar elementos que contengan la clase ‘hover’, y les asignamos la clase ‘hoverclass’ en el evento ‘onmouseover’.

Más cosillas… Event.observe() es la forma inteligente de asignar una función a un evento sin “manchar” el HTML de la página. En este caso le asigno la función ‘init()’, que se encarga de llamar a ’setHover()’ con los dos parámetros que necesita (el class que he usado para definir qué elementos tienen hover, y el class que quiero usar cuando se hace rollover).

Gracias a tutiplén a demimismo por sugerir el uso de prototype.js. Creo que estoy enamorado de otra librería :D


Publicado
5 January 2006 @ 8pm

Categorías
CSS, Código, JavaScript

Efecto :hover en cualquier cosa

Esta semana me preguntaron lo siguiente:

¿Cómo hacer un :hover en un DIV con Internet Explorer?

No sé si se suponía que debía saberlo, pero la verdad es que me pilló un poco por sorpresa…

¿Con #iddeldiv:hover, no?

(Comentario que demuestra mi total ignorancia con respecto a las capacidades de Explorer)

Me temo que Explorer sólo soporta :hover en los ‘a’…

Como uno es de naturaleza curiosa, me puse a trastear con el dilema, llegando a la siguiente solución (que no deja de ser una chapuza, pero que no sólo funciona en Explorer sino en Camino, Firefox y Safari):

<script>
    function replaceHover(){
        var hoverDivs = document.getElementsByTagName("div");
        for(var i=0; i<hoverDivs.length; i++){
            if(hoverDivs[i].className.indexOf('hover') != -1){
                //  ...guardamos las clases del DIV...
                var classes = hoverDivs[i].className;
                //  ...en onmouseover le añadimos una clase extra, 'hoverclass'...
                hoverDivs[i].onmouseover = function(){
                    this.className += ' hoverclass';
                }
                //  ...y se la quitamos en onmouseout
                hoverDivs[i].onmouseout = function(){
                    this.className = classes;
                }
            }
        }
    }
</script>

Que quiere decir, en román paladino:

  • Obtener todos los DIVs del documento
  • Mirar si el DIV tiene asignada una clase CSS ‘hover’
  • Si es así, le asignamos un evento ‘onmouseover’ que le añade la clase ‘hoverclass’ (que tendrá alguna pijadilla del estilo de background-color: rosachicle, o algo por el estilo)
  • Y ya puestos, se la quitamos cuando salga el ratón del DIV

Para disparar el cambio se llama a la función ‘replaceHover’ desde el ‘onload’ de body:

<body onload="replaceHover()">

Obviamente, el código se puede usar con otros tags… sólo habría que cambiar el

getElementsByTagName("div")

por

getElementsByTagName("nombre_del_tag_que_quieras")

Pos eso… agradecimientos especiales a Furilo por darme algo en qué pensar… :D

Update: un método mucho más elegante usando prototype.js


Destacando enlaces externos en WordPress

Hay pequeños detalles que hacen la vida de los visitantes de tu blog un poco más agradables. Uno de ellos es destacar de alguna manera qué enlaces son internos (es decir, conducen a otra página de tu web) y cuáles son externos (conducen a un sitio distinto).

Para Sofá Naranja quería añadir esta funcionalidad. Empecé a buscar plugins para WordPress, pero al cabo de un rato llegué a la conclusión de que ninguno me convencía demasiado, y acabé programando un hack que hace lo mismo.

El resultado que quería conseguir es este:

Enlace interno y externo

Los enlaces externos son del mismo color, pero les añado un pequeño icono a la derecha.

Para no meterme demasiado en las tripas del monstruo, y para hacer algo portable, decidí trastear un poco con JavaScript.

La idea de mi script es la siguiente:

  • Recorro todos los tags <a href...>
  • Miro si el enlace contiene la URL de mi blog.
  • Si no es así, le aplico un estilo CSS.

Aquí va la cosa:

var links = document.getElementsByTagName('a');
for(var i=0 ; i < links.length; i++){
    var link = links[i];
    if(link.href.indexOf('sofanaranja.com') == -1){
        //  es un enlace externo
        link.style.paddingRight = "10px";
        link.style.backgroundImage = "url(/images/aoutside.gif)";
        link.style.backgroundPosition = "right center";
        link.style.backgroundRepeat = "no-repeat";
    }
}

Lo que hago es asignar a la variable links todos los tags <a ...> de la página. Luego voy mirando si el href del enlace contiene la URL de mi blog con indexOf(), que devuelve -1 si no se ha encontrado la cadena.

Una vez localizado un enlace externo, sólo falta cambiar los atributos CSS. Esto se hace accediendo a los atributos con objeto.style.nombreDelAtributo

Hay que decir que los nombres de atributos en JavaScript no son exactamente iguales que en CSS. Imprescindible usar esta lista de conversión de propiedades CSS a atributos de JS.

Ahora viene la gran pregunta: ¿y cuándo se ejecuta esto?

Yo lo he puesto en el evento onload de body:

<script type="text/javascript">
    function init(){
        var links = document.getElementsByTagName('a');
        for(var i=0 ; i < links.length; i++){
            var link = links[i];
            if(link.href.indexOf('sofanaranja.com') == -1){
                //  es un enlace externo
                link.style.paddingRight = "10px";
                link.style.backgroundImage = "url(images/aoutside.gif)";
                link.style.backgroundPosition = "right center";
                link.style.backgroundRepeat = "no-repeat";
            }
        }
    }
</script>
<?php wp_head(); ?>
</head>
<body onload="init()">

Este cambio lo he puesto en el fichero header.php de mi tema de WordPress, para que funcione en todas las páginas del blog (incluyendo las que no son posts).

El icono es gentileza de web-graphics.com.