Foros del Web » Programando para Internet » Javascript »

appendChild pero que lo coloque encima

Estas en el tema de appendChild pero que lo coloque encima en el foro de Javascript en Foros del Web. Hola, estoy montando un foro y uso appendChild para mostrar los nuevos mensajes. en lugar de q los mensajes aparezcan: 1 2 3 quiero q ...
  #1 (permalink)  
Antiguo 02/09/2010, 08:00
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
appendChild pero que lo coloque encima

Hola, estoy montando un foro y uso appendChild para mostrar los nuevos mensajes.

en lugar de q los mensajes aparezcan:

1
2
3

quiero q el último mensaje aparezca el primera (encima de todos como un montón), es decir:

3
2
1

con appendChild consigo lo primero pero no lo segundo, q hacer?
  #2 (permalink)  
Antiguo 02/09/2010, 08:16
 
Fecha de Ingreso: agosto-2010
Mensajes: 19
Antigüedad: 13 años, 7 meses
Puntos: 2
Respuesta: appendChild pero que lo coloque encima

Si obtienes los datos de un array ordenado, prueba a darle la vuelta al array y continúas con el mismo proceso.

En otro caso, mira a ver esto que te parece

http://bytes.com/topic/javascript/answers/819579-append-child-first-node
  #3 (permalink)  
Antiguo 02/09/2010, 08:38
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: appendChild pero que lo coloque encima

yo lo que hago es:

Código PHP:
Ver original
  1. <div id="nuevocomentario"></div>
Código Javascript:
Ver original
  1. var texto = document.createElement('div');
  2.  
  3. document.getElementById("nuevocomentario").appendChild(texto);


y el código que me aconsejas es:

Código Javascript:
Ver original
  1. var who=document.createElement('p');
  2. var pa= document.getElementsByTagName('div')[0];
  3.  
  4. if(pa.firstChild) pa.insertBefore(who,pa.firstChild);
  5. else pa.appendChild(who);

cómo puedo compatibilizar uno con otro?

Última edición por humanista; 02/09/2010 a las 09:05
  #4 (permalink)  
Antiguo 02/09/2010, 09:17
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: appendChild pero que lo coloque encima

tb he encontrado este código q no logro acoplar a mi caso particular:

Código Javascript:
Ver original
  1. <script type="text/javascript">
  2. <!--
  3. function f (nodo)
  4. {
  5. var newNodo=nodo.cloneNode(true);
  6.  
  7. newNodo.setAttribute("class", "rojo");
  8.  
  9. document.body.insertBefore(newNodo,nodo);
  10. }
  11. //-->
  12. </script>
  13.  
  14. <style type="text/css">
  15. <!--
  16. p {border: 1px solid black}
  17. p.rojo {background-color: red}
  18. -->
  19. </style>
  20.  
  21. </head>
  22. <body>
  23.  
  24. <p>El método <b>insertBefore</b>
  25. requiere dos argumentos: el nodo a
  26. insertar y el node de referencia
  27. (delante del cual se inserta el primero).
  28. <br>Si el nodo de referencia es
  29. <b>null</b> el primer nodo se inserta
  30. al final.</p>
  31.  
  32. <p onclick="f(this)">Observa como al
  33. pulsar el botón del ratón sobre este
  34. párrafo, un duplicado del mismo se
  35. añade delante de éste en el cuerpo del
  36. documento.</p>
  37.  
  38. <p>Para destacar el nuevo nodo
  39. (párrafo), éste se muestra de color rojo.
  40. </p>
  #5 (permalink)  
Antiguo 02/09/2010, 16:29
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: appendChild pero que lo coloque encima

Hola

Aquí tienes una adaptación que puede que te ayude
Código Javascript:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <script type="text/javascript">
  6. <!--
  7. var arr = ['mensaje 1', 'mensaje 2', 'mensaje 3'];
  8. function f (){
  9. var divmsg = document.getElementById('mensajes');
  10.  
  11. for (var i = 0; i < 3; i++) {
  12. donde = document.getElementById('p'+parseInt(i-1))
  13.  
  14. var nodo = document.createElement('p');
  15. nodo.setAttribute("class", "rojo"+i);
  16. nodo.setAttribute('id', 'p'+i);
  17. nodo.innerHTML = arr[i];
  18.  
  19. if (divmsg.getElementsByTagName('p').length == 0) {
  20. divmsg.appendChild(nodo);
  21. } else {
  22. divmsg.insertBefore(nodo, donde);
  23. }
  24. }
  25. }
  26. //-->
  27. </script>
  28.  
  29. <style type="text/css">
  30. <!--
  31. p {border: 1px solid black}
  32. p.rojo0 {background-color: red}
  33. p.rojo1 {background-color: green}
  34. p.rojo2 {background-color: yellow}
  35. -->
  36. </style>
  37.  
  38. </head>
  39. <body>
  40. <div id="mensajes"></div>
  41.  
  42. <input type="button" value="Mensajes" onclick="f();" />
  43. </body>
  44. </html>
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #6 (permalink)  
Antiguo 02/09/2010, 18:08
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: appendChild pero que lo coloque encima

