Generar Capa

Soy Miguel Angel... Espero que no te asustes al ver que soy yo otra vez!
El caso es que mi pregunta esta vez se centra en lo que estoy haciendo, que a continuación te describo; a ver de que forma me sugieres que es mejor:
Imagina un formulario simple con varios Input Text y TextArea, que además contienen un botón para generar un formulario en una capa nueva, que se adjunta a continuación de la anterior, y así sucesivamente hasta n...
Lo voy a hacer con funciones de JavaScript, creando capas a partir de un patrón hecho con cadenas de texto, y dentro de ello llamadas aúna función javaScript para crear objetos, la misma que me enseñaste el otro día...
No estoy seguro de que sea la forma más elegante y eficiente, si tienes alguna sugerencioa de como crear estas capas mejor (en resumen <Table's con objetos de formulario en su interior). Soy todo oídos
Recibe un cordial saludo. Miguel.
Respuesta
1
A ver cómo lidiamos con esta.
Dependiendo de lo que quieras hacer, puede ser mucho más eficiente tener las capas creadas de antemano en el HTML. Esto funciona si sabes exactamente qué estructura tendrán los formularios (todos) los que quieras crear, y tiene la ventaja de funcionar prácticamente sin código añadido. Además, nada te impide cambiar sobre la marcha los valores de cajas de texto, combos...
Supón que tienes dos formularios, y uno de ellos sólo aparecerá al pulsar un botón en otro:
<form>
... Cosas del formulario ...
<input type="button" value="Mostrar siguiente" onClick="mostrarCapa('capa1')">
</form>
<div id="capa1" style="position:absolute;visibility:hidden">
<form>
... Cosas del otro formulario ...
</form>
</div>
La función mostrarCapa() puede ser algo muy estándar:
function mostrarCapa(idCapa) {
if (document.getElementById) document.getElementById(idCapa).style.visibility='visible';
else if (document.all) eval('document.all.'+idCapa+'.style.visibility="visible"');
else if (document.layers) document.layers[idCapa].visibility='show';
else alert('Su navegador no es compatible con esta página.');
}
La clave del asunto está en definir los formularios "dinámicos" normalmente, pero dentro de capas ocultas. Para que esto funcione correctamente en Netscape 4, deberías añadir información de posicionamiento al estilo de la capa, a tu gusto:
style="position:absolute;top:100;left:100;width:300;height:300;visibility:hidden"
... Por ejemplo.
La opción que me describes en tu mensaje es también factible, si nos olvidamos de Netscape 4. Recuerda que en este navegador no puedes alterar el contenido de la página una vez mostrada. Es decir, si intentas hacer un document. write() asociado a la pulsación de un botón, el resultado más probable es que la página se borre por completo, y quede sustituida por el argumento del document. write().
Además, suele ser muy incómodo generar HTML desde Javascript: es interesante evitarlo siempre que sea posible. El único caso en el que no sería posible es aquél en el que la estructura física de los nuevos formularios dependiera de los datos introducidos en los anteriores... Por ejemplo: un formulario que debe mostrar tantos campos de texto como indica el valor de otro campo de texto en su "padre".
Si eso es lo que tienes que hacer, buena suerte... Pero si lo más que necesitas es alterar la lista de OPTIONs de un SELECT dependiendo de datos anteriormente introducidos, te recomiendo que prepares los formularios de antemano, ya que las manipulaciones de este tipo no dependen de la estructura del formulario y pueden realizarse dinámicamente en todos los navegadores (incluyendo Netscape 4).
No dudes en preguntarme de nuevo si quieres seguir discutiendo el tema. Mientras tanto.
Lo que me comentas es muy bueno, pero, la cuestión es que en mi caso, ni las capas ni los formularios estarían creadas de antemano. Por otra parte creo que en Netscape se puede sobre escribir en el document de la siguiente forma te lo indiqco por si te puedo dar información o por si estoy equivocado: esta función sirve para ambos ns4 y ie4:
function layerWrite(id,nestref,text) {
if (ns4) {
if (nestref) var lyr = eval('document.'+nestref+'.document.'+id+'.document')
else var lyr = document.layers[id].document
lyr.open()
lyr.write(text)
lyr.close()
}
else if (ie4) document.all[id].innerHTML = text
}
Espero tus comentarios. Como siempre, muchas gracias!
Efectivamente, la función que das sirve para escribir dinámicamente en Netscape sin tocar el documento actual. Desgraciadamente, supone que ya existe la capa de nombre id. Es decir, que aunque crees dinámicamente los formularios, tienes que saber de antemano en qué capas vas a escribirlos.
Si vas a generar finalmente 3 formularios, y lo harás dinámicamente, necesitarás dos capas (y tienes que haberlas definido antes). Si sólo dispones de una, y llamas a la función layerWrite() con el mismo valor para id, borrarás el segundo formulario para escribir el tercero, con todo lo que implica (pérdida de valores).
Y si tienes que definir de antemano las capas... ¿qué importa si además hay que añadir los formularios? (A menos que tengas las limitaciones que te comentaba antes...) Si los formularios van a tener una estructura conocida "en tiempo de programación", generarlos dinámicamente es una molestia más que una ventaja.
Espero haberte ayudado a aclarar la cuestión. No dudes en seguir preguntándome si se te ocurren más cosas...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas