Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/05/2008, 08:54
Avatar de mgusdl
mgusdl
 
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 7 meses
Puntos: 5
Refrescar objetos DOM

Muy buenas!!
Hoy necesito inspiración, y como no existen los dioses, pues recurro al foro!

Bueno, la cosa es que tengo un formulario normal y corriente con el perfil de usuario y para cambiar la clave pues he creado un panel div con otro formulario. La cosa funciona teta teta hasta que la pruebo en el IE, donde al darle a enviar salta con que no reconoce el objeto y por supuesto no recibo los objetos para validar con la función "cambiarClave()"

El código JS para generar el panel es el siguiente:
Código PHP:
function chClave()
    {
    var 
ident 'clave';
    if (
document.getElementById(ident)) return;
    var 
elmRef document.getElementById('btcl');
    var 
dv document.createElement('div');
    
dv.id ident;
    
dv.className 'ventana centrar';
    
dv.style.width '300px';
    
dv.style.height '200px';
    
dv.style.left = (elmRef.offsetLeft 30) + 'px';
    
dv.style.top = (elmRef.offsetTop 30) + 'px';
    
    var 
sp document.createElement('span');
    
sp.onclick = function() { cerrar(ident); }
    
sp.className 'cerrar';
    
sp.appendChild(document.createTextNode("X"));
    
dv.appendChild(sp);
    
    var 
cabeza document.createElement('div');
    
cabeza.className 'cabeza';
    
cabeza.onmousedown = function (evt) { dragStart(evt || window.eventident); }
    
cabeza.appendChild(document.createTextNode('Cambiar clave'));
    
dv.appendChild(cabeza);

    
dv.appendChild(document.createElement('br'));
    
    var 
frm document.createElement('form');
    
frm.onsubmit = function () { return cambiarClave(); }
    
frm.name 'cambiaclave';
    
frm.action '#';
    
frm.method 'post';

    var 
campo document.createElement('input');
    
campo.type 'hidden';
    
campo.name 'formulario';
    
campo.value'chclave';
    
frm.appendChild(campo);

    var 
campo document.createElement('input');
    
campo.type 'hidden';
    
campo.name 'go';
    
campo.value'do=inicio&sub=configura';
    
frm.appendChild(campo);

    var 
lbl document.createElement('label');
    
lbl.setAttribute('for''clav');
    
lbl.appendChild(document.createTextNode('clave actual:'));
    
frm.appendChild(lbl);

    
campo document.createElement('input');
    
campo.type 'password';
    
campo.name 'clav';
    
campo.id 'clav';
    
frm.appendChild(campo);

    
frm.appendChild(document.createElement('br'));
    
frm.appendChild(document.createElement('br'));
    
    
lbl document.createElement('label');
    
lbl.setAttribute('for''cln1');
    
lbl.appendChild(document.createTextNode('clave nueva:'));
    
frm.appendChild(lbl);

    
campo document.createElement('input');
    
campo.type 'password';
    
campo.name 'cln1';
    
campo.id 'cln1';
    
frm.appendChild(campo);
    
    
frm.appendChild(document.createElement('br'));
    
frm.appendChild(document.createElement('br'));
    
    
lbl document.createElement('label');
    
lbl.setAttribute('for''cln2');
    
lbl.appendChild(document.createTextNode('repita la clave:'));
    
frm.appendChild(lbl);

    
campo document.createElement('input');
    
campo.type 'password';
    
campo.name 'cln2';
    
campo.id 'cln2';
    
frm.appendChild(campo);

    
frm.appendChild(document.createElement('br'));
    
frm.appendChild(document.createElement('br'));

    var 
btn document.createElement('input');
    
btn.type 'submit';
    
btn.value 'cambiar';
    
frm.appendChild(btn);

    
dv.appendChild(frm);

    
document.body.appendChild(dv);
    }

function 
cambiarClave()
    {
    var 
frm document.forms.cambiaclave;
    var 
error '';
    if (
frm.clav.value == '' || frm.cln1.value == '' || frm.cln2.value == ''error += "\n - Queda al menos un campo sin rellenar";
    else if (
frm.cln1.value != frm.cln2.valueerror += "\n - Las claves no coinciden";
    if (
error != '') { alert('Se preodujeron los siguientes errores:' error); return false; }
    return 
true;
    } 
El aspecto resultante del panel es el siguiente:


Obviamente el problema es que IE no actualiza la biblioteca de objetos DOM al crear los elementos y envía el formulario sin los datos (manda huevos). En otros navegadores si funciona como debe, ejecutando sin problemas la función llamada en el evento onSubmit.

Lo mismo el problema es de mi navegador (en este momento aún no he probado en otro equipo) y estoy buscando un parche para IE que salió hace unos meses para probar.
También me gustaría saber si existe algún metodo para obligar al navegador a refrescar la biblioteca de objetos DOM.

Bueno, a ver si sabeis algo!
Hagan sus apuestas!!

Gracias y salu2

Última edición por mgusdl; 12/05/2008 a las 09:09 Razón: errores en la descripcion del error