2008-12-15 8 views
6

considerar dos páginas web con el siguiente en su cuerpo, respectivamente:document.write() frente a la inserción de nodos DOM: ¿conserva la información del formulario?

<body> 
<script> 
document.writeln('<textarea></textarea>') 
</script> 
</body> 

y

<body> 
<script> 
var t = document.createElement('textarea'); 
document.body.appendChild(t); 
</script> 
</body> 

(pensar en ellos como parte de algo más grande, donde las áreas de texto tienen que se generan a partir de JavaScript y no puede ser codificado en la página). Ambos producen la misma producción, pero la primera se considera "mala", mientras que la segunda se considera la forma "correcta" de hacerlo. (¿No?)

Por otro lado, si escribe algo en la página y luego lo actualiza, o va a otro lugar y pulsa Atrás, en el primer caso, se conserva lo que escribió en el área de texto, mientras en el último se pierde. (Al menos en Firefox.)

¿Hay alguna manera de utilizar el último método y aún tener la útil función de que lo que el usuario ha escrito en un formulario se guarde incluso si accidentalmente pulsan actualizar o regresan a través del botón Atrás? (al menos en Firefox)?

+0

he intentado añadir un identificador y el nombre y no sirvió de nada. Puedo hacer que desaparezca de ambos si utilizo insertBefore (t, document.body.firstChild) en su lugar. – some

+0

Lo que es molesto es que la preservación del trabajo del usuario debe ser la * predeterminada * en cualquier navegador bueno, no algo que solo funcione con hacks no estándar. – ShreevatsaR

Respuesta

5

Creo que la versión document.write realmente destruye un contenido existente en la página. Es decir, las etiquetas de cuerpo y guión ya no estarán allí. Es por eso que las personas generalmente usan appendChild.

Mantener el texto o no es muy específico del navegador. No apostaría a que Firefox tampoco cambiaría su comportamiento en una versión futura. Sugeriría implementar un diálogo de alerta cuando el usuario intente navegar fuera de la página y no haya contenido guardado en los campos de edición. Usualmente harías esto con un evento de descarga.

+0

No, eso no es cierto. document.write() se agregará felizmente al contenido existente en la página. – ShreevatsaR

+2

En realidad, lo hará si no está en la carga inicial de la página. Si lo haces más tarde, di que cuando regrese una llamada Ajax, borrará la página. –

+0

Chase Seibert tiene la razón de que borrará la página si se invoca después de que la página se haya cargado. – some

0

¿Sería posible para usted agregar un gancho que podría usar para apuntar al nuevo textarea? p.ej. un <div>

<div id="addtextarea"></div> 

var e = document.getElementByID('addtextarea'); 
e.innerHTML = '<textarea></textarea>'; 

Entonces, si usted necesita para recordar los contenidos que se pueden tomar ya sea el valor innerHTML para incluir el código HTML o simplemente el valor del nodo de texto del área de texto para extraer el texto.

4

document.write() no eliminará el contenido de la página siempre que se ejecute en línea a medida que se procesa la página. La publicidad en línea hace un uso extenso de document.write() para escribir anuncios dinámicamente en la página a medida que se carga.

Sin embargo, si ejecutó el método document.write() más adelante en el historial de la página (después de que el cuerpo está completamente renderizado), como dice Chase, soplaría el cuerpo existente y mostraría el argumento al documento .escribir().

Aparte de eso, estoy de acuerdo en que el comportamiento de las formas de preservación es realmente bastante específico para el navegador, y no es algo en lo que deba confiar en muchos casos. Es una función allí para ayudar al usuario en lugar de ser algo que los desarrolladores deben conocer o intentar utilizar.

0

Normalmente, prefiero crear un elemento DOM e insertarlo, especialmente porque puedo insertarlo exactamente donde quiero en la página (es decir, usar object.appendChild o body.appendChild). Tampoco importa si la inserción es durante la carga de la página o más tarde, así que puedo usar una función de inserción generalizada y usarla en cualquier momento, durante o después de la carga de la página completa.

Sin embargo, durante el proceso de carga, si está insertando contenido que incluye javascript (es decir, una secuencia de SCRIPT tipo = "texto/javascvript" ......./SCRIPT), DEBE usar el documento.escribir para que el script se ejecute.

  • Usando document.body.appendChild (theInsertionObject) será adecuadamente añadir la inserción en el punto actual en el proceso de carga incluyendo la secuencia etiqueta SCRIPT, pero no va a ejecutar el javascript.

  • Si utiliza document.write (theInsertionCode), el código será insertado en el punto actual en el proceso de carga, y cualquier secuencia de etiqueta incrustado SCRIPT se ejecutarán antes de que el resto de la página se carga .

Cuestiones relacionadas