Nhận phần tử từ trong iFrame


Câu trả lời:


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

Bạn có thể viết đơn giản hơn:

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

và tài liệu bên trong hợp lệ đầu tiên sẽ được trả lại.

Khi bạn nhận được tài liệu bên trong, bạn có thể truy cập nội bộ của nó giống như cách bạn truy cập bất kỳ yếu tố nào trên trang hiện tại của bạn. ( innerDoc.getElementById... vv.)

QUAN TRỌNG: Đảm bảo rằng iframe nằm trên cùng một tên miền, nếu không bạn không thể truy cập vào phần bên trong của nó. Đó sẽ là kịch bản chéo trang.


4
Câu trả lời chính xác. Bạn có biết rằng bạn có thể làm: var InternalDoc = iframe.contentDocument || iframe.contentWindow.document; // dễ đọc hơn và có nghĩa tương tự
David Snabel-Caunt

5
Tôi đã thấy mọi người bối rối bởi điều đó nhiều hơn các nhà khai thác ternary. Họ dường như không biết rằng cái hợp lệ đầu tiên được trả lại.
geowa4

5
thực tế, khi tôi chỉnh sửa câu trả lời để đưa nó vào, anh chàng trên vai tôi hỏi tôi đã làm gì ...
geowa4

12
Có lẽ tốt hơn để giáo dục hơn là sử dụng mã phức tạp hơn cho đơn giản :)
David Snabel-Caunt

1
@JellicleCat: Bất kỳ cách nào cũng là một cách để thực hiện "giả mạo yêu cầu chéo trang web", còn được gọi là tấn công "một cú nhấp chuột" hoặc "cưỡi phiên"
CSharper

12

Đừng quên truy cập iframe sau khi được tải . Cách cũ nhưng đáng tin cậy mà không cần 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>

3
window.parent.document.getElementById("framekit").contentWindow.CallYourFunction('pass your value')

CallYourFunction() là chức năng bên trong trang và chức năng đó hoạt động trên nó


5
Đó là gọi một hàm từ iFrame, không nhận được tham chiếu đến phần tử.
Nick Mitchell

3

Các câu trả lời trên đã đưa ra các giải pháp tốt khi sử dụng Javscript. Đây là một giải pháp jQuery đơn giản:

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

Thủ thuật ở đây là .contents()phương thức của jQuery , không giống như .children()chỉ có thể lấy các phần tử HTML, .contents()có thể nhận được cả các nút văn bản và các phần tử HTML. Đó là lý do tại sao người ta có thể lấy nội dung tài liệu của iframe bằng cách sử dụng nó.

Đọc thêm về jQuery .contents(): .contents ()

Lưu ý rằng iframe và trang phải nằm trên cùng một tên miền.


1

Không có câu trả lời nào khác làm việc cho tôi. Tôi đã kết thúc việc tạo một hàm trong iframe của mình để trả về đối tượng mà tôi đang tìm kiếm:

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

Sau đó, bạn gọi hàm đó như vậy để lấy phần tử:

var el = document.getElementById("iframeId").contentWindow.functionNameToCall();

0

Nếu iframe không nằm trong cùng một miền mà bạn không thể truy cập vào phần bên trong của nó từ cha mẹ nhưng bạn có thể sửa đổi mã nguồn của iframe thì bạn có thể sửa đổi trang được hiển thị bởi iframe để gửi tin nhắn đến cửa sổ cha, cho phép bạn để chia sẻ thông tin giữa các trang. Một số nguồn:


-3

Mã dưới đây sẽ giúp bạn tìm ra dữ liệu iframe.

let iframe = document.getElementById('frameId');
let innerDoc = iframe.contentDocument || iframe.contentWindow.document;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.