segun lo que entiendo, basicamente lo que quieres hacer es invertir el orden de los nodos. he aqui un codigo que escribi usando la idea de invertir el orden. le pasas como argumento la referencia del elemento padre de los elementos que quieres invertir. para que funcione correctamente, se asume que todos los mensajes estan presentes en el DOM y tienen el mismo padre. fijate que no solo va afectar los mensajes si no a todos los elementos del mismo nivel.
Código:
function invertNodes(element){
for(var last = element.lastChild; last.previousSibling; element.appendChild(last.previousSibling));
}
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #7 (permalink)  
Antiguo 03/09/2010, 03:05
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: appendChild pero que lo coloque encima

ok, gracias. al final he encontrado una solución creo q más sencilla pero me da problema, no logro depurarla al máximo.

primero tengo:

Código HTML:
Ver original
  1. <div id="nuevocomentario"></div>

y luego mediante una función en AJAX con la que le paso la varibale texto:

Código Javascript:
Ver original
  1. var parrafo = document.createElement('div');
  2. parrafo.appendChild(document.createTextNode(texto));
  3. var elementoReferencia = document.getElementById('nuevocomentario').getElementsByTagName('div')[0];
  4. document.getElementById('nuevocomentario').insertBefore(parrafo,elementoReferencia);
me coloca el texto con el insertBefore justo encima, tal y como deseo, el problema es que si por ejemplo:

Código Javascript:
Ver original
  1. var texto='<font size=5>Mi texto</font>';

me saca en pantalla tal cual
Código HTML:
Ver original
  1. <font size=5>Mi texto</font>
y no Mi texto con tamaño 5. es decir toda la variable texto para él es eso, texto, no html.

cómo podría solucionarlo?

creo q debería usar innerHTML pero no logro saber dónde o cómo...

Última edición por humanista; 03/09/2010 a las 04:50
  #8 (permalink)  
Antiguo 03/09/2010, 05:02
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: appendChild pero que lo coloque encima

tal 1000 y 1 pruebas, lo conseguí!!!

tan sólo tenía q añadir:

parrafo.innerHTML = texto;

después de:

parrafo.appendChild(document.createTextNode(texto) );

por si a alguien le sirve

gracias a todosss
  #9 (permalink)  
Antiguo 03/09/2010, 05:35
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: appendChild pero que lo coloque encima

aggggr, mi gozo -por ahora- en un pozo.

lo he probado en Chrome, Mozilla, Opera y Safari y me va bien pero... una vez más el maldito IE da problemas. Me sale el error: "Argumento no válido" en la última línea.

os pego el código:

Código Javascript:
Ver original
  1. var texto="";
  2.    
  3.         var parrafo = document.createElement('div');
  4.  
  5.         texto+= '<table border=0 cellpadding=0 cellspacing=0>';
  6.         texto+= '<tr><td>mi texto</td></tr>';
  7.                 texto+= '</table>';
  8.  
  9.         parrafo.appendChild(document.createTextNode(texto));
  10.         parrafo.innerHTML = texto;
  11.         var elementoReferencia = document.getElementById('nuevocomentario').getElementsByTagName('div')[0];
  12.             document.getElementById('nuevocomentario').insertBefore(parrafo,elementoReferencia);
  #10 (permalink)  
Antiguo 03/09/2010, 07:02
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 3 meses
Puntos: 126
Respuesta: appendChild pero que lo coloque encima

Hola

Prueba suministrando una id
Cita:
parrafo.setAttribute('id', 'p');
Ahora la variable elementoReferencia quedaría así
Cita:
var elementoReferencia = document.getElementById('p');
Como supongo que has de crear mas elementos, aplica parte del código que te imprimí en post anteriores. De cualquier modo, no me gusta demasiado ese código
¿Has probado la función de @zerokilled? Tiene buena pinta
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #11 (permalink)  
Antiguo 03/09/2010, 09:00
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: appendChild pero que lo coloque encima

me funciona perfecto Adler!!!, muchas gracias

Etiquetas: encima
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:47.