2010-11-04 10 views
7

Digamos que tengo una página en el mismo dominio que puse dentro de un iframe. En el marco flotante, he añadido los datos a un elemento, algo como esto:Acceda a los datos de jQuery del elemento iframe

HTML

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

Guión

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

Ahora una vez que esta página está en un iframe, sé que puedo acceder el elemento de la siguiente manera:

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

Pero cuando trato de obtener los datos de ese elemento, siempre es indefinido.

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

sé tiendas jQuery data() internamente en un objeto cache, pero no saben cómo acceder a él desde fuera de ese documento. Configuré this demo para mostrar mi problema. Haga clic en el botón "Obtener datos del cuadro" para ver los resultados.

Apreciaría cualquier entrada :)

Respuesta

26

que necesita para obtener el elemento de caché de que objeto jQuery de ventana, como esto:

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

Luego de conseguir datos, utilice $.data(), así:

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

You can test out your updated/working demo here.


Lo que esto realmente está accediendo es:

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

You Rock Nick! ¡Gracias! – Mottie

+0

@fudgey - welcome :) –

+0

esto me salvó el culo. Gracias. – Bnrdo

1

nunca he probado esto, pero estoy bastante seguro de que necesita hablar con $ objeto del iframe en lugar de uno de sus documentos para acceder al almacenamiento de datos interno de ese objeto. No es 100% seguro de cómo hacer que - tal vez algo como

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

(suposición)

lo que funcionaría con seguridad es una función dentro del documento marco flotante que recoge los datos, y lo devuelve a usted. Pero eso es mucho menos elegante que traerlo directamente, por supuesto.

+1

+1 por estar en el camino correcto;) – Mottie

+0

No es objeto '' jQuery' bajo contenido() ', usted tendrá que obtener usando 'window.frames ['myFrame']. contentWindow.jQuery' –

Cuestiones relacionadas