« # »

Listas desplegables editables (Selects editables)

Hace tiempo hice un clon del dreamweaver en html y javascript, que te permitia editar una página web online, el tema es que podías seleccionar un enlace (de entre otras cosas) y te aparecían las opciones en el panel de propiedades, con lo que podías seleccionar una opción de un select (por ejemplo el target) y se actualizaba solo el código html. Bien, el problema vino cuando intenté configurar una opción igual que la del dreamweaver, que me permitiera añadir valores al select, en un principio no super como hacerlo pero al final, despues de surfear por la red encontré la solución a mis problemas: "clip:rect()".

Select01

Siguiendo con el reto de hacer un select que permitiese introducir texto, terminé montando una librería que llamando a un objeto con ciertos parametros te permite crear algo completamente igual al select del dreamweaver.

SELECT02

Puedes ver un ejemplo pulsando en: Listas desplegables editables

El código para crear el select es bien sencillo, ya que está encapsulado en un objeto:

JavaScript:
  1. var opciones = new Selector("ejemplo","divID",100,funcionDeRetorno,["","ESTO","ES","UN","SELECTOR","QUE","PERMITE","INPUT","DE","TEXTO"]);

Como veis, el objeto requiere de 5 argumentos, dos de los cuales son opcionales:

  • Nombre del campo: aquí especificamos el "name" del select, de forma que luego desde el form nos llegue la info correctamente.
  • ID de la capa: esta ID nos servirá para luego posicionar la capa o bien darle estilos.
  • Ancho: el ancho del select.
  • Función de retorno: es la función que se lanza cada vez que se selecciona una opción o bien cuando se introduce una nueva opción y se preciona "enter", este argumento es opcional.
  • Valores: en formato de array, se tienen que pasar los valores que se utilizarán en el select. Este argumento tambien es opcional.

Como he comentado, los dos últimos argumentos son opcionales, pero si queremos definir unos valores y no queremos definir una función de retorno, solo tenemos que introducir "null" o "false" en el lugar de la función de retorno.

El código que hace funcionar todo esto es:

JavaScript:
  1. Selector = function(padre,id,ancho,callback,opt){
  2. this.div = document.createElement("div");
  3. var div = this.div;
  4. div.style.position = "relative";
  5. div.style.width = ancho + "px";
  6. div.style.cssFloat = "left";
  7. div.style.styleFloat = "left";
  8. div.id = "selector-div-" + id;
  9. this.inp = document.createElement("input");
  10. var inp = this.inp;
  11. inp.style.zIndex = 2;
  12. inp.style.width = (ancho-18) + "px";
  13. inp.style.clip = "rect(0px "+ (ancho - 18) +"px 25px 0px)";
  14. inp.id = "selector-input-" + id;
  15. inp.name = id;
  16. inp.parent=this;
  17. inp.onkeyup=function(e){
  18. if(!e){var e=window.event;}
  19. if(e.keyCode==13){
  20. this.parent.setValor(this.value,this.value);
  21. this.parent.sel.value = this.value;
  22. this.parent.sel.$onchange(this.parent.sel);
  23. }
  24. }
  25. this.sel = document.createElement("select");
  26. var sel = this.sel;
  27. sel.style.zIndex = 1;
  28. sel.style.width = ancho + "px";
  29. sel.style.clip = "rect(0px " + ancho + "px 25px 82px)";
  30. sel.id = "selector-select-" + id;
  31. sel.parent=this;
  32. sel.onchange=function(){
  33. this.parent.inp.value=this.value;
  34. this.$onchange(this);
  35. }
  36. /* COMUNS */
  37. inp.style.position = sel.style.position = "absolute";
  38. inp.style.top = sel.style.top = 0;
  39. inp.style.left = sel.style.left = 0;
  40.  
  41. if(typeof callback == "function"){
  42. sel.callback =callback;
  43. sel.$onchange=function(e){e.callback(e.value);}
  44. }
  45.  
  46. try{
  47. for(var i=0;i
  48. this.setValor(opt[i],opt[i]);
  49. }
  50. }catch(e){}
  51.  
  52. div.appendChild(inp);
  53. div.appendChild(sel);
  54. document.getElementById(padre).appendChild(div);
  55. };
  56. Selector.prototype.setValor=function(label,value){
  57. this.sel.options[this.sel.options.length] = new Option(label,value);
  58. }

Y de regalo, el método "setValor", el cual nos permitirá añadir valores "al vuelo" a nuestro selector.

JavaScript:
  1. var s = new Selector("ejemplo","idejemplo",200);
  2. s.setValor("label","value");

Ya se que no se pueden añadir etiquetas + valores en el argumento inicial, pero eso lo dejo para un futura revisión si alguien me lo pide para ser utilizado, claro.

El enlace directo al archivo para ser descargado está aquí: Listas desplegables editables (selects editables)

Comentarios

  1. agentsmith | mayo 29th, 2007 | 10:54 pm

    Hola, muy bueno el script, como lo integro a un formulario comun?

  2. Miquel | agosto 2nd, 2011 | 10:27 am

    Es increible como algunos se complican la vida para hacer algo tan simple.

    Para tener un ComboBox editable, lo único que hay que hacer es crear un “input text” y un “select” que se solapen uno encima de otro, de modo que el input text quede siempre por encima pero un poco más corto para que no oculte el boton de desplegar las opciones del “select”.

    Y cuando el usuario despliege el select y elija una opción, solo hay que utilizar el evento “onChange” para pasar el valor del “select” al “input text”.

    Para aquellos que no lo sepan, pueden solapar dos elementos sin necesidad de definirlos como “absolute” (que siempre es engorroso), encapsulandolos dentro de un “div” de 0px de ancho.

    Aquí teneis el código… simple y eficiente.

    Select editable

    ———————Elija una opción———————
    Opcion 1
    Opcion 2
    Opcion 3
    Opcion 4

    Creado por Miquel Abadal.

Deja un comentario

(*: Datos necesarios para dejar un comentario)

Get Adobe Flash playerPlugin by wpburn.com wordpress themes