2010-11-04 68 views
7

Cho phép nói rằng tôi có một trang trên cùng một tên miền mà tôi đặt bên trong khung nội tuyến. Trong khung nội tuyến, tôi đã thêm dữ liệu vào một yếu tố, một cái gì đó như thế này:Truy cập dữ liệu jQuery từ phần tử iframe

HTML

<div id="data"></div> 

Script

$('#data') 
    .data('test1', 'this is test data 1') 
    .data('test2', ['John', 'Smith']) 
    .data('test3', { 
     alert1: function() { 
      $('#data').append('test3: successful<br>'); 
     } 
    }) 

Bây giờ khi trang này nằm trong iframe, tôi biết tôi có thể truy cập phần tử như sau:

$('#frame').contents().find('#data'); 

Nhưng khi tôi cố gắng lấy dữ liệu từ phần tử đó, nó luôn không xác định.

$('#frame').contents().find('#data').data('test1'); // shows up as undefined 

Tôi biết jQuery cửa hàng data() nội bộ trong một đối tượng cache, nhưng tôi không biết làm thế nào để truy cập nó từ bên ngoài tài liệu đó. Tôi đã thiết lập this demo để hiển thị sự cố của mình. Nhấp vào nút "Lấy dữ liệu khung" để xem kết quả.

tôi sẽ đánh giá cao bất kỳ đầu vào :)

Trả lời

26

Bạn cần phải nhận được các yếu tố bộ nhớ cache từ rằng đối tượng jQuery cửa sổ của, như thế này:

var windowjQuery = $('#frame')[0].contentWindow.$; 
var f = $('#frame').contents().find('#data'); 

Sau đó, để có được dữ liệu, sử dụng $.data(), như thế này:

windowjQuery.data(f[0], 'test1') 

You can test out your updated/working demo here.


Điều này thực sự là truy cập là:

var key = f[0][frame.contentWindow.$.expando]; 
var dataItem = frame.contentWindow.$.cache[key]["dataKey"]; 
+0

Bạn Rock Nick! Cảm ơn! – Mottie

+0

@fudgey - welcome :) –

+0

điều này đã lưu ass của tôi. cảm ơn. – Bnrdo

1

Tôi chưa bao giờ cố gắng này, nhưng tôi khá chắc chắn bạn cần phải nói chuyện với đối tượng $ của iframe thay vì một tài liệu của bạn để truy cập vào kho dữ liệu nội bộ của đối tượng đó. Không chắc chắn 100% làm thế nào để làm điều đó - có lẽ cái gì đó như

$('#frame').contents().jQuery.find("#data").data("test") 

(đoán hoang dã)

Điều gì sẽ làm việc cho chắc chắn là một chức năng bên trong tài liệu iframe rằng fetches các dữ liệu, và trả nó cho bạn. Nhưng đó là ít thanh lịch hơn so với lấy nó trực tiếp, tất nhiên.

+1

+1 vì đã đi đúng hướng;) – Mottie

+0

Không có 'đối tượng jQuery' dưới 'nội dung()', bạn sẽ cần phải nhận được bằng cách sử dụng 'window.frames ['myFrame']. contentWindow.jQuery' –

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