No contesta 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ó para mí, ya que había usado jQuery. Funciona perfectamente si lo hace 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 una gran cantidad de falsos negativos (recoge una gran cantidad de cosas que mostrar en un iframe) debido a origen cruzado malarky. 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 api para ello.
Mi aplicació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();
});
1) ¿Por qué molestarse añadir JavaScript a la página de iframe? Podría utilizar setTimeout tan fácilmente junto con el evento de carga. 2) Esto no detecta de manera confiable si falla la carga o por qué, solo si tiene éxito dentro de un límite de tiempo. 3) No detecta el caso donde las dependencias de página no se cargan. –
Se cargarán diferentes recursos en diferentes marcos de tiempo. Esa imprevisibilidad matará a su enfoque Daniel Cassidy, ya que tendrá que permitir un tiempo de espera razonablemente largo. Mientras tanto, los errores de carga de corta duración simplemente se mantendrán en la pantalla hasta que el temporizador asuma que el recurso no se pudo cargar y maneja el error. – seebiscuit