2010-01-12 21 views
11

Supongamos que tengo una página ubicada en www.example.com/foo, y contiene un con src="http://www.example.com/bar". Deseo poder activar un evento desde /bar y hacer que se lo escuche en /foo. El uso de la librería Prototype, he intentado hacer lo siguiente sin éxito:¿Pueden los eventos activados desde un iframe ser manejados por elementos en su elemento primario?

Element.fire(parent, 'ns:frob');

Cuando hago esto, en Firefox 3.5, me sale el siguiente error:

Node cannot be used in a document other than the one in which it was created" code: "4 Line 0

No sé si esto está relacionado con mi problema. ¿Hay algún mecanismo de seguridad que impida que las secuencias de comandos en /bar inicien eventos en /foo?

+0

son foo y bar en el mismo dominio? – Annie

+0

@Annie el esquema y las porciones de dominio de las URL son las mismas. – allyourcode

Respuesta

5

no han probado este multi-navegador, sin embargo, pero funciona en FF.

En el marco flotante que puede disparar en el elemento parent.document:

Event.observe(window, 'load', function() { 
    parent.document.fire('custom:event'); 
}); 

y en el marco de los padres se puede coger con:

document.observe('custom:event', function(event) { alert('gotcha'); }); 
+1

Ah. Creo que la clave aquí es que utilizas parent.document. La diferencia es ese padre es un objeto Window vs. parent.document es un Elemento. ¡Gracias! – allyourcode

11

Los eventos pueden ser manejados por una función definida por la ventana padre si el iframe es una página de la misma dominio (véase el artículo de MDC en Same Origin Policy); sin embargo, los eventos no aparecerán desde el iframe en la página principal (al menos no en mis pruebas).

+0

Muchas gracias, Justin. ¿Puede usted (u otra persona) proporcionar un enlace sobre eventos que no brotan de un iframe? – allyourcode

+5

De [las especificaciones] (http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-bubbling): "la propagación continuará hasta e incluyendo el Documento". Es importante comprender que un iframe tiene un elemento de documento propio. De nuevo, citando [las especificaciones] (http://www.w3.org/TR/REC-html40/struct/objects.html#idx-document): "el documento incrustado permanece independiente del documento principal" – user123444555621

+1

Las especificaciones son raramente al igual que las implementaciones :( –

2

en lugar de atrapar un evento en la página principal, puede ver el evento en el iframe y llamar a una función en la página principal.

<-- main page --> 
function catchIt() 
{ 
// code here 
} 


<-- iframe page --> 

function doIt() 
{ 
top.catchIt(); 
} 

<a onclick="doIt();">test</a> 

Creo que funcionaría, pero aún no ha prueba de que

+0

¿No te refieres a parent.catchIt, no a top.catchIt? – allyourcode

+4

cuando tienes marcos dentro de otros marcos, top significa que el padre es todos marcos. – TeKapa

Cuestiones relacionadas