Ich versuche, einen Iframe aus JavaScript zu erstellen und ihn mit beliebigem HTML zu füllen, wie folgt:
var html = '<body>Foo</body>';
var iframe = document.createElement('iframe');
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
Ich würde erwarten iframe
, dann ein gültiges Fenster und Dokument zu enthalten. Dies ist jedoch nicht der Fall:
> console.log (iframe.contentWindow);
Null
Probieren Sie es aus: http://jsfiddle.net/TrevorBurnham/9k9Pe/
Was übersehe ich?
javascript
iframe
Trevor Burnham
quelle
quelle
Antworten:
Das Festlegen
src
eines neuiframe
in Javascript erstellten Elements löst den HTML-Parser erst aus, wenn das Element in das Dokument eingefügt wurde. Der HTML-Code wird dann aktualisiert und der HTML-Parser wird aufgerufen und verarbeitet das Attribut wie erwartet.http://jsfiddle.net/9k9Pe/2/
Auch bei der Beantwortung Ihrer Frage ist es wichtig zu beachten, dass dieser Ansatz Kompatibilitätsprobleme mit einigen Browsern aufweist. Eine browserübergreifende Lösung finden Sie in der Antwort von @mschr.
quelle
encodeURI(...)
nicht alle Zeichen codiert werden. Wenn Ihr HTML also Sonderzeichen wie enthält#
, wird dies unterbrochen.encodeURIComponent(...)
codiert diese Zeichen. Siehe diese AntwortObwohl du arbeiten
src = encodeURI
solltest, wäre ich einen anderen Weg gegangen:Da dies keine X-Domain-Einschränkungen aufweist und vollständig über das
iframe
Handle erfolgt, können Sie später auf den Inhalt des Frames zugreifen und ihn bearbeiten. Sie müssen lediglich sicherstellen, dass der Inhalt gerendert wurde, der (je nach Browsertyp) während / nach der Ausgabe des Befehls .write gestartet wird - jedoch nicht unbedingt, wenn erclose()
aufgerufen wird.Eine 100% kompatible Art, einen Rückruf durchzuführen, könnte folgender Ansatz sein:
Iframes hat jedoch das Onload-Ereignis. Hier ist ein Ansatz, um auf das innere HTML als DOM (js) zuzugreifen:
quelle
srcdoc
Eigenschaft nicht unterstützen . Hat derdocument.write
Ansatz einen Nachteil ?document.body.appendChild(iframe)
erforderlich ist, damit dies funktioniert.Vielen Dank für Ihre tolle Frage, das hat mich ein paar Mal erwischt. Wenn ich eine dataURI-HTML-Quelle verwende, muss ich ein vollständiges HTML-Dokument definieren.
Siehe unten ein modifiziertes Beispiel.
Beachten Sie den HTML-Inhalt, der mit
<html>
Tags und deriframe.src
Zeichenfolge umschlossen ist.Das iframe-Element muss zum zu analysierenden DOM-Baum hinzugefügt werden.
Sie können das nur überprüfen,
iframe.contentDocument
wenn Sie sichdisable-web-security
in Ihrem Browser befinden. Sie erhalten eine Nachrichtquelle
Es gibt eine Alternative zum Erstellen eines Iframes, dessen Inhalt eine HTML-Zeichenfolge ist: das srcdoc-Attribut . Dies wird in älteren Browsern nicht unterstützt (hauptsächlich unter ihnen: Internet Explorer und möglicherweise Safari ?), Aber es gibt eine Polyfüllung für dieses Verhalten, die Sie in bedingte Kommentare für den IE einfügen oder so etwas wie has.js verwenden können, um bedingt faul zu sein lade es.
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich dachte, ich würde ein Beispiel mit dem
srcdoc
Attribut liefern , da dies jetzt weitgehend unterstützt wird und diese Frage häufig gesehen wird.Mit dem
srcdoc
Attribut können Sie Inline-HTML zum Einbetten bereitstellen. Es überschreibt dassrc
Attribut, wenn es unterstützt wird. Der Browser greift auf die zurücksrc
Attribut zurück, wenn es nicht unterstützt wird.Ich würde auch empfehlen, das
sandbox
Attribut zu verwenden, um zusätzliche Einschränkungen auf den Inhalt im Frame anzuwenden. Dies ist besonders wichtig, wenn der HTML-Code nicht Ihr eigener ist.Wenn Sie ältere Browser unterstützen müssen, können Sie anhand
srcdoc
anderer Antworten nach Unterstützung suchen und auf eine der anderen Methoden zurückgreifen.quelle
Der URL-Ansatz funktioniert nur für kleine HTML-Fragmente. Der solidere Ansatz besteht darin, eine Objekt-URL aus einem Blob zu generieren und diese als Quelle für den dynamischen Iframe zu verwenden.
quelle
Mach das
getIframeWindow wird hier definiert
quelle