Y a-t-il de toute façon pour obtenir le code source de la page qu'un IFrame chargé? Je ne souhaite pas changer de code, je veux juste le lire. J'ai aussi besoin de pouvoir obtenir cela à l'aide de JavaScript / HTML. P>
5 Réponses :
voir https://developer.mozilla.org/fr/html/element / iframe # script pour la façon dont les navigateurs basés sur Mozilla le gèrent. Il devrait y avoir des abstractions dans votre bibliothèque JavaScript préférée qui gérera les différences de nommage inévitables entre IE, WebKit, Gecko, etc. Doms. P>
Utilisation de jQuery: http://api.jquerery.com/contents/ (uniquement si le domaine Match)
Par exemple: P>
var html; $.get($(iframe).get(0).src, function(content) { html = content; });
document.getElementById('iframeID').contentWindow.document.body.innerHTML Works in Firefox, Chrome, Opera, IE9 beta
@Daz Le navigateur signale-t-il une erreur? Essayez-le dans Chrome, car ce navigateur a une bonne déclaration d'erreur. Si c'est un problème de domaine croisé, Chrome dira que dans l'erreur.
Je l'exécute en chrome. Il se bloque sur cette ligne. Je mettais une alerte la ligne après et l'alerte ne déclenche pas. J'ai vu des exemples de ce travail, mais ils étaient à partir de 2008. Êtes-vous sûr que cela fonctionne toujours sur les navigateurs modernes?
@Daz Oui, mais ouvrez la console (clic droit -> Inspecter élément). Il vous montrera les détails de l'erreur.
Je reçois cette erreur "Company TypeError: impossible de lire" corps "de la propriété non définie"
@Daz vous devrez utiliser la console pour comprendre cela. Vous pouvez exécuter ceci: console.log (document.getelementByID ('iframeid'). ContentWindo W) Code>. Cela imprimera l'objet Windows de la page Web Iframed.
@Daz, cela signifie que vous avez échoué à obtenir l'élément iframe. S'il vous plaît, ne me dis pas que vous venez de coller mon code. :) code> Vous devez remplacer
iframeID code> avec l'attribut ID de votre élément iframe.
Ohh, désolé. Maintenant, je suis "indéfini" même si je peux clairement voir que l'iframe chargé quelque chose. Il est également indiqué "tentative JavaScript non sécurisée d'accéder à la trame avec URL Google.com de la trame avec le fichier URL: /// D: /USERSERS/User/desktop/Chrome%20extension/popup.html. Les domaines, les protocoles et les ports doivent correspondre. "
> Console.log (document.getElementById ( 'frame') contentWindow.) Vrai objet
@Daz vous savez ce que cela signifie, non? La même stratégie d'origine ne vous permet pas de lire l'objet Window de la page iframed.
... c'est ce que j'essaie de faire
@Daz Votre question est la suivante: comment contourner la même politique d'origine? Il existe des questions sur ce problème à ce problème: Stackoverflow.com/search?q=bypass+Same+origin+ Politique
Essayez-le comme ceci:
<!DOCTYPE html> <html> <body> //this is iframe I ll look for its source <iframe id="frmin" src="http://www.w3schools.com"></iframe> <p>Click the button to see the source.</p> //this is display I will display Iframe's source here <div id="srcout"></div> //show source upon click event <button onclick="myFunction()">Show it</button> <script> function myFunction() { //get Iframe element ready for javascript manipulation var frm = document.getElementById("frmin"); //get display element ready for javascript manipulation var dsp = document.getElementById("srcout"); //find Iframe's HTML (root) element, [0] because I'm using getElementsByTagName which returns node list so I have to chose the 1st one, and put its outer content (i.e. with outer tags) to display, i.e. dsp.innerText. I use innerText because I want a text output not formatted as html. dsp.innerText = frm.contentDocument.getElementsByTagName('html')[0].outerHTML; } </script> </body> </html>
Cette approche utilise l'élément HTML de l'Iframe
Cette approche utilise l'élément HTML de l'Iframe. J'utilise d'abord une manipulation spécifique Iframe document.getelementByID ("FRMIN"). Contentdocument ... b> Pour accéder au contenu de l'iframe ... alors j'utilise getelementsbytagname pour trouver l'élément HTML (racine) de l'Iframe: . ..ContentDocument.getelementsByTagname ('HTML') [0] ... B> // ('HTML') [0] S'il y avait plus d'éléments HTML. Enfin, j'utilise ... OUTERHTML ... B> Pour obtenir le code HTML incl. Tags extérieurs.
S'il vous plaît ajouter les explications à votre message; Merci!
Qu'est-ce qui est important est le JavaScript et le HTML est exactement comme ça. CSS: strong> dans le Note: strong>
Vous n'avez pas besoin d'utiliser ces codes JavaScript à partir de Online, mais pour le faire fonctionner sur tous les navigateurs, il est conseillé de les utiliser aussi. P>
<html>
<head><title>View your Source Code</title>
<style type="text/css" >
.button
{
background:#000cff;
padding:2px 10px;
color:white;
text-decoration:none;
-moz-border-radius:10px;
-webkit-border-radius:10px;
border-radius:10px;
cursor: pointer;
font-weight: bold;
color: white;
display: inline-block;
box-shadow: 0 0 3px gray;
margin: 0px;
font: bold 11px Arial, Sans-Serif;
}
#source-code
{
display:none;
position:absolute;
top:-24px;
left:0;
width:100%;
height:414px;
background:rgba(255,255,255,0.0);
}
#source-code:target { display: block; }
#source-code pre
{
padding:20px;
font:14px/1.6 Monaco, Courier, MonoSpace;
margin:50px auto;
background:rgba(0,0,0,0.8);
color:white;
width:80%;
height:80%;
overflow:auto;
}
#source-code pre a,
#source-code pre a span
{
text-decoration:none;
color:#00ccff !important;
}
#x
{
position:absolute;
top:30px;
left:10%;
margin-left:-41px;
}
.control-copytextarea
{
position:absolute;
top:-3px;
left:20px;
cursor: pointer;
font-weight: bold;
padding:3px 10px;
border-radius: 5px 5px 0 0;
background: darkred;
color: white;
display: inline-block;
box-shadow: 0 0 3px gray;
margin: 0px;
font: bold 10px Arial, Sans-Serif;
}
</style>
<script languade="JavaScript">
$(function() {
$("<pre />", {
"html": '<!DOCTYPE html>\n<html>\n' +
$("html")
.html()
.replace(/[<>]/g, function(m) { return {'<':'<','>':'>'}[m]})
.replace(/((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi,'<a href="$1">$1</a>') +
'\n</html>',
"class": "prettyprint"
}).appendTo("#source-code");
prettyPrint();
});
</script>
<script languade="JavaScript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script languade="JavaScript">
var pageTracker = _gat._getTracker("UA-68528-29");
pageTracker._initData();
pageTracker._trackPageview();
</script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="http://css-tricks.com/examples/ViewSourceButton/prettify/prettify.js"></script>
</head>
<body>
<a class="button" href="#source-code" id="view-source">Show the Source Code for this page</a>
<div id="source-code" align="left">
<a href="#" id="x"><input type="button" alt="close" class="control-copytextarea" value=" Close Source Code Viewing " /></a>
</div>
</body>
</html>
Je fais cela à travers une extension de Google. J'ai ajouté le domaine que j'essaie d'accéder au fichier manifeste sous "Autorisations". Je ne suis pas totalement sûr que cela dépasse le même problème de domaine, mais comment le feriez-vous en supposant que les domaines sont les mêmes?