televisor que mucha menos mas herramientas google funciones energia enchufado electrodomesticos electricidad electrica consumen consume computador aparatos aparato apagados javascript html firefox-addon frames xulrunner

javascript - mucha - que aparatos consumen mas energia electrica



Detectar error al cargar contenido de un iframe (5)

Recientemente tuve este problema y tuve que recurrir a la configuración de una acción de búsqueda de Javascript en la página principal (que contiene la etiqueta IFRAME). Esta función de JavaScript comprueba el contenido de IFRAME para elementos explícitos que solo deberían existir en una respuesta BUENA. Esto supone, por supuesto, que no tiene que lidiar con la violación de la "misma política de origen".

En lugar de buscar todos los errores posibles que podrían generarse a partir de los muchos recursos de red diferentes, simplemente verifiqué los elementos positivos constantes que sé que deberían estar en una buena respuesta.

Después de un tiempo predeterminado y / o # de intentos fallidos para detectar el (los) Elemento (s) esperado (s), el JavaScript modifica el atributo SRC del IFRAME (para solicitar de mi Servlet) una Página de Error amigable en lugar de mostrar el típico mensaje HTTP ERROR . El JavaScript también podría modificar fácilmente el atributo SRC para hacer una solicitud completamente diferente.

function checkForContents(){ var contents=document.getElementById(''myiframe'').contentWindow.document if(contents){ alert(''found contents of myiframe:'' + contents); if(contents.documentElement){ if(contents.documentElement.innerHTML){ alert("Found contents: " +contents.documentElement.innerHTML); if(contents.documentElement.innerHTML.indexOf("FIND_ME") > -1){ openMediumWindow("woot.html", "mypopup"); } } } }

}

Puedo detectar cuándo se ha cargado el contenido de un iframe utilizando el evento de carga . Desafortunadamente, para mi propósito, hay dos problemas con esto:

  • Si hay un error al cargar la página (404/500, etc.), el evento de carga nunca se dispara.
  • Si algunas imágenes u otras dependencias no se pueden cargar, el evento de carga se dispara como de costumbre.

¿Hay alguna forma en que pueda determinar de manera confiable si ocurrió alguno de los errores anteriores?

Estoy escribiendo una aplicación semi-web semi-escritorio basada en Mozilla / XULRunner, por lo que las soluciones que solo funcionan en Mozilla son bienvenidas.


Creo que el evento de pageshow se activa para las páginas de error. O si está haciendo esto desde Chrome, revise la solicitud de su oyente de progreso para ver si se trata de un canal HTTP, en cuyo caso puede recuperar el código de estado.

En cuanto a las dependencias de página, creo que solo se puede hacer desde Chrome añadiendo un detector de eventos onerror, e incluso entonces solo encontrará errores en los elementos, no en fondos CSS u otras imágenes.


Tener una identificación para el elemento superior (cuerpo) en la página que se está cargando en su iframe.

en el controlador de carga de su iframe, verifique si getElementById () devuelve un valor no nulo. Si es así, iframe se ha cargado correctamente. de lo contrario, ha fallado.

en ese caso, ponga frame.src = "about: blank". Asegúrese de quitar el manejador de carga antes de hacer eso.


Si tiene control sobre la página iframe (y las páginas están en el mismo nombre de dominio), una estrategia podría ser la siguiente:

  • En el documento principal, inicialice una variable var iFrameLoaded = false;
  • Cuando se carga el documento de iframe, establezca esta variable en el padre a la true llamada desde el documento de iframe a la función de un padre (setIFrameLoaded(); por ejemplo).
  • revisa el indicador iFrameLoaded usando el objeto del timer (configura el temporizador a tu límite de tiempo de espera preferido): si el indicador sigue siendo falso, puedes decir que el iframe no se cargó regularmente.

Espero que esto ayude.


No responde su pregunta exactamente, pero mi búsqueda de una respuesta me trajo aquí, así que estoy publicando solo en caso de que alguien más me haya hecho una consulta similar.

No utiliza bastante un evento de carga, pero puede detectar si un sitio web es accesible e invocable (si lo es, entonces el iFrame, en teoría, debería cargarse).

Al principio, pensé en hacer una llamada AJAX como todos los demás, excepto que inicialmente no funcionó, ya que había usado jQuery. Funciona perfectamente si haces un XMLHttpRequest:

var url = http://url_to_test.com/ var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status != 200) { console.log("iframe failed to load"); } }; xhttp.open("GET", url, true); xhttp.send();

Editar:
Así que este método funciona bien, excepto que tiene muchos negativos falsos (recoge muchas cosas que se mostrarían en un iframe) debido a malarky de origen cruzado. La forma en que resolví esto fue hacer una solicitud CURL / Web en un servidor, y luego verificar los encabezados de respuesta para a) si el sitio web existe, yb) si los encabezados habían establecido x-frame-options .

Esto no es un problema si ejecuta su propio servidor web, ya que puede hacer su propia llamada de API.

Mi implementación en node.js:

app.get(''/iframetest'',function(req,res){ //Call using /iframetest?url=url - needs to be stripped of http:// or https:// var url = req.query.url; var request = require(''https'').request({host: url}, function(response){ //This does an https request - require(''http'') if you want to do a http request var headers = response.headers; if (typeof headers["x-frame-options"] != ''undefined'') { res.send(false); //Headers don''t allow iframe } else { res.send(true); //Headers don''t disallow iframe } }); request.on(''error'',function(e){ res.send(false); //website unavailable }); request.end(); });