2011-12-25 11 views
5

He estado haciendo una página web que utiliza una especie de ... encuesta externa. Me preguntaba si al usar el método window.open, ¿puedes decir si tu nueva ventana tuvo un 404 o la página agotó el tiempo de espera para intentar cargar?window.open ... ¿Una forma de saber si la ventana tenía un tiempo de espera o 404?

Esto es lo que tengo hasta ahora:

child = window.open(href, 'window'); 
     setTimeout(function() { 
      // Do some backend processing if child window is still open and no 404/timeout 
     }, 10000); 
+0

es la ventana emergente dentro del mismo dominio y ¿tiene usted control sobre su contenido? – sled

+0

No, la nueva ventana será una URL externa y no tendrá control sobre el contenido – Wilson212

Respuesta

1

Eso es algo bastante difícil de hacer. Tienes que lidiar con problemas de seguridad (el acceso de dominio cruzado está prohibido en JS). Pero creo que esta función puede hacer el truco:

child = window.open(href, 'window'); 
     setTimeout(function() { 
      try { 
       var foo = child.location; 
      } 
      catch (err) { 
       // It has loaded. Manage that. 
       return; 
      } 
      // Still loading. Code here. 
      } 
     }, 10000); 

Explicación: tratar de acceder al elemento location de la ventana secundaria. Si la ventana se ha cargado, intentar acceder arrojará una excepción (se prohíbe el acceso JS de dominios cruzados) para que pueda gestionarlo. Pero si puede acceder a la ubicación que probablemente significará que aún se está cargando.

El problema principal es que, con este código, solo se puede distinguir cuándo se está cargando o no, así que supongo que solo se puede verificar el tiempo de espera. Creo que comprobar el error 404 es casi imposible ya que las restricciones de seguridad de JS no le permiten obtener la ubicación o el contenido de una página externa.

1

Tener un vistazo a las peticiones Ajax entre dominios:

http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

Hay algunas maneras que usted podría emplearlo en función de cómo el sitio remoto está estructurado, pero como mínimo puede verificar que la página exista antes de abrir la ventana emergente (aunque esto no garantiza que se cargue en la ventana emergente).

Alternativamente, haga que la ventana emergente cargue una secuencia de comandos local (php, etc.) que primero hace una llamada u otra verificación remota ... haga que verifique los encabezados devueltos, y luego - si todo está bien - envía encabezados para reenviar al sitio remoto. Si se devuelve un código de error, entonces tiene la ventana emergente cargar una página local html/js que tiene una secuencia de comandos que puede hablar a la ventana de apertura para hacerle saber que falló.

Cuestiones relacionadas