Làm cách nào để lấy nội dung của iframe trong Javascript?


154
<iframe id="id_description_iframe" class="rte-zone" height="200" frameborder="0" title="description">
  <html>
    <head></head>
    <body class="frameBody">
      test<br/>
    </body>
  </html>
</iframe>

Những gì tôi muốn nhận được là:

test<br/>

52
Lưu ý quan trọng: Bạn không thể truy cập nội dung của iFrame nếu đó là tên miền chéo. Xem Chính sách cùng nguồn gốc .
HellaMad

Câu trả lời:


154

Câu hỏi chính xác là làm thế nào để làm điều đó với JavaScript thuần không phải với jQuery.

Nhưng tôi luôn sử dụng giải pháp có thể tìm thấy trong mã nguồn của jQuery. Nó chỉ là một dòng JavaScript gốc.

Đối với tôi đó là, dễ dàng có thể đọc được và thậm chí tốt nhất afaik con đường ngắn nhất để có được những nội dung iframe.

Trước tiên hãy lấy iframe của bạn

var iframe = document.getElementById('id_description_iframe');

// or
var iframe = document.querySelector('#id_description_iframe');

Và sau đó sử dụng giải pháp của jQuery

var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;

Nó hoạt động ngay cả trong Internet Explorer thực hiện thủ thuật này trong thuộc contentWindowtính của iframeđối tượng. Hầu hết các trình duyệt khác sử dụng thuộc contentDocumenttính và đó là lý do tại sao chúng tôi chứng minh thuộc tính này trước tiên trong điều kiện HOẶC này. Nếu nó không được đặt thử contentWindow.document.

Chọn các yếu tố trong iframe

Sau đó, bạn thường có thể sử dụng getElementById()hoặc thậm chí querySelectorAll()để chọn Phần tử DOM từ iframeDocument:

if (!iframeDocument) {
    throw "iframe couldn't be found in DOM.";
}

var iframeContent = iframeDocument.getElementById('frameBody');

// or
var iframeContent = iframeDocument.querySelectorAll('#frameBody');

Các hàm gọi trong iframe

Chỉ lấy windowphần tử từ iframeđể gọi một số hàm toàn cục, biến hoặc toàn bộ thư viện (ví dụ jQuery):

var iframeWindow = iframe.contentWindow;

// you can even call jQuery or other frameworks
// if it is loaded inside the iframe
iframeContent = iframeWindow.jQuery('#frameBody');

// or
iframeContent = iframeWindow.$('#frameBody');

// or even use any other global variable
iframeWindow.myVar = window.myVar;

// or call a global function
var myVar = iframeWindow.myFunction(param1 /*, ... */);

Ghi chú

Tất cả điều này là có thể nếu bạn tuân thủ chính sách cùng nguồn gốc .


2
iframe không được xác định ở đây, hoặc bạn nên viết mã đầy đủ hoặc không nên viết jQuery với nó
Tarun Gupta

13
xin vui lòng cho tôi biết, nhưng dòng mã là một đoạn trích từ mã jquery và khối mã là mã ví dụ của riêng tôi. Phần còn lại bất cứ ai nên tự thoát ra. điều duy nhất bạn đang thiếu là iframe biến. Và tôi không thể biết iframe của bạn ở đâu hoặc ID của nó ở đâu.
algorardi 5/12/13

5
Bạn có thể vui lòng thêm cảnh báo vào đầu câu trả lời rằng điều này không hoạt động nếu iframe có src từ xa? Nếu tôi sai, tôi đánh giá cao nếu bạn có thể chỉ cho tôi cách tôi vẫn có thể nhận nội dung iframe mà không gửi yêu cầu HTTP khác (không thể vì tôi cần javascript thực thi để xây dựng nội dung iframe và không muốn triển khai môi trường javascript thứ hai nếu có thể tránh được).
Zackline

1
Tôi có một cảnh báo như vậy. Nhưng cuối lời giải thích của tôi. Bạn phải tuân thủ chính sách cùng nguồn gốc. Đó là tất cả.
algorardi 25/1/2016

