Ver Mensaje Individual
  #15 (permalink)  
Antiguo 25/08/2008, 05:54
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
Respuesta: Poner <input type="text" en diferentes partes al pulsar un botón

Hola caricatos!

Gracias por traernos esa funcioncilla, es verdad que nos quedamos con esa. Aunque me parece que hace lo mismo así (así lo verás mejor scorm):
Código PHP:
function insertAfter(nodoelemento) {
    if( 
elemento.nextSibling )    // Si tiene hermano siguiente. Es lo mismo que mirar a ver si es el último: (elemento.parentNode.lastChild == elemento) de la de caricatos
        
elemento.parentNode.insertBefore(nodoelemento.nextSibling);
    else
        
elemento.parentNode.appendChild(nodo);

En Firefox hay error porque también cuenta los nodos de texto como nodos. Así que al hacer nextSibling podemos estar cogiendo una tabulación, que evidentemente no tiene propiedad style al ser nodo HTML. Para que nos entendamos: Sería como un nodo creado con document.createTextNode().

Se soluciona así (o como has posteado tú mientras yo escribía, lo mismo da):
Código PHP:
while( (despuesDe.nextSibling) && (despuesDe.nextSibling.nodeType===1) && (parseInt(despuesDe.nextSibling.style.marginLeft) || 0) >= nuevoMargen )     // Menudo while! 
La función borrar tiene más tema del que parece, porque supongo que cuando borres una caja que contiene "hijos" tendrás que borrar también todos esos "hijos" ¿no? (Bueno, y nietos... y todo lo que "cuelgue" de ella). Hay que volver a hallar la jerarquía. El while será básicamente el mismo, sólo que no podemos ejecutar la acción de borrar dentro del while, tendremos que almacenar los nodos descendientes y borrarlos después:
Código PHP:
function borrar(btnBorrar) {
    var 
nuestroDiv descendiente btnBorrar.parentNode

    
// hallemos todos los nodos descendientes (hijos, nietos...) del actual
    
var margenMayor = (parseInt(nuestroDiv.style.marginLeft) || 0) + 2;
    var 
descendientes = [];
    while( 
        (
descendiente descendiente.nextSibling) &&                                // si tiene hermano siguiente
        
(descendiente.nodeType===1) &&                                                // si el hermano siguiente es tipo 1 (nodo HTML)
        
((parseInt(descendiente.style.marginLeft) || 0) >= margenMayor) ) {            // si el hermano siguiente está identado con respecto a nuestroDiv
            
descendientes.push(descendiente);                                            // lo añadimos a la lista para borrarlo
    
}

    
// eliminémoslos
    
for(var i=descendientes.lengthi--; ) 
        
descendientes[i].parentNode.removeChild(descendientes[i]);

    
// eliminemos el actual
    
nuestroDiv.parentNode.removeChild(nuestroDiv); // 10

Código PHP:
<button type="button" name="div" onclick="borrar(this)">borrar</button
Bien lo podríamos haber puesto todo en un whale-while:
Código PHP:
    while( (descendiente descendiente.nextSibling) && (descendiente.nodeType===1) && ((parseInt(descendiente.style.marginLeft) || 0) >= margenMayor) && (descendientes.push(descendiente)) ); 
Pero aunque parezca mentira, me gusta la legibilidad. Sólo que en este caso no he encontrado manera de escribirlo de manera más fácil (enrevesado que llega a ser uno).

Así lo he resuelto bien tanto el FF3 como en IE6. No sé si va funcionando en IE7, espero que sí. No estaría mal meter un confirm() ya que cuando borremos esos datos no tendremos manera de recuperarlos (me ha pasado en pruebas y me fastidiaría bastante en una página real).

También me he dado cuenta de que el valor de las cajas creadas es el mismo que el valor de la primera que insertamos. No sé si será consecuencia de los atributos id y name, pero sería bueno reiniciar el value por si acaso.



Creo que ahora sólo queda ocuparnos de los atributos id y name y probarlo a ver si se envía correctamente ¿no? ¿Qué más te gustaría hacer?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.