J'essaie de créer un iframe à partir de JavaScript et de le remplir avec du HTML arbitraire, comme ceci:
var html = '<body>Foo</body>';
var iframe = document.createElement('iframe');
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
Je m'attendrais iframe
à contenir alors une fenêtre et un document valides. Cependant, ce n'est pas le cas:
> console.log (iframe.contentWindow);
nul
Essayez-le par vous-même: http://jsfiddle.net/TrevorBurnham/9k9Pe/
Qu'est-ce que je surplombe?
javascript
iframe
Trevor Burnham
la source
la source
Réponses:
La définition de la valeur
src
d'un nouvellement crééiframe
en javascript ne déclenche pas l'analyseur HTML tant que l'élément n'est pas inséré dans le document. Le HTML est ensuite mis à jour et l'analyseur HTML sera appelé et traitera l'attribut comme prévu.http://jsfiddle.net/9k9Pe/2/
Aussi cette réponse à votre question, il est important de noter que cette approche a des problèmes de compatibilité avec certains navigateurs, veuillez consulter la réponse de @mschr pour une solution multi-navigateurs.
la source
encodeURI(...)
cela n'encode pas tous les caractères, donc si votre HTML a des caractères spéciaux comme#
, cela se cassera.encodeURIComponent(...)
encode ces caractères. Voir cette réponseBien que vous ayez
src = encodeURI
dû fonctionner, j'aurais choisi une voie différente:Comme cela n'a pas de contraintes de domaine x et est entièrement effectué via la
iframe
poignée, vous pouvez accéder et manipuler le contenu du cadre plus tard. Tout ce dont vous devez vous assurer est que le contenu a bien été rendu, ce qui (selon le type de navigateur) démarrera pendant / après l'émission de la commande .write - mais pas nécessairement lors de l'close()
appel.Une manière 100% compatible de faire un rappel pourrait être cette approche:
Iframes a cependant l'événement onload. Voici une approche pour accéder au html interne en tant que DOM (js):
la source
srcdoc
propriété . Y a-t-il un inconvénient à l'document.write
approche?document.body.appendChild(iframe)
est nécessaire pour que cela fonctionne.Merci pour votre excellente question, cela m'a surpris à quelques reprises. Lors de l'utilisation de la source HTML dataURI, je trouve que je dois définir un document HTML complet.
Voir ci-dessous un exemple modifié.
prenez note du contenu html enveloppé de
<html>
balises et de laiframe.src
chaîne.L'élément iframe doit être ajouté à l'arborescence DOM pour être analysé.
Vous ne pourrez pas inspecter le
iframe.contentDocument
sauf si vous êtesdisable-web-security
sur votre navigateur. Vous recevrez un messagela source
Il existe une alternative pour créer une iframe dont le contenu est une chaîne HTML: l'attribut srcdoc . Cela n'est pas pris en charge dans les navigateurs plus anciens (le principal d'entre eux: Internet Explorer et éventuellement Safari ?), Mais il existe un polyfill pour ce comportement, que vous pouvez mettre dans des commentaires conditionnels pour IE, ou utiliser quelque chose comme has.js pour conditionnellement paresseux Charge le.
la source
Je sais que c'est une vieille question, mais j'ai pensé que je donnerais un exemple en utilisant l'
srcdoc
attribut car il est maintenant largement pris en charge et cette question est souvent vue.En utilisant l'
srcdoc
attribut, vous pouvez fournir du HTML en ligne à intégrer. Il remplace l'src
attribut s'il est pris en charge. Le navigateur reviendra à l'src
attribut s'il n'est pas pris en charge.Je recommanderais également d'utiliser l'
sandbox
attribut pour appliquer des restrictions supplémentaires au contenu dans le cadre. Ceci est particulièrement important si le HTML n'est pas le vôtre.Si vous avez besoin de prendre en charge des navigateurs plus anciens, vous pouvez vérifier la
srcdoc
prise en charge et revenir à l'une des autres méthodes à partir d'autres réponses.la source
L'approche URL ne fonctionnera que pour les petits fragments HTML. L'approche la plus solide consiste à générer une URL d'objet à partir d'un objet blob et à l'utiliser comme source de l'iframe dynamique.
la source
Faire ça
getIframeWindow est défini ici
la source