borrame.com - Colección particular de recortes de código y documentación para programación web

Canales RSS

Lo más fresco

  1. Reemplazar selección con JavaScript Nuevo
  2. ¿Esta IP pertenece a esta red? Modificado
  3. Mozilla Firefox Modificado

Sugerencias del chef

Lo más visitado

  1. Dar formato a un número
  2. Fecha y hora
  3. Campo autonumérico
  4. Rotar logs en Windows
  5. Reiniciar Apache con cuidado (graceful restart)
Compartir esta página

Seleccionar nodo

Esta función selecciona todo el texto de un nodo HTML (una tabla, una lista, un párrafo...). El resultado es igual que si lo hubiéramos hecho manualmente arrastrando con el ratón.

/*
 * Crea una selección que engloba el nodo indicado
 */

function seleccionarNodo(nodo){ // v2009-07-22
    // Creamos un rango
    try{ // FF
        var rango = document.createRange();
    }catch(e){
        try{ // IE
            var rango = document.body.createTextRange();
        }catch(e){
            return;
        }
    }

    // Asignamos texto al rango
    try{ // FF
        rango.selectNode(nodo);
    }catch(e){
        try{ // IE
            rango.moveToElementText(nodo);
        }catch(e){
            return;
        }
    }

    // Seleccionamos el rango
    try{ // FF
        var seleccion = window.getSelection();
        seleccion.removeAllRanges(); // Eliminar selección actual
        seleccion.addRange(rango);
    }catch(e){
        try{ // IE
            rango.select();
        }catch(e){
            return;
        }
    }
}

El código es compatible con Firefox 2+, Internet Explorer 6+ y Google Chrome. En Konqueror 3 no parece funcionar (tampoco hace daño, supongo). En Opera funciona de forma incorrecta.

Ejemplos de uso

Con la amable colaboración de las funciones para asignar eventos podemos conseguir que al hacer doble clic sobre cualquier tabla de la página ésta se seleccione entera. Así es facilísimo copiarla al portapapeles y sorprender a amigos y vecinos pegándola en Excel, Word, etc. Nota: este ejemplo no contempla el caso de tablas anidadas; no digo que funcione bien o mal, sólo que ni lo he mirado.

(function(){
    /*
     * Permitimos seleccionar las tablas de la página haciendo doble clic
     */

    var tablas = document.getElementsByTagName("table");
    for(var i=0, len=tablas.length; i<len; i++){
        addEvent(tablas[i], "dblclick", function(){
            seleccionarNodo(this);
        });
    }
})();

Naturalmente, no es imprescindible rebosar tanta sofisticación:

<input type="button" value="Seleccionar" onclick="seleccionarNodo(document.getElementById('foo'))">

Demo

Haz doble clic sobre la tabla. Después puedes copiar la selección y pegarla en tu hoja de cálculo favorita.

EneroFebreroMarzoAbrilMayoJunioJulioAgosto
260,96217,46222,90190,2870,6881,55168,53116,89
250,0862,52141,358,15168,53106,01233,7716,31
214,7438,06271,832,72233,77231,05146,7938,06
220,18127,76173,97247,36138,6335,3495,14247,36
244,65271,83173,97269,11165,8295,14108,73152,22

Fallos conocidos

En Opera 9 selecciona la tabla... y el resto del HTML hasta el final del documento. Además no es recomendable asignar un doble clic a la tabla porque interfiere con un menú del propio programa.

En Opera 10 no parece hacer nada.

En Opera 11 han arreglado lo anterior pero han estropeado más el resto: el texto queda resaltado pero no es una selección real (ni se copia al portapapeles ni se deshace al hacer clic en otro lugar).

Lo sé: usar try y catch para detectar funcionalidades roza la cutrez más absoluta...

Historial

v2009-07-22
Arreglado el bug de la celda duplicada en Firefox.
v2008-04-23
Primera versión.

Esta página ha sido impresa el miércoles 8 de febrero de 2012 (02:01:13 +0100) desde http://borrame.com/recortes/javascript/seleccionar-nodo.html. La última vez que miré contenía HTML válido con CSS fresquito y si tiene flatas de ortografía ha sido sin querer.

borrame.com es el sitio anteriormente conocido como bits.demogracia.com (no confundir con Demogracia, que sólo pasaba por ahí).

© 2005-2011 by Álvaro G. Vicario (alvaro.es) • Burgos (España) • borrame.com