El código funciona bien, lo que pasa es que está haciendo exactamente lo que tú le has dicho. Es decir, en ningún sitio pones que se quite el nodo.
La función reafirma() crea un nodo <p> nuevo y lo inserta. Si la vuelves a llamar, pues crea otro y lo inserta. si lo llamas otra, pues otro nodo más. Pero en ningún sitio estás borrando los nodos.
Una forma de hacerlo bien es:
1. Bajo el campo email, junto al campo email, sobre el campo email, donde sea, pones un div invisible con el contenido ya como quieres que aparezca. p.ej.:
Código HTML:
<input id="email" ... />
<div id="errorEmail" style="visibility:none; color: red; weight: bold; font-size: 70%">Email no válido</div>
2. En lugar de crear el nodo, lo único que haces es mostrarlo:
Código:
document.getElementById("errorMail").style.visibility = "block";
3. Pero si está bien, lo escondes:
Código:
document.getElementById("errorMail").style.visibility = "none";
Otra opción, si quieres crear el nodo como lo estás haciendo:
1. Lo dejas como lo tienes, pero al principio de la función de validación, eliminas el nodo usando elemento.removeChild(hijoABorrar).
O también puedes, tener un nodo vacío desde el principio, y hacer un replaceChild(nodoNuevo, nodoViejo) para sustituir el nodo en lugar de insertarlo nuevo.
Eso sí, lo hagas como lo hagas, yo que tú no usaría referencias como... document.body.getElementsByTagName("p")
[0]. Si quieres buscar un sitio concreto donde insertar un aviso así, mete en el HTML un contenedor identificado con un id concreto y búscalo con getElementById("errores"). ¿Por qué? Porque ¿qué ocurrirá cuando luego modifiques tu página y metas otro párrafo al principio? que el aviso saldrá en otro lado.
Básicamente estás diciendo "dame el primer <p> que encuentres" pero eso puede variar más fácilmente que si dices "dame el <p> (o el <div> o el <span> o lo que sea)
que se llame errores". Si le das un nombre, y luego lo buscas con ese nombre, siempre insertarás el aviso en ese elemento. Mientras que si buscas "el primer <p>" puede cambiar si luego añades otros párrafos.