Ver Mensaje Individual
  #21 (permalink)  
Antiguo 07/05/2007, 13:13
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 7 meses
Puntos: 45
Re: Como hacer que aparezcan elementos seleccionados de un desplegable?

Bueno, ya hice mi propuesta, no leí tu post antes dandreta, de todas maneras ya que la he hecho la voy a postear.
Código PHP:
<select id="sel" onchange="if(this.value!='-') agregarALaTabla( this.options[this.options.selectedIndex].text );">
    <
option value="-">Seleccione por favor</option>
    <
option>casa</option>
    <
option>coche</option>
    <
option>avión</option>
    <
option>tren</option>
    <
option>monorrail</option>
    <
option>trolebus</option>
</
select
<
input type="button" onclick="eliminarUltimo()" value="eliminar el último" /> <br/>

<
table id="tabla" border="1" width="200px">
    <
thead>
        <
tr>
            <
th width="30px">#</th>
            
<th>Item</th>
        </
tr>
    </
thead>
    <
tbody>
    </
tbody>
</
table>


<
script>


var 
elementos=0;
function 
agregarALaTabla(item) {
    
// creamos filas y celdas, y las anidamos entre sí
    
var fila=document.createElement("TR");
    var 
celdaNum=document.createElement("TD");
    var 
celdaItem=document.createElement("TD");
    
fila.appendChild(celdaNum);
    
fila.appendChild(celdaItem);
    
// sumamos uno a elementos, y lo colocamos después
    
celdaNum.appendChilddocument.createTextNode(++elementos) );
    
// colocamos el item en la celda de al lado
    
celdaItem.appendChilddocument.createTextNode(item) );
    
// adjuntamos al tbody de la tabla
    
document.getElementById("tabla").getElementsByTagName("tbody")[0].appendChild(fila);
}

function 
eliminarUltimo() {
    if(
elementos==0)
        
alert("No hay elementos que borrar");
    else {
        var 
laTablaTbody=document.getElementById("tabla").getElementsByTagName("tbody")[0];
        
// borramos la fila (elementos-1) porque la primera fila es de información
        
laTablaTbody.removeChildlaTablaTbody.getElementsByTagName("TR")[elementos-1] );
        
elementos--;        //restamos a elementos uno, porque hay una fila menos
    
}
}

</script> 
Sólo un apunte: intenta no utilizar nombres de variables iguales a los ID's de los elementos en el documento (tabla), verás que en firefox salta una advertencia:
Cita:
Advertencia: Elemento referenciado por ID/NAME en el ámbito global. Use el estándar del W3C document.getElementById() en su lugar.

Cita:
Iniciado por dandreta
¿Sabeis que instrucción o que tendría que añadir y donde para que las opciones del desplegable que ya han sido seleccionadas no se puedan volver a añadir a la tabla?
Podrías "marcar" las opciones del select con un atributo inventado por ti. O también se me ocurre almacenar en un array las <option> agregadas, y mirar a ver si ha sido agregado esa opción, pero me parece un poco más lío esa alternativa.

El problema viene al eliminar de la tabla. Hay que decirle que sí puede agregar esa opción. Yo lo he resuelto relacionando las filas de la tabla y los índices del select mediante un atributo llamado queOpcionDelSelect, así resulta más sencillo:

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<
html>
<
head>
<
title></title>
<
meta name="Author" content="derkeNuke">
</
head>

<
body>


<
select id="sel" onchange="agregar()">
    <
option value="-">Seleccione por favor</option>
    <
option>casa</option>
    <
option>coche</option>
    <
option>avión</option>
    <
option>tren</option>
    <
option>monorrail</option>
    <
option>trolebus</option>
</
select
<
input type="button" onclick="eliminarUltimo()" value="eliminar el último" /> <br/>

<
table id="tabla" border="1" width="200px">
    <
thead>
        <
tr>
            <
th width="30px">#</th>
            
<th>Item</th>
        </
tr>
    </
thead>
    <
tbody>
    </
tbody>
</
table>


<
script>


var 
elementos=0;
var 
elSel=document.getElementById("sel");
var 
laTablaTbody=document.getElementById("tabla").getElementsByTagName("tbody")[0];

//devuelve true si debo agregar el elemento, false si no
function deboAgregar() {
    var 
opcion=elSel.options[elSel.options.selectedIndex];
    if ( 
opcion.value == '-' || opcion.getAttribute("estaAgregado") == "si" || opcion.getAttribute("estaAgregado") == "null" )
        return 
false;
    else
        return 
true;
}

function 
agregarALaTabla() {
    var 
index=elSel.options.selectedIndex;
    var 
opcion=elSel.options[index];
    var 
item=opcion.text;
    
// creamos filas y celdas, y las anidamos entre sí
    
var fila=document.createElement("TR");
    var 
celdaNum=document.createElement("TD");
    var 
celdaItem=document.createElement("TD");
    
fila.appendChild(celdaNum);
    
fila.appendChild(celdaItem);
    
// sumamos uno a elementos, y lo colocamos después
    
celdaNum.appendChilddocument.createTextNode(++elementos) );
    
// colocamos el item en la celda de al lado
    
celdaItem.appendChilddocument.createTextNode(item) );
    
// adjuntamos al tbody de la tabla
    
laTablaTbody.appendChild(fila);
    
// marcamos la opcion como agregada
    
opcion.setAttribute("estaAgregado","si");
    
// guardamos a qué index del select se refiere esta línea
    
fila.setAttribute("queOpcionDelSelect",index);
}

function 
agregar() {
    if(
deboAgregar()) 
        
agregarALaTabla(); 
    else 
        
alert('No agregaré elementos inválidos o duplicados.');
}

function 
eliminarUltimo() {
    if(
elementos==0)
        
alert("No hay elementos que borrar");
    else {
        
// borramos la fila (elementos-1) porque la primera fila es de información
        
var fila=laTablaTbody.getElementsByTagName("TR")[elementos-1];
        
// ¿a qué opción del elemento se refiere esta fila? Lo guardamos antes en un atributo llamado queOpcionDelSelect
        
var index=fila.getAttribute("queOpcionDelSelect");
        
// le decimos que no está agregado
        
elSel.getElementsByTagName("option")[index].setAttribute("estaAgregado","no");
        
laTablaTbody.removeChildfila );
        
elementos--;        //restamos a elementos uno, porque hay una fila menos
    
}
}

</script>

</body>
</html> 

Los he probado los dos en IE y en FF, y van bien.



Alguna duda más, comenta.

Un saludo!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.