none
Problema con Internet Explorer al abrir y cerrar ventanas repetidamente RRS feed

  • Pregunta

  • Hola.

     

    Tengo un problema con una aplicación web.

     

    La aplicación tiene una serie de registros que se pueden visualizar en una ficha. Es decir, tengo una pantalla de búsquedas con tabla de resultados, y el enlace típico de "abrir", que hace un window.open y carga la ficha detallada.

     

    El problema es el siguiente: cuando repito varias veces la secuencia de abrir y cerrar fichas (p.e. 6-10 veces), llega un momento en el que deja de funcionar la aplicación. En concreto, lo que ocurre es que esa sesión de internet explorer se queda como "congelada" contra la aplicación:

    • al abrir una ficha, se muestra una página en blanco
    • al cerrarla y volver a la página padre, ésta tampoco responde a los botones, ni a actualizar (F5)
    • en la barra de estado, donde se muestra la dirección y el progreso de carga, no muestra nada

    No encuentro información.

     

    Gracias.

    viernes, 11 de julio de 2008 7:47

Respuestas

  •  

    Gracias por tu respuesta.

     

    Finalmente logramos identificar el problema. Estaba más relacionado con el hecho de cerrar que con el de abrir. En el evento onbeforeunload preguntamos al usuario que confirme que quiere cerrar, y en el onunload ejecutamos una llamada ajax al servidor y luego cerramos.

     

    Hemos identificado que, en Mozilla, esa llamada Ajax no se completa, ya que el window.close() la corta, pero en explorer sí se ejecuta. Sin embargo, en ocasiones provoca ese cuelgue.

     

    Lo hemo solucionado haciendo que la llamada ajax se realice en la ventana padre, no en la que se está cerrando. Algo de este tipo:

     

    if(window.attachEvent) {
       window.attachEvent("onunload", cerrarVentana);
    } else {
       if(window.addEventListener) {
          window.addEventListener("unload", cerrarVentana, false);
       } else {
          window.onunload = cerrarVentana;
       }
    }

     

    window.onbeforeunload = function(e) { 
      if (modificado=="si" && BotonGuardar=="no"  && salya=="no") {
        salya="si";     
        return "Los cambios que no se hayan guardado se perderán.";     
      } 
    };

    function cerrarVentana()
    {
     if(BotonGuardar=="no")
     {
      window.opener.desBloqueaGrupo('<%=idGrupo %>');  

      // en lugar de desBloqueaGrupo('<%=idGrupo %>')
     }
    }

     

    function desBloqueaGrupo(id)
    {
     var t = new Date();
     var url = "desbloqueoPrivatePlan.do?idGrupo="+id+"&t="+t.getTime();
     new Ajax.Request(url, {
      method: 'get',
      onSuccess: function(transport) {
       //alert(transport.responseText);
      },
      onComplete: function(transport) {
       //alert(transport.responseText);
      },
      onFailure: function(transport) {
       //alert("Ha habido un error de comunicación:<br/>"+transport.responseText);
      }
     });
     //clearTimeout(idBloqueo);
    }

     

    La función desBloqueaGrupo la tenemos definida en la ventana padre. El error se producía cuando esta función estaba definida en la propia ventana

    jueves, 7 de agosto de 2008 11:17

Todas las respuestas

  •  

    Buenas,

     

    en principio por lo que comentas no debe ser problema del javascript que ejecutas para abrir la ventana. Si te recomiendo que le asignes un nombre a la ventana que abre (es el segundo parametro del window.open), de esta manera si ya existe la ventana, el nuevo contenido lo carga en la misma y no abre una nueva.

     

    Si el problema es que la aplicación se queda "tiesa" el problema podría venir por algun objeto que se quede abierto o que está haciendo algo después de mostrarte el contenido. En repetidas ejecuciones, como tu comentas de 6 a 10 puede reducir el rendimiento por seguir creciendo hasta llegar a colgarse.

     

    jueves, 7 de agosto de 2008 11:04
  •  

    Gracias por tu respuesta.

     

    Finalmente logramos identificar el problema. Estaba más relacionado con el hecho de cerrar que con el de abrir. En el evento onbeforeunload preguntamos al usuario que confirme que quiere cerrar, y en el onunload ejecutamos una llamada ajax al servidor y luego cerramos.

     

    Hemos identificado que, en Mozilla, esa llamada Ajax no se completa, ya que el window.close() la corta, pero en explorer sí se ejecuta. Sin embargo, en ocasiones provoca ese cuelgue.

     

    Lo hemo solucionado haciendo que la llamada ajax se realice en la ventana padre, no en la que se está cerrando. Algo de este tipo:

     

    if(window.attachEvent) {
       window.attachEvent("onunload", cerrarVentana);
    } else {
       if(window.addEventListener) {
          window.addEventListener("unload", cerrarVentana, false);
       } else {
          window.onunload = cerrarVentana;
       }
    }

     

    window.onbeforeunload = function(e) { 
      if (modificado=="si" && BotonGuardar=="no"  && salya=="no") {
        salya="si";     
        return "Los cambios que no se hayan guardado se perderán.";     
      } 
    };

    function cerrarVentana()
    {
     if(BotonGuardar=="no")
     {
      window.opener.desBloqueaGrupo('<%=idGrupo %>');  

      // en lugar de desBloqueaGrupo('<%=idGrupo %>')
     }
    }

     

    function desBloqueaGrupo(id)
    {
     var t = new Date();
     var url = "desbloqueoPrivatePlan.do?idGrupo="+id+"&t="+t.getTime();
     new Ajax.Request(url, {
      method: 'get',
      onSuccess: function(transport) {
       //alert(transport.responseText);
      },
      onComplete: function(transport) {
       //alert(transport.responseText);
      },
      onFailure: function(transport) {
       //alert("Ha habido un error de comunicación:<br/>"+transport.responseText);
      }
     });
     //clearTimeout(idBloqueo);
    }

     

    La función desBloqueaGrupo la tenemos definida en la ventana padre. El error se producía cuando esta función estaba definida en la propia ventana

    jueves, 7 de agosto de 2008 11:17