« # »

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?

Deja un comentario

(*: Datos necesarios para dejar un comentario)

Get Adobe Flash playerPlugin by wpburn.com wordpress themes