Próbuję utworzyć element iframe z JavaScript i wypełnić go dowolnym kodem HTML, na przykład:
var html = '<body>Foo</body>';
var iframe = document.createElement('iframe');
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
Spodziewałbym iframe
się wtedy zawierać prawidłowe okno i dokument. Jednak tak nie jest:
> console.log (iframe.contentWindow);
zero
Wypróbuj sam: http://jsfiddle.net/TrevorBurnham/9k9Pe/
Co ja przeoczam?
javascript
iframe
Trevor Burnham
źródło
źródło
Odpowiedzi:
Ustawienie
src
nowo utworzonegoiframe
w javascript nie uruchamia parsera HTML, dopóki element nie zostanie wstawiony do dokumentu. Kod HTML jest następnie aktualizowany, a parser HTML zostanie wywołany i przetworzy atrybut zgodnie z oczekiwaniami.http://jsfiddle.net/9k9Pe/2/
Również w odpowiedzi na twoje pytanie ważne jest, aby pamiętać, że to podejście wiąże się z problemami ze zgodnością z niektórymi przeglądarkami, zapoznaj się z odpowiedzią @mschr, aby uzyskać rozwiązanie dla różnych przeglądarek.
źródło
encodeURI(...)
nie koduje wszystkich znaków, więc jeśli Twój kod HTML zawiera znaki specjalne, takie jak#
, to się zepsuje.encodeURIComponent(...)
koduje te znaki. Zobacz tę odpowiedźChociaż
src = encodeURI
powinieneś działać, poszedłbym inną drogą:Ponieważ nie ma to ograniczeń w dziedzinie x-domeny i odbywa się to całkowicie za pośrednictwem
iframe
uchwytu, możesz później uzyskać dostęp i manipulować zawartością ramki. Wystarczy upewnić się, że zawartość została wyrenderowana, co (w zależności od typu przeglądarki) uruchomi się podczas / po wydaniu polecenia .write - ale nie jest to konieczne, gdyclose()
zostanie wywołane.W 100% kompatybilnym sposobem wywołania zwrotnego może być takie podejście:
Jednak iframes zawiera zdarzenie onload. Oto podejście do uzyskania dostępu do wewnętrznego html jako DOM (js):
źródło
srcdoc
właściwości . Czy jest jakaś wada tegodocument.write
podejścia?document.body.appendChild(iframe)
jest to wymagane, aby to działało.Dzięki za świetne pytanie, kilka razy mnie to zaskoczyło. Używając źródła dataURI HTML, stwierdzam, że muszę zdefiniować pełny dokument HTML.
Zobacz poniżej zmodyfikowany przykład.
zwróć uwagę na zawartość html owiniętą
<html>
tagami iiframe.src
ciągiem.Element iframe musi zostać dodany do drzewa DOM, aby można go było przeanalizować.
Nie będziesz w stanie sprawdzić,
iframe.contentDocument
chyba żedisable-web-security
w swojej przeglądarce. Otrzymasz wiadomośćźródło
Istnieje alternatywa tworzenia elementu iframe, którego zawartość jest ciągiem znaków HTML: atrybut srcdoc . Nie jest to obsługiwane w starszych przeglądarkach (między innymi: Internet Explorer i być może Safari ?), Ale istnieje polifill dla tego zachowania, który można umieścić w komentarzach warunkowych dla IE lub użyć czegoś takiego jak has.js do warunkowego leniwości Załaduj To.
źródło
Wiem, że to stare pytanie, ale pomyślałem, że podam przykład, używając
srcdoc
atrybutu, ponieważ jest to obecnie szeroko obsługiwane i jest to pytanie często wyświetlane.Korzystając z
srcdoc
atrybutu, możesz dostarczyć wbudowany kod HTML do osadzenia. Zastępujesrc
atrybut, jeśli jest obsługiwany. Przeglądarka powróci dosrc
atrybutu, jeśli nie jest obsługiwany.Poleciłbym również użycie
sandbox
atrybutu, aby zastosować dodatkowe ograniczenia do treści w ramce. Jest to szczególnie ważne, jeśli kod HTML nie jest Twoim własnym.Jeśli potrzebujesz obsługi starszych przeglądarek, możesz sprawdzić, czy są
srcdoc
obsługiwane, i wrócić do jednej z pozostałych metod z innych odpowiedzi.źródło
Podejście do adresu URL będzie działać tylko w przypadku małych fragmentów HTML. Bardziej solidnym podejściem jest wygenerowanie adresu URL obiektu z obiektu blob i użycie go jako źródła dynamicznej ramki iframe.
źródło
Zrób to
getIframeWindow zdefiniowano
źródło