J'ai besoin d'exécuter un rappel lorsqu'un IFRAME a fini de se charger. Je n'ai aucun contrôle sur le contenu de l'IFRAME, je ne peux donc pas déclencher le rappel à partir de là.
Cet IFRAME est créé par programme et je dois transmettre ses données en tant que variable dans le rappel, ainsi que détruire l'iframe.
Des idées?
ÉDITER:
Voici ce que j'ai maintenant:
function xssRequest(url, callback)
{
var iFrameObj = document.createElement('IFRAME');
iFrameObj.src = url;
document.body.appendChild(iFrameObj);
$(iFrameObj).load(function()
{
document.body.removeChild(iFrameObj);
callback(iFrameObj.innerHTML);
});
}
Ce rappel avant le chargement de l'iFrame, donc le rappel n'a pas de données renvoyées.
javascript
events
dom
iframe
FlySwat
la source
la source
Réponses:
Tout d'abord, en utilisant le nom de la fonction xssRequest, il semble que vous essayez une requête intersite - qui, si c'est vrai, vous ne pourrez pas lire le contenu de l'iframe.
D'un autre côté, si l'URL de l'iframe est sur votre domaine, vous pouvez accéder au corps, mais j'ai trouvé que si j'utilise un délai d'expiration pour supprimer l'iframe, le rappel fonctionne bien:
la source
$('body', this.contentWindow.document).html()
parthis.contentDocument.body.outerHTML
load
est parti. Veuillez utiliser à la.on('load', function() { ... })
place.J'utilise jQuery et, étonnamment, cela semble se charger car je viens de tester et de charger une page lourde et je n'ai pas reçu l'alerte pendant quelques secondes jusqu'à ce que je voie le chargement de l'iframe:
Donc, si vous ne voulez pas utiliser jQuery, jetez un œil à leur code source et voyez si cette fonction se comporte différemment avec les éléments DOM iframe, je l'examinerai moi-même plus tard car je suis intéressé et posterai ici. De plus, je n'ai testé que dans le dernier chrome.
la source
load
est parti. Veuillez utiliser à la.on('load', function() { ... })
place.Le innerHTML de votre iframe est vide car votre balise iframe n'entoure aucun contenu dans le document parent. Afin d'obtenir le contenu de la page référencée par l'attribut src de l'iframe, vous devez accéder à la propriété contentDocument de l'iframe. Une exception sera lancée si le src provient d'un domaine différent. Il s'agit d'une fonctionnalité de sécurité qui vous empêche d'exécuter du JavaScript arbitraire sur la page de quelqu'un d'autre, ce qui créerait une vulnérabilité de script intersite. Voici un exemple de code illustrant ce dont je parle:
Pour approfondir l'exemple, essayez de l'utiliser comme contenu de l'iframe:
la source
J'ai dû faire cela dans les cas où des documents tels que des documents Word et des fichiers PDF étaient diffusés sur l'iframe et trouvaient une solution qui fonctionne plutôt bien. La clé gère l'
onreadystatechanged
événement sur l'iframe.Disons que le nom de votre cadre est "myIframe". Tout d'abord, quelque part dans votre démarrage de code (je le fais en ligne n'importe où après l'iframe), ajoutez quelque chose comme ça pour enregistrer le gestionnaire d'événements:
Je n'ai pas pu utiliser un attribut onreadystatechage sur l'iframe, je ne me souviens pas pourquoi, mais l'application devait fonctionner dans IE 7 et Safari 3, donc cela peut être un facteur.
Voici un exemple de comment obtenir l'état complet:
la source
Je voulais cacher le div spinner en attente lorsque le contenu i frame est entièrement chargé sur IE, j'ai essayé littéralement toutes les solutions mentionnées dans Stackoverflow.Com, mais rien ne fonctionnait comme je le souhaitais.
Ensuite, j'ai eu une idée, que lorsque le contenu du cadre i est complètement chargé, l'événement de chargement $ (Window) pourrait être déclenché. Et c'est exactement ce qui s'est passé. Alors, j'ai écrit ce petit script et j'ai travaillé comme par magie:
J'espère que cela t'aides.
la source
J'ai eu un problème similaire à vous. Ce que j'ai fait, c'est que j'utilise quelque chose appelé jQuery. Voici ce que vous faites ensuite dans le code javascript:
Il semble que vous supprimiez votre iFrame avant de récupérer le html. Maintenant, je vois un problème avec cela: p
J'espère que cela t'aides :).
la source
J'ai un code similaire dans mes projets qui fonctionne bien. En adaptant mon code à votre fonction, une solution pourrait être la suivante:
Peut-être que vous avez un innerHTML vide parce que (une ou les deux causes): 1. vous devriez l'utiliser contre l'élément body 2. vous avez supprimé l'iframe du DOM de votre page
la source
Je pense que l'événement de chargement est juste. Ce qui ne va pas, c'est la façon dont vous récupérez le contenu de l'iframe content dom.
Ce dont vous avez besoin est le html de la page chargée dans l'iframe et non le html de l'objet iframe.
Ce que vous devez faire est d'accéder au document de contenu avec
iFrameObj.contentDocument
. Cela renvoie le dom de la page chargée à l'intérieur de l'iframe, s'il se trouve sur le même domaine de la page actuelle.Je récupérerais le contenu avant de supprimer l'iframe.
J'ai testé dans Firefox et Opera.
Ensuite, je pense que vous pouvez récupérer vos données avec
$(childDom).html()
ou$(childDom).find('some selector') ...
la source
J'ai eu exactement le même problème dans le passé et le seul moyen que j'ai trouvé pour le résoudre était d'ajouter le rappel dans la page iframe. Bien sûr, cela ne fonctionne que lorsque vous contrôlez le contenu iframe.
la source
L'utilisation d'
onload
attrbute résoudra votre problème.Voici un exemple.
c'est ce que tu veux?
Cliquez ici pour plus d'informations.
la source