Pobierz element z ramki iFrame

Odpowiedzi:

382
var iframe = document.getElementById('iframeId');
var innerDoc = (iframe.contentDocument) ? iframe.contentDocument : iframe.contentWindow.document;

Możesz po prostu napisać:

var iframe = document.getElementById('iframeId');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;

a pierwszy ważny dokument wewnętrzny zostanie zwrócony.

Gdy zdobędziesz wewnętrzny dokument, możesz po prostu uzyskać dostęp do jego wewnętrznych elementów w taki sam sposób, jak do dowolnego elementu na bieżącej stronie. ( innerDoc.getElementById... itd.)

WAŻNE: upewnij się, że element iframe znajduje się w tej samej domenie, w przeciwnym razie nie będziesz mieć dostępu do jego elementów wewnętrznych. To byłoby skrypty między witrynami.

geowa4
źródło
4
Świetna odpowiedź. Czy wiesz, że możesz to zrobić: var innerDoc = iframe.contentDocument || iframe.contentWindow.document; // bardziej czytelny i oznacza to samo
David Snabel-Caunt
5
Widziałem ludzi bardziej zdezorientowanych niż trójskładnikowi operatorzy. Wydaje się, że nie wiedzą, że zwracany jest pierwszy ważny.
geowa4
5
w rzeczywistości, kiedy zredagowałem odpowiedź, aby ją dołączyć, facet przez ramię zapytał mnie, co to zrobiło ...
geowa4
12
Prawdopodobnie lepiej jest edukować niż używać bardziej złożonego kodu dla uproszczenia :)
David Snabel-Caunt
1
@JellicleCat: Każdy sposób wokół to jest sposób to zrobić „cross-site request forgery”, znany również jako „jednego kliknięcia” lub „jazda ataku Session”
CSharper
12

Nie zapomnij uzyskać dostępu do iframe po załadowaniu . Stary, ale niezawodny sposób bez jQuery:

<iframe src="samedomain.com/page.htm" id="iframe" onload="access()"></iframe>

<script>
function access() {
   var iframe = document.getElementById("iframe");
   var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
   console.log(innerDoc.body);
}
</script>
lukyer
źródło
3
window.parent.document.getElementById("framekit").contentWindow.CallYourFunction('pass your value')

CallYourFunction() to funkcja na stronie i jej działanie na niej

VishalDream
źródło
5
To wywołuje funkcję z ramki iFrame, nie uzyskując odniesienia do elementu.
Nick Mitchell,
3

Powyższe odpowiedzi dały dobre rozwiązania przy użyciu Javscript. Oto proste rozwiązanie jQuery:

$('#iframeId').contents().find('div')

Sztuczka polega na tym, że .contents()metoda jQuery , w przeciwieństwie do .children()której można uzyskać tylko elementy HTML, .contents()może uzyskać zarówno węzły tekstowe, jak i elementy HTML. Właśnie dlatego można uzyskać zawartość dokumentu iframe, używając go.

Dalsze informacje o jQuery .contents(): .contents ()

Pamiętaj, że element iframe i strona muszą należeć do tej samej domeny.

SkuraZZ
źródło
1

Żadna z pozostałych odpowiedzi nie działała dla mnie. Skończyło się na tym, że w mojej ramce iframe utworzyłem funkcję, która zwraca obiekt, którego szukałem:

function getElementWithinIframe() {
    return document.getElementById('copy-sheet-form');
}

Następnie wywołujesz tę funkcję w taki sposób, aby pobrać element:

var el = document.getElementById("iframeId").contentWindow.functionNameToCall();
wyciągnięty
źródło
0

Jeśli element iframe nie znajduje się w tej samej domenie, że nie można uzyskać dostępu do jego elementów wewnętrznych od elementu nadrzędnego, ale można zmodyfikować kod źródłowy elementu iframe, można zmodyfikować stronę wyświetlaną przez element iframe, aby wysyłać wiadomości do okna nadrzędnego, co umożliwia w celu udostępniania informacji między stronami. Niektóre źródła:

Jose V.
źródło
-3

Poniższy kod pomoże ci znaleźć dane iframe.

let iframe = document.getElementById('frameId');
let innerDoc = iframe.contentDocument || iframe.contentWindow.document;
Ashish Naghate
źródło