Détecter l'échec de charger le contenu d'une iframe
Je peut détecter lorsque le contenu d'une iframe est chargé à l'aide de la charge événement. Malheureusement, pour ma part, il y a deux problèmes:
- Si il y a une erreur de chargement de la page (404/500, etc), la charge de l'événement n'est jamais déclenché.
- Si certaines images ou d'autres dépendances a échoué à la charge, la charge de l'événement est déclenché, comme d'habitude.
Est-il un moyen pour que je puisse déterminer de manière fiable si l'une des erreurs ci-dessus s'est produite?
Je suis en train d'écrire un semi-web semi-application de bureau basé sur Mozilla/XULRunner, par conséquent, des solutions qui ne fonctionnent que dans Mozilla sont les bienvenus.
Vous devez vous connecter pour publier un commentaire.
Si vous avez le contrôle sur l'iframe de la page (et les pages sont sur le même nom de domaine), une stratégie pourrait être comme suit:
var iFrameLoaded = false;
true
l'appel de l'iframe document d'un parent fonction(setIFrameLoaded();
par exemple).iFrameLoaded
indicateur à l'aide de latimer
objet (réglage de la minuterie de votre choix, délai limite) - si le drapeau est toujours faux, vous pouvez dire que l'iframe n'a pas été régulièrement chargé.J'espère que cette aide.
J'ai eu ce problème récemment et ont dû recourir à la mise en place d'un Javascript Interrogation sur la Page Parent (qui contient la balise IFRAME). Cette fonction JavaScript vérifie l'IFRAME du contenu explicite des éléments qui ne devrait exister que dans une BONNE réponse. Cela suppose bien sûr que vous n'avez pas à traiter avec la violation de la "même origine."
Au lieu de vérifier toutes les erreurs possibles qui pourraient être générés à partir de différentes ressources du réseau.. j'ai simplement vérifié pour une constante positive Élément(s) que je sais que devrait être une bonne réponse.
Après une pré-déterminé de temps et/ou n ° de tentatives infructueuses pour détecter les attendus Élément(s), le JavaScript modifie l'attribut SRC de l'IFRAME (à la demande de ma Servlet) une interface Utilisateur Conviviale Page d'Erreur par opposition à l'affichage de la typique message d'ERREUR HTTP. Le JavaScript pourrait tout aussi facilement modifier l'attribut SRC pour faire un tout autre demande.
}
Je pense que le pageshow événement est déclenché pour les pages d'erreur. Ou si vous faites cela à partir de chrome, puis votre vérifier vos progrès de l'auditeur demande à voir si c'est un canal HTTP dans ce cas, vous pouvez récupérer le code d'état.
Comme pour la page dépendances, je pense que vous ne pouvez le faire à partir de chrome par l'ajout d'une capture d'événement onerror à l'écoute, et même alors, elle ne pourra trouver les erreurs dans les éléments, pas de CSS, de milieux ou d'autres images.
C'est un très réponse tardive, mais je vais laisser à quelqu'un qui en a besoin.
Tâche: charge de l'iframe de la croix-origine du contenu, émettent
onLoaded
sur la réussite et l'onError
sur erreur de chargement.C'est la plupart des navigateurs origine indépendants solution que j'ai pu développer. Mais tout d'abord je vais raconter brièvement sur d'autres approches que j'avais et pourquoi ils sont mauvais.
1. iframe Que c'était un peu un choc pour moi, qui iframe seulement a
onload
événement et il est appelé sur la charge et sur l'erreur, aucun moyen de le savoir est une erreur ou pas.2. les performances.getEntriesByType ("ressource"). Cette méthode retourne chargé des ressources. Sonne comme ce que nous avons besoin. Mais quelle honte, firefox ajoute toujours de la Ressource en ressources tableau pas de question, il est chargé ou pas. Aucun moyen de savoir par
Resource
avait du succès. Comme à l'habitude. Par ailleurs, cette méthode ne fonctionne pas sous ios<11.3. script j'ai essayé de charger html à l'aide de
<script>
tag. Émetonload
etonerror
correctement, malheureusement, seulement dans le Chrome.Et quand j'ai été prêt à tout abandonner, mon ancien collègue m'a dit à propos de html4 tag
<object>
. C'est comme<iframe>
balise sauf qu'il y a de base lorsque le contenu n'est pas chargé. Cela ressemble à ce que nous avons besoin! Malheureusement, il n'est pas aussi facile qu'il y paraît.SECTION DE CODE
Après cela, nous pouvons définir certains attributs de
<object>
comme nous l'aurions voulu faire aveciframe
. La seule différence, nous devons utiliser<params>
, pas les attributs, mais leurs noms et les valeurs sont identiques.Maintenant, la partie la plus difficile. Comme beaucoup même-comme les éléments,
<object>
n'a pas de spécifications pour les rappels, de sorte que chaque navigateur se comporte différemment.load
événement.load
eterror
correctement.Semble pas différent de
iframe
,getEntriesByType
,script
....Mais, nous avons natif du navigateur de secours! Ainsi, parce que nous avons mis de secours (innerHtml) directement, nous pouvons dire si
<object>
est chargé ou nonMais que faire avec Safari? Bon vieux
setTimeout
.Ouais.... pas si vite. La chose est,
<object>
lorsque échoue a passé sous silence dans les specs de comportement:Donc, le code a besoin d'un peu d'amélioration
Bien, et pour commencer le chargement
C'est tout. J'ai essayé d'expliquer le code dans chaque détail, de sorte qu'il peut ne regarde pas si stupide.
P. S. WebDev suce
Ont un id pour le plus haut (corps) de l'élément dans la page qui est en cours de chargement dans votre iframe.
sur le gestionnaire de Chargement de votre iframe, vérifier pour voir si getElementById() renvoie une valeur non nulle.
Si elle l'est, de l'iframe a chargé avec succès. autre chose, elle a échoué.
dans ce cas, mettez cadre.src="about:blank". Assurez-vous de supprimer le loadhandler avant de faire cela.
Ne répond pas à votre question exactement, mais ma recherche d'une réponse m'a amené ici, donc je poste juste au cas où quelqu'un d'autre avait une requête similaire à moi.
Il n'a pas tout à fait utiliser un événement de chargement, mais il peut détecter si un site web est accessible et exigible (si elle l'est, l'iFrame, en théorie, devrait charge).
Au début, j'ai pensé à faire un appel AJAX comme tout le monde, sauf qu'il ne fonctionne pas pour moi d'abord, comme je l'avais utilisé jQuery. Il fonctionne parfaitement, si vous faites un XMLHttpRequest:
Edit:
Si cette méthode fonctionne bien, sauf qu'il a beaucoup de faux négatifs (ramasse un tas de trucs qui s'affichent dans une iframe) en raison de cross-origin malarky. Le chemin que j'ai eu autour de cette était de faire un CURL/demande Web sur un serveur, et ensuite de vérifier les en-têtes de réponse a) si le site existe, et b) si les en-têtes avait mis
x-frame-options
.Ce n'est pas un problème si vous exécutez votre propre serveur, comme vous pouvez faire votre propre appel d'api pour elle.
Ma mise en œuvre dans node.js: