2013-05-20 41 views
11

Làm thế nào bạn có thể làm cho hai iFrames nói chuyện với nhau? Ví dụ: tôi là giá trị phần tử ngoài iframe thứ 2 và khung nội tuyến thứ nhất có phần tử hiển thị trên đó. Tôi cần phải lấy giá trị ra khỏi khung thứ 2 đến ngày 1. Làm thế nào tôi sẽ làm điều này? Đừng nói sử dụng cookie, điều này sẽ gây tổn hại cho lượng dữ liệu khổng lồ.Giao tiếp giữa iFrames?

+4

Trước hết, là những iframe trên cùng một tên miền? Hoặc là họ từ các trang web khác nhau? – BBog

+1

https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage – epascarello

+0

Cùng một tên miền. Vì vậy, cả hai đều trên http://www.example.com – Matthew

Trả lời

17

Nếu các thành phần được phân phát từ cùng một miền, khi đó chúng có thể truy cập trực tiếp vào nhau. Ví dụ, trong iframe1 bạn có thể làm:

document.getElementById('someDiv').innerHTML = 
    top.document.getElementById('otherIframe').contentWindow. 
    document.getElementById('someOtherDiv').innerHTML; 
+0

Sử dụng hàng đầu làm cho giả định rằng mã này sẽ không bao giờ được tải trong khung nếu không sẽ không trỏ đến những gì bạn mong đợi. –

+0

@ MattBerkowitz ý của bạn là gì? nếu bạn có hai iframe trên một trang và gọi 'top' từ chúng, nó sẽ cho bạn cửa sổ chứa từ đó bạn có thể tìm thấy iframe khác. – jbabey

+16

Không, nó có thể cung cấp cho bạn khung hình trên cùng, có thể là cha mẹ hoặc một số ông bà, v.v. Hãy xem xét thiết lập bạn vừa đề cập tất cả được tải bên trong iframe khác (chúng tôi không thể kiểm soát ai có thể tải trang của chúng tôi trong khung nội tuyến) trả lại trang ngoài cùng mà có thể sẽ không có 'khung khác' để tìm (và thậm chí không thể đáp ứng các yêu cầu của CORS). Sử dụng 'parent' thay vì' top' có lẽ sẽ tốt hơn một chút vì nó đảm bảo bạn đang làm những gì bạn nghĩ là bạn đang làm. –

5

tôi sẽ cảnh báo bạn trước hết là bạn sẽ cần đầy đủ khả năng mã sửa đổi cho cả iframe. Khung nội tuyến được xử lý nghiêm ngặt; nếu không, tôi có thể tạo tên miền "bunkofamerica.com", đặt "bankofamerica.com" vào khung nội tuyến và sau đó phân tích mật khẩu của người dùng khi họ nhập. (Các ngân hàng có xu hướng có mã iframe-busting dù sao, nhưng vẫn ...)

Bạn đang tìm kiếm chức năng có nguồn gốc này: https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage

Và đây là một thư viện github công ty của tôi sử dụng để làm cho điều này chéo hơn tương thích với trình duyệt: https://github.com/daepark/postmessage

jbabey là chính xác, nếu iframe nằm trong cùng một tên miền và giao thức thì sẽ dễ dàng hơn.

Opera Documents giải thích điều này với ví dụ điển hình liên quan https://dev.opera.com/articles/window-postmessage-messagechannel/#channel

0

Trước tiên, cách duy nhất một khung có thể tương tác bên ngoài của nó tự là nếu nội dung nạp ở cả hai nơi là từ cùng một tên miền nếu không bạn đang đi để có lỗi CORS.

Giả sử đó là tất cả nước thịt, tôi sẽ tạo một đối tượng người quản lý trên đối tượng cửa sổ của khung chính.

window.Mgmt = { 
    frame1: $('iframe#frame1'), 
    frame2: $('iframe#frame2') 
} 

sau đó trong một trong các iframe bạn sẽ có thể truy cập vào đối tượng sử dụng window.parent.Mgmt.frame1, vv

Các vấn đề liên quan