Voici ma situation.
J'ai un fichier appelé iframe.html
, qui contient le code pour un diaporama d'images . Le code est un peu comme
<html>
<head>
<!-- Have added title and js files (jquery, slideshow.js) etc. -->
</head>
<body>
<!-- Contains the images which are rendered as slidehow. -->
<!-- have hierarchy like 'div' inside 'div' etc. -->
</body>
</html>
Les utilisateurs peuvent utiliser le code intégré pour ajouter le diaporama à leurs blogs ou sites Web (ils peuvent provenir de différents domaines). Supposons qu'un utilisateur doit incorporer le diaporama dans index.html
, il peut l'ajouter en ajoutant les lignes suivantes:
<iframe id="iframe" src="path_to_iframe.html" width="480" height="320" scrolling="no" frameborder="0"></iframe>
Cela portera le code HTML complet de iframe.html
à index.html
. Il me faut maintenant un moyen d'accéder aux éléments de l'iframe pour ajuster certaines de leurs propriétés.
Comme dans le code, la largeur et la hauteur de l'iframe sont définies par l'utilisateur sur certaines dimensions fixes. Je voudrais ajuster la taille du diaporama (et des images contenues) à la taille du conteneur iframe. Quelle est la meilleure façon de procéder?
J'ai essayé sans succès d'accéder aux composants iframe à partir de index.html
par quelque chose comme:
$('#iframe').contents();
mais obtenez l'erreur:
TypeError: Impossible d'appeler la méthode 'contenu' de null
Donc, je pense que pour implémenter la logique dans iframe.html
où le diaporama devrait vérifier la largeur et la hauteur du parent et définir sa hauteur en conséquence.
Je suis assez confus, espérons que ma question aura un sens pour la plupart. S'il vous plaît n'hésitez pas à demander des explications supplémentaires. Votre aide est appréciée.
Cette ligne récupérera l'intégralité du code HTML du cadre. En utilisant d'autres méthodes au lieu de innerHTML
, vous pouvez parcourir le DOM du document interne.
document.getElementById('iframe').contentWindow.document.body.innerHTML
Rappelez-vous que cela ne fonctionnera que si la source du cadre se trouve sur le même domaine. S'il s'agit d'un domaine différent, la protection XSS (Cross-Site-Scripting) entrera en vigueur.
var iframe = document.getElementById('iframe');
$(iframe).contents().find("html").html();
$(editFrame).contents().find("html").html();
cela fonctionne pour moi parce que cela fonctionne bien dans ie8.
$('#iframe').contents().find("html").html();
mais si vous aimez utiliser javascript à part pour jquery, vous pouvez utiliser comme ceci
var iframe = document.getElementById('iframecontent');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
var val_1 = innerDoc.getElementById('value_1').value;
Si vous avezDivcomme suit dans unIframe
<iframe id="ifrmReportViewer" name="ifrmReportViewer" frameborder="0" width="980"
<div id="EndLetterSequenceNoToShow" runat="server"> 11441551 </div> Or
<form id="form1" runat="server">
<div style="clear: both; width: 998px; margin: 0 auto;" id="divInnerForm">
Some Text
</div>
</form>
</iframe>
Ensuite, vous pouvez trouver le texte de cesDiven utilisant le code suivant
var iContentBody = $("#ifrmReportViewer").contents().find("body");
var endLetterSequenceNo = iContentBody.find("#EndLetterSequenceNoToShow").text();
var divInnerFormText = iContentBody.find("#divInnerForm").text();
J'espère que cela aidera quelqu'un.
Pourquoi ne pas essayer Ajax, vérifiez un code partie 1 ou partie 2 (utilisez un commentaire).
$(document).ready(function(){
console.clear();
/*
// PART 1 ERROR
// Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Sandbox access violation: Blocked a frame at "http://stacksnippets.net" from accessing a frame at "null". Both frames are sandboxed and lack the "allow-same-Origin" flag.
console.log("PART 1:: ");
console.log($('iframe#sandro').contents().find("html").html());
*/
// PART 2
$.ajax({
url: $("iframe#sandro").attr("src"),
type: 'GET',
dataType: 'html'
}).done(function(html) {
console.log("PART 2:: ");
console.log(html);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<html>
<body>
<iframe id="sandro" src="https://jsfiddle.net/robots.txt"></iframe>
</body>
</html>
Cela peut être une autre solution si jquery est chargé dans iframe.html.
$('#iframe')[0].contentWindow.$("html").html()
Juste pour référence. Voici comment procéder avec JQuery (utile par exemple lorsque vous ne pouvez pas interroger par ID d'élément):
$('#iframe').get(0).contentWindow.document.body.innerHTML