Ajax

Selector combo dinámico en Ajax: localidades y provincias de España

En diversos proyectos he tenido la necesidad de trabajar con un formulario en el que uno de los campos es un selector de provincias y localidades de España. Tal vez usted también haya tenido esta misma necesidad durante el desarrollo de un proyecto.

En un enfoque tradicional sería necesario cargar en memoria todas las provincias y localidades, o dividir el proceso en dos fases: en la primera el usuario elegiría su provincia para luego seleccionar su localidad en un segundo paso. Un ejemplo de este enfoque tradicional es la web de páginas amarillas. Observe que el tiempo de carga de la página es considerablemente elevado.

Las nuevas técnicas de desarrollo web 2.0 nos ofrecen ahora la posibilidad de resolver este tipo de  funcionalidades de una manera mucho más elegante y eficiente.

Ejemplo de combo dinámico en Ajax 

Combo de localidades

En un enfoque 2.0 he desarrollado este ejemplo en el que puede ver un  formulario que permite al usuario seleccionar su localidad de manera muy rápida y eficiente. Ajax nos permite  trabajar con un documento XML de más de 2Mb que contiene todas las localidades de España, cargando en memoria únicamente la información que necesitemos en cada momento.

En el siguiente esquema se explica el funcionamiento de la aplicación Ajax:

Arquitectura de la aplicación provincias y localidades en Ajax

Esta funcionalidad consta de los siguientes archivos:

  • default.php: página incial dónde se generan dinámicamente el combo de provincias a partir del XML general.
  • xml_data_provider.php: recorre el XML general y devuelve otro XML que contiene sólo las localidades de la provincia escogida.
  • AjaxCode.js:  funcionalidad Ajax que lee el XML con las localidades elegidas y crea dinámicamente el combo de localidades.
  • provinciasypoblaciones.xml: Archivo XML que contiene todas las localidades y provincias de España.

Esta misma funcionalidad puede utilizarla para manejar cualquier XML de gran tamaño que de otra forma se mostraría inmanejable y ralentizaría mucho el tiempo de carga de su Site: fichas de clientes, un catalogo de productos, etc.

El tiempo de carga de una página y el consiguiente tiempo de espera de un usuario es uno de los factores más importantes en el rendimiento de una web. Tal y como se desprende del estudio sobre usabilidad realizado por Peter Sevcik en Julio de 2002, el tiempo de carga de una página no debe dilatarse más de 10 segundos para mantener el nivel de satisfación del usuario dentro de los límites óptimos. A partir de este límite el usuario empieza a percibir que la página está tardando en cargar y cuando se rebasa los 40 segundos la fustración y pérdida de interes del usuario por la página aumenta de manera muy acusada.

El código.

En el siguiente archivo zip dispone de todos los ficheros y recursos que conforman la aplicación. Siéntase libre de utilizarlo en su página web. Si le resultó de utilidad  o encontró cualquier problema le agradecería mucho conocer su feedback.

Compártelo: technorati Selector combo dinámico en Ajax: localidades y provincias de España delicious Selector combo dinámico en Ajax: localidades y provincias de España digg Selector combo dinámico en Ajax: localidades y provincias de España facebook Selector combo dinámico en Ajax: localidades y provincias de España yahoo Selector combo dinámico en Ajax: localidades y provincias de España google Selector combo dinámico en Ajax: localidades y provincias de España linkedin Selector combo dinámico en Ajax: localidades y provincias de España twitter Selector combo dinámico en Ajax: localidades y provincias de España es meneame Selector combo dinámico en Ajax: localidades y provincias de España es fresqui Selector combo dinámico en Ajax: localidades y provincias de España es blogmemes Selector combo dinámico en Ajax: localidades y provincias de España

Enviar a un amigo Enviar a un amigo

Artículos relacionados:

  1. Ajax zoomy: Un Ajax lightbox para su galería de imágenes
  2. AJAX Accesible para Google: Posicionar contenido en Ajax
  3. Ajax Lightbox: Una ventana emergente 2.0 en su página web
  4. Real Ajax Sexy Curls: Una forma elegante de mostrar el código fuente de nuestra página
  5. Cómo enviar información, datos o parámetros con el método POST sin utilizar formulario

Si te ha gustado este artículo y te ha sido de utilidad, Haz una Donación y colobora en el mantenimiento de esta blog.

Cada artículo está escrito con esfuerzo y dedicación, ayúdame a seguir ayudándote.

Comentarios