2
Để làm việc trên, tôi đã phải gửi nó với document.querySelector('#id_description_iframe').onload = function() {... hy vọng nó sẽ giúp được ai đó.
dùng3442612

71

Sử dụng JQuery, hãy thử điều này:

$("#id_description_iframe").contents().find("body").html()

27
Nó không hoạt động vì "Tên miền, giao thức và cổng phải khớp." : JavaScript không an toàn khi cố gắng truy cập khung bằng URL
Ionică Bizău

2
Như đã đề cập, nó sẽ hoạt động nếu các miền khớp. FYI, tôi vừa thấy rằng $ ("# id_description_iframe #id_of_iframe_body"). Html () không hoạt động trong Chrome nhưng không hoạt động trong tất cả các phiên bản firefox và do đó sử dụng ở trên là tốt. Tức là $ ("# id_description_iframe #id_of_iframe_body"). Nội dung (). Find ("body"). Html () đã hoạt động trong cả hai
hobailey

41

Nó hoạt động hoàn hảo cho tôi :

document.getElementById('iframe_id').contentWindow.document.body.innerHTML;

3
Nó lạ, nhưng đối với tôi .bodykhông hoạt động. Tuy nhiên, .getElementsByTagName('body')[0]có.
Jenny O'Reilly

nó không phải là ".body", chỉ là "cơ thể". xóa dấu chấm
Arjun

1
đây sẽ là câu trả lời nếu bạn tham gia vào javascript javilla.
Jovanni G

23

AFAIK, Iframe không thể được sử dụng theo cách đó. Bạn cần trỏ thuộc tính src của nó sang một trang khác.

Đây là cách lấy nội dung cơ thể của nó bằng cách sử dụng javascript cũ. Điều này hoạt động với cả IE và Firefox.

function getFrameContents(){
   var iFrame =  document.getElementById('id_description_iframe');
   var iFrameBody;
   if ( iFrame.contentDocument ) 
   { // FF
     iFrameBody = iFrame.contentDocument.getElementsByTagName('body')[0];
   }
   else if ( iFrame.contentWindow ) 
   { // IE
     iFrameBody = iFrame.contentWindow.document.getElementsByTagName('body')[0];
   }
    alert(iFrameBody.innerHTML);
 }

1
nó làm trên safari (tức là chi nhánh)
Andrei Cristian Prodan

có vấn đề về tên miền chéo, Đã chặn một khung có nguồn gốc " someOther.com " truy cập vào khung có nguồn gốc chéo.
lannyf

10

sử dụng contenttrong iframe với JS:

document.getElementById('id_iframe').contentWindow.document.write('content');

5

Tôi nghĩ rằng việc đặt văn bản ở giữa các thẻ được dành riêng cho các trình duyệt không thể xử lý iframe tức là ..

<iframe src ="html_intro.asp" width="100%" height="300">
  <p>Your browser does not support iframes.</p>
</iframe>

Bạn sử dụng thuộc tính 'src' để đặt nguồn của iframe html ...

Mong rằng sẽ giúp :)


3

Các mã sau đây là tuân thủ chéo trình duyệt. Nó hoạt động trong IE7, IE8, Fx 3, Safari và Chrome, do đó không cần xử lý các vấn đề về trình duyệt chéo. Không kiểm tra trong IE6.

<iframe id="iframeId" name="iframeId">...</iframe>

<script type="text/javascript">
    var iframeDoc;
    if (window.frames && window.frames.iframeId &&
        (iframeDoc = window.frames.iframeId.document)) {
        var iframeBody = iframeDoc.body;
        var ifromContent = iframeBody.innerHTML;
    }
</script>

Html dưới đây hoạt động với tôi trong Chrome 7 trên Mac. Tôi đã thử nghiệm bài đăng gốc này trong Chrome 6 trên Windows và nó hoạt động tốt. <html> <head> </ head> <body> <iframe id = "iframeId" name = "iframeId"> ... </ iframe> <script type = "text / javascript"> var iframeDoc; if (window.frames && window.frames.iframeId && window.frames.iframeId.document) {window.frames.iframeId.document.body.innerHTML = "<h1> tests </ h1>"; } </ script> </ body> </ html>
nekno

1
window.frames.iframeId.documentlà không xác định cho tôi. (Ubuntu 13.04, Chrome)
Ionică Bizău

2

Chalkey là chính xác, bạn cần sử dụng thuộc tính src để chỉ định trang sẽ được chứa trong iframe. Cung cấp cho bạn làm điều này và tài liệu trong iframe nằm trong cùng miền với tài liệu gốc, bạn có thể sử dụng điều này:

var e = document.getElementById("id_description_iframe");
if(e != null) {
   alert(e.contentWindow.document.body.innerHTML);
}

Rõ ràng sau đó bạn có thể làm một cái gì đó hữu ích với nội dung thay vì chỉ đưa chúng vào một cảnh báo.


1

Để có được nội dung cơ thể từ javascript, tôi đã thử đoạn mã sau:

var frameObj = document.getElementById('id_description_iframe');

var frameContent = frameObj.contentWindow.document.body.innerHTML;

trong đó "id_description_iframe" là id iframe của bạn. Mã này đang làm việc tốt cho tôi.


2
Vui lòng đặt câu trả lời của bạn luôn trong ngữ cảnh thay vì chỉ dán mã. Xem ở đây để biết thêm chi tiết.
gehbiszumeis

1
Các câu trả lời chỉ có mã được coi là chất lượng thấp: đảm bảo cung cấp giải thích về mã của bạn làm gì và cách giải quyết vấn đề. Nó sẽ giúp người hỏi và người đọc tương lai cả nếu bạn có thể thêm thông tin trong bài viết của mình. Xem thêm Giải thích các câu trả lời hoàn toàn dựa trên mã: meta.stackexchange.com/questions/114762/iêu
borchvm
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.