Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/10/2010, 15:31
Avatar de IsaBelM
IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
eliminar y restaurar opciones select

tengo un número n de selects y las opciones de estos selects pueden estar repetidas. el caso es que no tengo problemas al seleccionar una opción y eliminar esa opción en caso que este repetida en otros selects. el problema lo tengo a la hora de restaurar esas opciones eliminadas, la función Redo(). si lo estreso, o bien no inserta todas las opciones eliminadas o sí las inserta pero no en los selects o posiciones en los que estaban de principio.
a modo de aclaración las opciones eliminadas no se insertan todas de una vez, sino que primero se reinserta la última opción eliminada. si se vuelve a invocar a la función se reinserta la penultima, etc... así hasta que los selects han vuelvo a su estado inicial.
Código Javascript:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  5. <script type="text/javascript">
  6. function getElement(elElemento) {
  7. return document.getElementById(elElemento);
  8. }
  9.  
  10.  
  11. var vuelta = 0;
  12. var ok = '';
  13. var eliminadosVal = [[],[],[],[],[]];  
  14. function delOpcion(val) {
  15. eliminados = 0;
  16. if (val.id == ok && vuelta >= 1) {alert('Antes de elegir otra opción de este select, has de restablecer la última opción'); val.options[0].selected = 'selected'; return;}
  17.  
  18. var combo = val.name;
  19. var f = document.form1;
  20.  
  21. for (var i = 0; val.options[i]; i++) {
  22.  
  23.     if (i == val.selectedIndex) {
  24.  
  25.         for (var n = 0, sel = f[combo].length; n < sel; n++) {
  26.  
  27.             if (val.id != f[combo][n].id) {
  28.  
  29.                 for (var p = 0; f[combo][n].options[p]; p++) {
  30.  
  31.                     if (val.value == f[combo][n].options[p].value) {
  32.  
  33.                         eliminados++;
  34.                         eliminadosVal[0].unshift(val.value);
  35.                         eliminadosVal[1].unshift(p);
  36.                         eliminadosVal[2].unshift(f[combo][n].id);
  37.                         eliminadosVal[3].unshift(val);                     
  38.                         getElement(f[combo][n].id).options[p] = null;
  39.                         getElement('deshacer').disabled = false;
  40.                         vuelta ++;
  41.                 break;
  42.                     }
  43.                 }
  44.  
  45.             }
  46.            
  47.         }
  48. break;
  49.  
  50.     }
  51.  
  52. }
  53. ok = val.id;
  54. eliminadosVal[4].unshift(eliminados); // de cuantos select se ha eliminado este valor
  55. }
  56.  
  57.  
  58.  
  59. function Redo() {
  60. vuelta = 0;
  61. var cuantos = parseInt(eliminadosVal[4][0]); // de cuantos select se ha eliminado este valor
  62. alert(cuantos);
  63. for (var i = 0; i < cuantos; i++) {
  64.  
  65.     var reDoOpciones = new Option(eliminadosVal[0][i], eliminadosVal[0][i]);
  66.        
  67.     if (getElement(eliminadosVal[2][i]).options.length == eliminadosVal[1][i]) { // si es la última opción del select
  68.  
  69.         eval(getElement(eliminadosVal[2][i]).options[eliminadosVal[1][i]] = reDoOpciones);
  70.  
  71.     } else {
  72.  
  73.         opt = getElement(eliminadosVal[2][i]).options.length;
  74.  
  75.         for (var n = getElement(eliminadosVal[2][i]).options.length-1; n >= eliminadosVal[1][i];  n--) {
  76.  
  77.             var reInsertaOpt = new Option(getElement(eliminadosVal[2][i]).options[n].text, getElement(eliminadosVal[2][i]).options[n].value);  
  78.             eval(getElement(eliminadosVal[2][i]).options[opt] = reInsertaOpt);
  79.         opt--;
  80.         }
  81.  
  82.         eval(getElement(eliminadosVal[2][i]).options[eliminadosVal[1][i]] = reDoOpciones);
  83.     }
  84.  
  85.     eliminadosVal[3][i].options[0].selected = 'selected'; // devolvemos el foco
  86.  
  87.        
  88. }
  89.  
  90.     eliminadosVal[0].splice(0,cuantos);
  91.     eliminadosVal[1].splice(0,cuantos);
  92.     eliminadosVal[2].splice(0,cuantos);
  93.     eliminadosVal[3].splice(0,cuantos);
  94.     eliminadosVal[4].splice(0,1);
  95.  
  96.     if(eliminadosVal[0].length == '') {getElement('deshacer').disabled = true;}
  97. }
  98. </script>
  99. </head>
  100. <body>
  101. <form id="form1" name="form1" method="post" action="">
  102. <select id="regalo_1" name="regalo[]" size="10" onchange="delOpcion(this)">
  103. <option value="">Regalo para Ti</option>
  104. <option value="Moto">Moto</option>
  105. <option value="Coche">Coche</option>
  106. <option value="Barco">Barco</option>
  107. <option value="Bicicleta">Bicicleta</option>
  108. </select>
  109.  
  110. <select id="regalo_2" name="regalo[]" size="10" onchange="delOpcion(this)">
  111. <option value="">Regalo para Padres</option>
  112. <option value="Coche">Coche</option>
  113. <option value="Casa">Casa</option>
  114. <option value="Viaje">Viaje</option>
  115. <option value="Moto">Moto</option>
  116. </select>
  117.  
  118. <select id="regalo_3" name="regalo[]" size="10" onchange="delOpcion(this)">
  119. <option value="">Regalo para Hermanos</option>
  120. <option value="Consola">Consola</option>
  121. <option value="Bicicleta">Bicicleta</option>
  122. <option value="Moto">Moto</option>
  123. <option value="Mp4">Mp4</option>
  124. </select>
  125.  
  126. <input type="button" id="deshacer" value="Reestablecer Opciones" onclick="Redo();" disabled="disabled" />
  127. </form>
  128. </body>
  129. </html>
gracias

Última edición por IsaBelM; 18/10/2010 a las 15:37 Razón: hacer mas compresible el titulo