61 comentarios para “Selector combo dinámico en Ajax: localidades y provincias de España”

  1. Selector combo dinámico en Ajax…

    Un selector en Ajax, idóneo para creación de formularios….

    Posted by meneame.net | Febrero 14, 2007, 20:22 | Citar
  2. Selector combo dinámico en Ajax: localidades y provincias de España…

    Un selector en Ajax, idóneo para creación de formularios….

    Posted by www.enchilame.com | Febrero 15, 2007, 20:25 | Citar
  3. Muy bueno, sos un capo

    Saludos desde Buenos Aires Argentina

    Posted by german | Febrero 19, 2007, 17:42 | Citar
  4. Muy Eficiente tu Script, pero si dieras una solucion alos que tienen la version php4 o menor por que tu script solo agarra en php5 :D saludos

    Posted by CalinSoft.net | Abril 3, 2007, 21:55 | Citar
  5. Hola.

    Pues sí, tienes razón, sólo corre con php5.

    Un saludo.

    Posted by Ignacio G. | Abril 3, 2007, 23:19 | Citar
  6. Esta muy bueno, pero si tubieras uno que mencione todas las provincias del mundo

    Posted by Heber | Abril 13, 2007, 08:12 | Citar
  7. Algien sabe donde se pueden consegir la lista de otros paises con sus provincias?

    Saludos

    Posted by Pablo | Abril 17, 2007, 03:39 | Citar
  8. alguien tendra alguno con las ciudades del mundo?
    se que es mucho pedir, pero necesitaré un para vuelos de todas las principales ciudades que tienen aeropuerto del mundo.
    gracias
    Driss

    Posted by vuelomania | Abril 26, 2007, 12:38 | Citar
  9. Hola.

    Un xml con todas las ciudades del mundo, seguro que puedes conseguirlo. Otra cuestión es, si gratuitamente…

    En cualquier caso prueba a buscar “XML DATA REPOSITORY” en Google, verás que existen montones de documentos XML en la red. Casí seguro que encontrarás lo que buscas.

    Un saludo.

    Posted by Ignacio G. | Abril 26, 2007, 13:59 | Citar
  10. No hay forma de hacerlo funcionar en PHP 4?

    Posted by Fithos | Mayo 30, 2007, 11:46 | Citar
  11. Puedes conseguir lo mismo con PHP4, pero deberías manejar el XML con otras librerías.

    Posted by Ignacio G. | Mayo 30, 2007, 12:05 | Citar
  12. Me ha encantado el artículo y el código facilitado. Te lo agradezco mucho, sirve de verdadera ayuda a mucha gente.

    En cuanto a que si es para PHP5, o si se podría hacer con otras bases de datos (ciudades del mundo…). Que lo haga cada uno a partir de lo que aquí se cede. Ignacio ha dejado una muy buena base, pero no puede solucionar el problema concreto de cada uno de principio a fin.

    Muchas gracias. Un saludo.

    Posted by Antonio | Junio 8, 2007, 11:51 | Citar
  13. Hola Antonio,

    Efectivamente mi idea es que este código puede servir de base para que cualquiera pueda realizar un desarrollo más personalizado.

    Muchas gracias por tu comentario.

    Posted by Ignacio G. | Junio 8, 2007, 11:57 | Citar
  14. Seria chevere si dieras el codigo para jsp
    Te lo agradeceria de veras

    Posted by Yagami | Julio 26, 2007, 23:56 | Citar
  15. Hola muy interesante pero una pregunta como lleno un combo con la informacion de una tabla catalogo (soy nuevo en esto)
    agradecere mucho la ayuda ya que pues si quiero y necesito aprender gracias

    Posted by hugo castillo | Agosto 28, 2007, 19:53 | Citar
  16. [...] Check it out! While looking through the blogosphere we stumbled on an interesting post today.Here’s a quick excerpt [...]

    Posted by google » Selector combo dinámico en Ajax: localidades y provincias de España " Hello Google, su primera posición en Internet | Octubre 9, 2007, 18:49 | Citar
  17. Muy interesante tu nota

    Posted by Nestor | Noviembre 7, 2007, 14:29 | Citar
  18. Muy buen material. Gracias al autor… Con ganas de modificarlo para Argentina. Si hay alguien que busca lo mismo me avisa (cittadini@gmail.com), hoy voy a estar modificandolo.
    Gracias.
    Leandro.-

    Posted by Leandro | Enero 17, 2008, 15:40 | Citar
  19. Muy buen articulo gracias….Tengo una pregunta haber si alguien me puede ayudar: como lo puedo hacer para sacar los datos de una tabla en una base de datos?…Gracias.

    Posted by ghis | Febrero 21, 2008, 23:21 | Citar
  20. El articulo es muy bueno, gracias.

    Acabo de visitar tu web por primera vez y me parece muy interesante con mucho contenido muy útil.

    Posted by Ruymán | Marzo 11, 2008, 23:36 | Citar
  21. Gracias por tu comentario.

    Un saludo.

    Posted by Ignacio G. | Marzo 12, 2008, 21:03 | Citar
  22. Ignacio gracias por el articulo, tengo una consulta a ver si me puedes echar una manito…O cualquier usuario que pueda, se agradese. ¿Como lo hago al elegir en el segundo select (localidad) que me de una pequeña descripcion de la localidad elegida?como tomo ese valor elegido por el usuario en el onChange. Uta se agradese Mil…

    Posted by marcos | Abril 2, 2008, 18:12 | Citar
  23. No tengo bien concreta la idea de hacer uno con 3 combos (Departamento,Provinvia,distrito)si alguien podria brindarme alguna idea de como hacerlo

    Posted by molle | Abril 8, 2008, 00:01 | Citar
  24. Hola..

    Quiero leer un XML dinamico generado con php y cuando pongo el archivo php como parametro en la funcion simplexml_load_file en el archivo xml_provider no me salen los datos del segundo combo, se queda en blanco, comparo el archivo xml con la salida del php y me da el mismo formato, asi que no se cual sea el problema

    de antemano gracias

    Posted by Josue | Abril 10, 2008, 01:40 | Citar
  25. Hola Josue.

    Comprueba que el Content-Type de los datos devueltos por el php sea text/xml. Si el XML está correctamente formado y su formato es el apropiado, el error puede estar relacionado con el Content-Type.

    Un saludo.

    Posted by Ignacio G. | Abril 10, 2008, 09:56 | Citar
  26. urgente Hola, xajax funciona en php4 o nadamas en php5

    Posted by kevin | Junio 19, 2008, 23:54 | Citar
  27. Ajax es compatible con todas laa versiones de php, pero en este ejemplo necesitas la última versión de php para utilizar el componente para manejar los XML.

    Un saludo.

    Posted by Ignacio G. | Junio 20, 2008, 06:37 | Citar
  28. Muy bueno el ejemplo me ayudo mucho…

    Posted by Elvis | Julio 9, 2008, 02:28 | Citar
  29. Muy bueno el post.. tarde lo descubro. Ya utilizaba algo para esto y te encontre buscando una base de datos que necesito de
    provincias > localidades > distritos

    Igualmente aproveche para publicar tu link en los rss del maug.

    Salu2 y Éxitos

    Posted by maug | Julio 19, 2008, 22:09 | Citar
  30. realmente excelente, he aprendido mucho.

    ahora he tenido problemas con los caracteres especiales, como por ejemplo los acentos, ya que al cargarme la lista estan mal escritos, no se bien que puede ser aunque supongo que tiene algo que ver con la conversion de UTF-8 a ISO que realiza en el js, las preguntas serian es muy complicado de solucionar? que deberia cambiar?.

    Posted by Alan | Agosto 6, 2008, 02:27 | Citar
  31. Hola Alan.

    El problema que comentas es muy frecuente en los desarrollos Ajax en castellano y se soluciona trabajando con documentos con codificación UTF-8. Aunque así dicho puede parecer simple, lo cierto es que en la práctica puede ser bastante desesperante, puedes consultar aquí algunos ejemplos que te pueden ser de ayuda:

    http://www.tufuncion.com/acentos-ajax

    http://www.webadictos.com.mx/2007/11/07/tip-para-solucionar-problema-con-acentos-al-utilizar-ajax/

    Suerte.

    Posted by Ignacio G. | Agosto 6, 2008, 11:47 | Citar
  32. Muchas gracias Ignacio por el dato.

    Saludos.

    Posted by Alan | Agosto 6, 2008, 22:50 | Citar
  33. Te agradezco el ejemplo, muy interesante.

    Posted by Olaff | Agosto 13, 2008, 21:57 | Citar
  34. Muy bueno, pero acabo de probarlo y algunas de las ciudades no me salen. Solo pone el id y no puedo acceder a las poblaciones. Sabe alguien porque peude ser? lo estoy probando con php5.

    Posted by Juan | Septiembre 29, 2008, 13:02 | Citar

  35. No tengo bien concreta la idea de hacer uno con 3 combos (Departamento,Provinvia,distrito)si alguien podria brindarme alguna idea de como hacerlo

    Yo necesitaría algo asi, ya que lo estoy intentado, pero no me funciona. ¿Se podría hacer esto? con 3 combos 4 o más ^^

    Gracias.

    Posted by Iván Diaz Marinas | Octubre 25, 2008, 20:51 | Citar
  36. Solo un comentario… probé el link de página amarillas y lo deben haber mejorado desde que lo miraste… va aun más rápido que el tuyo :P

    Posted by Edu | Noviembre 4, 2008, 17:54 | Citar
  37. Ja! Pues es cierto que funciona más rápido que el mio, pero he revisado el código y siguen metiendo toda la info en arrays js.

    Puedes comprobarlo por ti mismo: http://callejero.paginasamarillas.es/javascript/proyectos.js

    Esto explica que sea más rápido, evitan tener que hacer una consulta al servidor cada vez que el usuario haga una petición, sin embargo, utilizar arrays para este tipo de funcionalidades es un mecanismo un tanto arcaico que implica problemas de mantenimiento, escalabilidad, accesibilidad, etc…

    Yo apuesto por AJAX para estos temas.

    Posted by Ignacio G. | Noviembre 4, 2008, 18:54 | Citar
  38. Hola ! Quisiera usar tu código pero tengo que usarlo dentro de una pagina que no PHP es JSTL. Como puedo hacerlo?

    Muchas gracias!

    Posted by Juan Ma | Diciembre 10, 2008, 00:16 | Citar
  39. Hola JuanMa, el código cliente es el mismo independientemente del lenguaje de servidor que utilices. Ahora bien sería necesario que tradujeras a JSTL o JSP el código que se encarga de recorrer el árbol XML y devolver la información al cliente. Ten en cuenta que AJAX es compatible con cualquier tecnología servidor.

    Posted by Ignacio G. | Diciembre 10, 2008, 10:31 | Citar
  40. No me explique bien jaja!, yo tengo PHP en mi servidor de aplicaciones, pero el código que da los select, como en el ejemplo de “DEFAULT.php” es:

    xpath(“/lista/provincia/nombre | /lista/provincia/@id”);
    for ($i=0;$i<count($result);$i+=2)
    {
    $e=$i+1;
    $provincia=UTF8_DECODE($result[$e]);
    echo(“$provincia”);
    }
    ?>

    El problema es que como estoy usando una página JSTL no puedo usar ése código. Como puedo hacer?

    Posted by Juan Ma | Diciembre 10, 2008, 11:31 | Citar
  41. holas, me a sido muy util tu ejemplo, estoy armando una base de datos (Pais / ciudad / Provincia) de america… si alguien desea la BD (XML) me avisa, ando en busca de los demas paises.
    saludos y grax.

    Posted by Roberto / Borias | Diciembre 11, 2008, 05:24 | Citar
  42. hola a

    ese ejemplo de los combos es presiamente lo que nesesito

    pero en JSP

    no se si alguien me puede dar una idea o pazar el codigo,

    el codigo que tengo solo me funciona en firefox y en IE7 no funciona

    Posted by julian velazquez zapata | Marzo 23, 2009, 17:36 | Citar
  43. excelente,
    pero, alguien ha hecho que, en vez de consultar un xml, la consulta sea sobre una tabla de una base de datos?
    estoy por modificar este codigo, pero si alguien ya lo hizo, sera bueno compartirlo. saludos

    Posted by agustinisc | Abril 3, 2009, 01:34 | Citar
  44. Necesitaría sacar la información de una base de datos MySql para llenar los Select, alguien tendrá modificado el código para tal fin???
    Desde ya muchas gracias.
    Saludos.
    Mauricio.

    Posted by Mauricio | Mayo 10, 2009, 15:29 | Citar
  45. Necesito que me carguen más combos. Tengo pais, ciudad y necesito dos más para escuela y tipo de curso. Como puedo hacerlo???

    Saludos, Juan.

    Posted by Juan | Mayo 20, 2009, 11:12 | Citar
  46. Hola :
    Pregunta si quiero guardar en una base de datos el value del subcombo seleccionado como deberia hacer??

    gracias

    Adrian

    Posted by Adrian | Julio 2, 2009, 21:24 | Citar
  47. Me parece muy bien el codigo, pero como le hago si trato de editar informacion y quiero que ya aparesca seleccionada una provincia y una localidad.

    Saludos

    Posted by Jose Antonio Gonzalez | Agosto 21, 2009, 04:31 | Citar
  48. El programa en muy interesante … pero como haria para trabajar con base de datos … las provincias en una tabla y las localidades en otra tabla … claro esta que cada tabla debe tener un codigo de provincia y un codigo de localidad … gracias por el apoyo.

    Posted by ROBERT | Agosto 29, 2009, 19:13 | Citar
  49. Genial. es el primero que encuentro.
    Lo he estado testeando y para poderlo implantar en un formulario existente me encuentro con un problema.

    Tienes dos comnbos 1º de provincias y el segundo de poblaciones.

    ¿como puedo hacer para que me devuelva el value en string de las provincias?

    Actualmente tal como esta:
    devuelve el numero de la provincia y el 2º combo me devuelve el string de la ciudad seleccionada.

    Para poderlo implantar en un alta de usuario que ya esta hecha i insertando datos en la bbdd de mysql necesitaria que la provincia del primer combo fuer string.

    Agradeceria mucho que me dieran una solucion gracias

    Posted by daniel | Octubre 9, 2009, 10:36 | Citar
  50. Hola Daniel,

    El primer combo debe contener el id de la provincia para después poder buscar en el documento XML las localidades de dicha provincia.
    Si necesitas obtener el nombre de la provincia puedes hacer 2 cosas:
    1. Incluir en el value del primer combo el nombre y el id separador por un caracter de control, pejm: value=”1#almeria” y luego manejar la cadena como un stringtokenizer, que no es más que hacer un split de la cadena para obtener uno u otro valor.
    2. La segunda opción es acceder al text del combo box en vez de al value.

    Un saludo.

    Posted by Ignacio G. | Octubre 9, 2009, 17:02 | Citar
  51. El ejemplo me parece exelente, muchas grasias por madarmelo.

    Solo que hay un pequeño problema, lo necesito con jsp.

    me basare en este ejemplo de php para traducirlo.

    muchas grasias

    Posted by julian velazquez zapata | Octubre 9, 2009, 17:07 | Citar
  52. Muy interesante el ejercicio. Pero, que pasaria si quiero actualizar una ciudad mas o mas localidades, etc … creo que seria mejor trabajarlo con base de datos … cosa que si necesitamos realzar alguna actualizacion lo hariamos desde una pagina de ingreso o un formulario de mantenimiento … tienes un codigo que aplique para este caso ? … llevo tiempo intentando sacarlo pero no me sale … espero tu ponta respuesta … gracias

    Posted by ROBERT | Octubre 10, 2009, 20:13 | Citar
  53. Mis felicitaciones por la aportación de esta utilidad, pero tengo un problema y es el siguiente. Cuando lo ejecuto en el servidor apache que tengo en mi ordenador me funciona correctamente, pero al subirlo al servidor de Arsys solo sale el select de las provincias sin rellenarlo. Gracias, te agradecería mucho cualquier comentario.

    Posted by Josele | Octubre 24, 2009, 13:47 | Citar
  54. Lo únco que necesitas es la versión 5 de PHP y la clase Xpath. Confirma con Arsys que tu hosting dispone de ello.
    Si es así, tal vez lo que pueda estar fallando es la referencia al archivo xml, mira si la ubicación coincide con la ruta.
    Suerte.

    Posted by Ignacio G. | Octubre 24, 2009, 20:22 | Citar
  55. El archivo que se descarga con extensión .zip no sirve, por favor me gustaria que me colaboraran dandome el link de la descarga correcta. Muchas gracia…..

    Posted by Diana | Noviembre 9, 2009, 16:08 | Citar
  56. Hola Diana, qué problema tienes con el .zip? Probe a descargarlo y funciona correctamente.

    Posted by Ignacio G. | Noviembre 11, 2009, 07:44 | Citar
  57. Estupendo!!!
    Pero tengo un problema, cuando el form encuentra un algun campo invalido, vuelve a la pagina anterior cargando solamente la provincia y la localidad no, entonces el usuario tiene que elegir otra provincia y localidad y luego eligir su verdadera provincia y localidad….
    Yo llamo los erros desde php asi:

    echo ‘ history.go(-1); alert(“Es necesario rellenar todos los campos obligatorios!”);’;

    Como podrias solucionar eso??

    Saludos cordiales

    Ricardo

    Posted by Ricardo | Diciembre 4, 2009, 20:06 | Citar
  58. ?????

    Posted by ricardo | Enero 22, 2010, 19:01 | Citar
  59. Excelente utilidad gracias por compartirla. ¿Como podria modificarse para cargar los datos desde una base de datos de mysql por ejemplo?

    Posted by Rivera E. | Marzo 3, 2010, 08:03 | Citar
  60. Sí, por supuesto. El código es opensource por lo que puedes modificarlo según tus necesidades.

    Posted by Ignacio Gorostiza | Marzo 3, 2010, 09:17 | Citar
  61. a bueno, pero ¿podrias darme una idea de como hacerlo?

    Posted by Rivera E. | Marzo 3, 2010, 10:06 | Citar

Escribir un comentario

Citar el texto seleccionado

Suscríbase a HelloGoogle

Formación Recomendada

Categorías

Mis últimos Tweets...