Categoría: Internet

  • Resaltar una búsqueda con jQuery

    Resaltar una búsqueda con jQuery

    Después de algunos meses sin publicar ningún post, y ya pasadas las vacaciones de verano, vuelvo con un tema que seguro que a los que trabajamos diseñando / desarrollando aplicaciones web nos han pedido los usuarios en más de alguna ocasión: Resaltar en la pantalla las palabras introducidas en una búsqueda.

    En nuestro caso tenemos una página con un formulario de búsqueda con diferentes campos: una caja de texto (búsqueda por texto), dos campos de fechas (búsqueda por fechas) y una lista desplegable de países. Todos ellos se combinan en una consulta a la Base de datos y muestra un listado con los resultados. Dichos resultados se pueden ampliar en otra página pulsando sobre el registro correspondiente. Cómo os imagináis es en esta página de detalle donde se nos requirió que se resaltaran las palabras introducidas en la búsqueda.

    Después de manejar varias opciones (resaltar en BBDD o en la propia aplicación, de manera que al navegador le llegaba el trabajo hecho), me decanté por hacerlo mediante javascript una vez que haya cargado todo el documento en la página. Para ello hemos incluido dentro del proyecto la librería jQuery (de la que ya os he hablado anteriormente) y de un plugin para ella que podéis consultar en http://bartaz.github.com/sandbox.js/jquery.highlight.html.

    Básicamente esta librería contiene una función que se encarga de recorrer todas las palabras del contenedor (documento, div, table, etc.) que le especifiquemos y si encuentra alguna de las palabras utilizadas en la búsqueda y que le pasamos como parámetro la envuelve en una etiqueta <span class=»highlight»>:

    <script type="text/javascript" src="/js/jquery-1.4.2.js"></script>
    <script type="text/javascript" src="/js/jquery-highlight.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
    $("html").highlight(divide_string("<c:out value='${modelo.form.textoLibre}'/>"),{ wordsOnly: true });
    });
    </script>

    Este código se ejecuta una vez que se ha cargado el documento y llama a la función highlight para que resalte las palabras dentro del elemento HTML del DOM. Asímismo le pasamos la opción wordsOnly:true para que resalte palabras completas (si en la búsqueda se introdujo ‘este’, que no resalte parcialmente Esteban). La función divide_string recibe el texto introducido en la caja de búsqueda y retorna un array de palabras, obviando palabras comunes como artículos y preposiciones. Aquí os paso el código:

    function divide_string(cadena)
    {
    var pattern =                       "\\b(Sr|Sra|Sres|Sta|...más_palabras_comunes...|vuestro|vuestros|y|yo|él|en)\\b";
    var re = new RegExp(pattern, "gi");
    cadena = cadena.replace(re,"");
    var mytool_array = cadena.split(" ");
    return mytool_array;
    }

    Por último indicar que fue necesario realizar modificaciones del plugin ya que no resaltaba las palabras que tenían acento si en la caja de texto buscabas sin acento. Justo antes de crear la expresión regular a evaluar, modificamos el patrón para incluir las vocales acentuadas:

    pattern = pattern.replace(/a/gi,"[a|á]");pattern = pattern.replace(/e/gi,"[e|é]");pattern = pattern.replace(/i/gi,"[i|í]");pattern = pattern.replace(/o/gi,"[o|ó]");pattern = pattern.replace(/u/gi,"[u|ú]");
    if (settings.wordsOnly) {
    pattern = "\\b" + pattern + "\\b";
    }
    var re = new RegExp(pattern, flag);

    Seguro que alguna vez os resulta útil.

  • Tablas con DisplayTag y Ajax

    Tablas con DisplayTag y Ajax

    Durante los dos últimos años, mi equipo y yo hemos introducido en los proyectos J2EE una librería de tags JSP para la publicación de datos de forma tabular. Se trata de DisplayTag, una librería open source muy potente que nos facilita la visualización de tablas de datos y la ordenación y paginación de los mismos empleando muy poco código. Para incluirla basta con añadir en la página JSP el tag <display:table>, indicarle el nombre de las columnas, así como el nombre de la colección de datos que enviamos desde el servidor en la respuesta. La librería se encarga de generar el código html para presentar los datos en la tabla, generar los controles de paginación y enlaces de ordenación de las columnas.

    Una de las funcionalidades que no incluye esta librería es la utilización de AJAX,  que nos acerca una serie de técnicas de programación para la creación de aplicaciones interactivas. Cada vez que pulsamos para ordenar la tabla o para pasar a la siguiente página de resultados se realiza una petición al servidor y éste devuelve una nueva página recargando la anterior con la nueva información. Sería conveniente que por cada petición de ordenar o cambiar la página de resultados se recargase únicamente la información de la tabla de forma asíncrona y no toda la página.

    Solución con Ajax Tags

    La librería Ajax Tags es un conjunto de tags JSP que simplifica el uso de la tecnología AJAX en las páginas JSP. Además incorpora un tag específico para permitir y habilitar AJAX en las Displaytags comentadas más arriba. Para utilizarlo basta con envolver la tabla con el tag <ajax:displayTag> de manera que sólo se refresque el área contenida en éste y no toda la página:

    <ajax:displayTag id="displayTagFrame" ajaxFlag="displayAjax">
    
        <display:table name="service.allCars" pagesize="10" scope="page"
            defaultsort="1" defaultorder="descending" export="true" id="row"
            excludedParams="ajax">
            <display:column property="make" title="Make" sortable="true"
                headerClass="sortable" />
            <display:column property="model" title="Model" sortable="true"
                headerClass="sortable" />
            <display:column title="Link" media="html">
                <a href="http://www.${row.make}.com">${row.make} Web Page</a>
            </display:column>
            <display:column title="Link" media="excel xml"> www.${row.make}.com </display:column>
        </display:table>
    
    </ajax:displayTag>

    ¿Cómo funciona? Engloba todo el código html de la tabla en un div con el id indicado como parámetro, sobreescribe el método onclick de cada enlace de la tabla por un código que se encarga de realizar la llamada al servidor y recargar únicamente el div indicado con el código de la tabla (obviando todo el código que no sea la tabla).

    Aun resultando así de fácil nos hemos encontrado dos problemas:

    1. Nosotros utilizamos Struts/Tiles para componer la maquetación de las páginas (aunque nuestro framework sea Spring), de manera que dividimos la página en varias JSPs (cabecera, menú, pie y contenido). Cómo hemos dicho anteriormente ajaxtags obvia el código que no sea de la tabla pero únicamente lo hacía para el contenido, por lo que en el div volvía a aparecer la cabecera, el pie, etc. La solución fue crear una definición en la configuración de Tiles que sólo incluyese el contenido y si en la petición venía cierto parámetro, redirigir desde el servidor a ésta.
    2. Ajaxtags sobreescribe el evento onclick de los enlaces, pero también sobreescribe el atributo href con un javascript://nop/. Esto nos supone un problema si el sitio tiene alguna restricción de accesibilidad, puesto que en navegadores que no tengan javascript activo (o no soporten js) no funcionará la paginación y ordenación de la tabla.

    Solución con jQuery

    jQuery es una librería Javascript que simplifica el desplazamiento entre documentos, manipulación del DOM, la gestión de eventos, los efectos y animaciones y la interacción mediante Ajax para un rápido desarrollo web. Esta solución se basa en la funcionalidad load de jQuery, la cual permite cargar html externo desde una fuente remota e inyectarlo en el DOM.

    Vamos a verlo más fácil con el siguiente ejemplo:

    <div id="tablaresultados">
    
        <display:table name="modelo.resultado"
            requestURI="/catalog/busquedaTexto.do" pagesize="10" cellspacing="0"
            decorator="es.displaytag.decorator.BuscaTextoTableDecorator"
            id="resultados">
            <display:column title="Título" property="titulo" sortable="true" />
            <display:column title="Signatura" property="signatura" sortable="true" />
            <display:column title="Fechas" property="fecha" style="text-align:center" sortable="true" />
        </display:table>
    
    </div>

    El único requisito en la tabla será que la contenga una capa con el id que deseemos. En esta solución sí que es necesario introducir código javascript en la página:

    <script>
    
        if (!com) var com = {};
        es.displaytag= {
                onPeopleTableLoad: function() {
    
                    // Se llama cuando se cargan los datos
                    $("table#resultados th.sortable").each(function() {
                        // Itera sobre cada cabecera de columna conteniendo la clase sortable, de manera
                        // que
                        // podemos sobreescribir la gestión de click via ajax, en lugar de
                        // permitir al navegador seguir un enlace normal
                        $(this).click(function() {
                            // "this" es el elemento th ordenable
                            var link = $(this).find("a").attr("href") + " #tablaresultados";
                            $("div#tablaresultados").load(link, {}, es.displaytag.onPeopleTableLoad);
                            // Paramos la propagación de eventos, sin permitir que el navegador ejecute el
                            // href
                            return false;
                        });
                    });
                    $("div#tablaresultados .pagelinks a").each(function() {
                        // Itera sobre cada enlace de paginación para sobreescribirlo
                        $(this).click(function() {
                            var link = $(this).attr("href") + " #tablaresultados";
                            $("div#tablaresultados").load(link, {}, es.displaytag.onPeopleTableLoad);
                            return false;
                        });
                    });
                }
        };
    
        $(document).ready(function() {
            // Carga inicial cuando el DOM está preparado. Se asume que vas a inyectar
            // dentro de un div
            // con el id "tablaresultados" que existe en la página.
            $("div#tablaresultados").load("/path/remoto/que/genera/tabla/arriba", {}, es.displaytag.onPeopleTableLoad);
        });
    
    </script>

    Para evitar el problema 1 comentado en la solución con ajaxtags, añadimos a los enlaces el id «#tablaresultados» para indicarle que recargue únicamente la capa que contiene la tabla. El problema 2 no lo tenemos con esta solución puesto que no se sobreescribe el atributo href. En el caso de mostrar la tabla en un navegador que no interprete javascript la tabla funcionará normalmente recargando toda la página.

    Conclusiones

    Personalmente me inclino por la solución con jQuery, ya que en nuestro caso no es necesario modificar código en el servidor y porque necesitamos cumplir con criterios de accesibilidad.

    Seguramente existen multitud de componentes o tablas con Ajax para incorporar a las aplicaciones web, pero si ya tienes una página con displaytag, el código en el servidor que la alimenta y deseas incorporar ajax y mantener lo que tenías, estas dos soluciones son unas muy buenas opciones.

    Actualización

    (25-03-2011) Posterior a esta entrada se desarrolló un plugin jQuery (displaytag-ajax) que provee la capacidad de refresco AJAX a tablas generadas mediante Display Tag. Debo dar las gracias a Yajairo87 ya que gracias a su comentario pude descargármelo y probarlo (funciona perfectamente). Si tenéis curiosidad y miráis el código comprobaréis que realiza el mismo proceso comentado en esta entrada. Podéis descargarlo en la siguiente dirección: http://joseantoniosaiz.es/samples/displaytag-ajax/displaytag-ajax-1.2_0.zip

  • La importancia de la imagen en Internet

    La importancia de la imagen en Internet

    Hace unos días aparecía en las páginas de un periódico nacional, una consulta realizada por un profesional a un experto en el que exponía su experiencia personal en una entrevista de trabajo. En ella comentaba que le formularon preguntas con relación a lo que habían encontrado sobre él en Internet (artículos publicados, presencia en foros, etc.). Al final preguntaba acerca de la importancia de la presencia en Internet y en el perfil nuestro que queremos que aparezca.

    xing.com

    La respuesta era obvia: igual que cuidamos nuestra presencia en la calle, en nuestro trabajo, debemos cuidar nuestra presencia en la red. Estar presente en la red sirve para ver y ser visto, para aportar y recibir información, pero tiene sus riesgos. Añadía el experto que toda la información nuestra puede ser accesible por todos y reutilizada en cualquier momento. Se incluía un plan de posicionamiento personal planteando los siguientes puntos:

    1. ¿En qué redes profesionales quiero estar? (lindekin, xing,…) A priori, más es mejor.
    2. ¿En qué redes sociales quiero estar? Cuantas menos, mejor
    3. ¿Qué voy a publicar?, pero sobre todo ¿para qué y para quiénes lo voy a publicar? Muy importante tener en cuenta que lo que escribo hoy para un público será accesible mañana para cualquiera

    Por último, recomienda ser activo, participar, editar contenidos, ya que si no estamos en los foros profesionales específicos de nuestra función o profesión, dejamos de existir.

    Ya comenté en mi primera entrada en el blog mi preocupación por estar presente en Internet, y esa fue una de las razones que me llevaron a crear este blog, pero, ¿tendré que tener más cuidado de lo que publico? Quién sabe si el día de mañana alguien necesite encontrar información sobre mi.

  • Anuncios en la Super Bowl

    Este pasado domingo tuvo lugar en Estados Unidos la final de la liga profesional de fútbol americano (NFL), más conocida como Super Bowl. Siempre se celebra el primer domingo de Febrero. Este acontecimiento se podría comparar en Europa a la final de la Champions League y a nivel mundial a la final de la Copa del Mundo de Fútbol, pero la gran variedad de equipos finalistas hace único a este espectáculo que es el más visto en Norteamérica y uno de los más seguidos en todo el mundo.

    Según los datos que he podido consultar en la Wikipedia, los estadounidenses consumen durante el desarrollo del evento el 5% de las ventas totales de cerveza, cosa que me parece una pasada, y son muchos los artistas de renombrado prestigio que actúan tanto en el espectáculo previo como en los entretiempos. Otro dato relevante es el coste de la publicidad durante el encuentro: un anuncio de 30 segundos puede costar más de 2 millones de dólares (este año 2010 ha sido más barato debido a la actual crisis económica). Gracias a Internet he podido ver algunos de éstos anuncios en los que abunda la creatividad y la aparición de famosos (Megan Fox, Beyoncé, Oprah o incluso los Simpsons). Os recomiendo que los veáis porque hay algunos bastante buenos (http://mashable.com/2010/02/08/super-bowl-ads-2010). Este es mi favorito:

    La verdad es que Google no suele publicitarse en televisión, pero hay que reconocer que se ha salido. Sólo con unas pocas búsquedas narra una historia de amor con final feliz. ¿Qué os parece? ¿Hay algún otro que os guste más?

  • ¿Es Wifi un pequeño fracaso?

    ¿Es Wifi un pequeño fracaso?

    El Wifi (Wireless Fidelity) es un sistema de envío de datos mediante ondas de radio en vez de cables. Wifi o Wi-Fi está diseñado para conectar ordenadores a la red a distancias reducidas, cualquier uso de mayor alcance está expuesto a un excesivo riesgo de inteferencias.

    logo wifi

    El Wifi ha entrado en nuestras casas por la necesidad de movilidad y la facilidad de configuración. A esto se une que la gran mayoría de proveedores de ADSL incluyen en sus ofertas routers con tecnología inhalámbrica. El gran problema de estas redes son las vulnerabilidades y problemas de seguridad. Para garantizar la seguridad aparecieron estándares de cifrado como WEP o WPA.

    Casi todos tenemos algún dispositivo Wifi, en mi caso tengo dos ordenadores portátiles Toshiba y  HP (el Toshiba al ser más antiguo se conecta mediante un dispositivo Wifi USB) y un netbook Packard Bell. También llevo conmigo un móvil Nokia y un iPod Touch que poseen tecnología Wifi.

    Lo que parecía toda una revolución se ha quedado, a mi entender, en un pequeño fracaso fuera de nuestras casas. Pocas ciudades han adoptado esta tecnología en sus calles para dar acceso universal a Internet. Anuncios de empresas de transporte en los que se iba a poder acceder a la red se han quedado en eso mismo, anuncios. Son raros los establecimientos, hoteles, centros comerciales donde se puede acceder libremente sin tener que pagar. Por lo tanto, llevar un dispositivo Wifi en el bolsillo o la maleta no te garantiza tener conexión allá donde vayas. La alternativa, al menos de momento, parece que es el 3G. Las redes de telefonía móvil llegan al 98% del territorio español y un porcentaje menor el de la cobertura UMTS. Por contra, el precio es más alto y no todo el mundo puede permitirse un plan de datos con las tarifas que actualmente existen en el mercado español.

    Por todo esto considero Wifi como una revolución en el hogar, pero un pequeño fracaso fuera de él. Si necesitas conexión siempre y no te importa demasiado el precio a pagar, necesitarás un plan de datos 3G con cualquier operador de telefonía móvil.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para su aceptación y la de nuestra política de cookies.

ACEPTAR
Aviso de cookies