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(nodo, elemento) {
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(nodo, elemento.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.length; i--; )
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?