2010-01-12 5 views
11

Angenommen, ich habe eine Seite unter www.example.com/foo, und es enthält eine mit src="http://www.example.com/bar". Ich möchte in der Lage sein, ein Ereignis von /bar abzufeuern und es von /foo gehört werden. Unter Verwendung der Prototype-Bibliothek, ich habe versucht, ohne Erfolg wie folgt vorgehen:Können Ereignisse, die von einem Iframe ausgelöst werden, von Elementen in seinem übergeordneten Element behandelt werden?

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

Wenn ich dies tun, in Firefox 3.5, erhalte ich folgende Fehlermeldung:

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

nicht sicher, ob das im Zusammenhang mit mein Problem. Gibt es einen Sicherheitsmechanismus, der verhindert, dass Skripte in /bar Ereignisse in /foo auslösen?

+0

Sind foo und bar in der gleichen Domäne? – Annie

+0

@Annie der Schema und Domain-Teile der URLs sind gleich. – allyourcode

Antwort

5

ich diesen Cross-Browser noch nicht getestet, aber es funktioniert in FF.

Im iFrame Sie auf das Element parent.document abfeuern kann:

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

und im übergeordneten Frame Sie damit fangen:

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

Ah. Ich denke, der Schlüssel hier ist, dass Sie parent.document verwendet haben. Der Unterschied ist Dieses Parent ist ein Window-Objekt im Vergleich zu Parent.document ist ein Element. – allyourcode

11

Ereignisse können das übergeordnete Fenster definiert durch eine Funktion behandelt werden, wenn die iframe eine Seite aus der gleichen Domäne (siehe MDC Artikel über Same Origin Policy) ist; Die Ereignisse werden jedoch nicht von der iframe auf die übergeordnete Seite gesprungen (zumindest nicht in meinen Tests).

+0

Vielen Dank, Justin. Können Sie (oder jemand anderes) einen Link zu Ereignissen bereitstellen, die nicht aus einem Iframe heraus sprudeln? – allyourcode

+5

Aus [die Spezifikationen] (http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-bubbling): "Propagierung wird bis zu und einschließlich des Dokuments fortgesetzt." Es ist wichtig zu verstehen, dass ein Iframe ein eigenes Dokumentelement hat. Unter Hinweis auf [die Spezifikationen] (http://www.w3.org/TR/REC-html40/struct/objects.html#idx-document): "das eingebettete Dokument bleibt unabhängig vom Hauptdokument" – user123444555621

+1

Spezifikationen sind selten das gleiche wie Implementierungen :( –

2

Anstatt dann ein Ereignis auf der Hauptseite zu erfassen, können Sie das Ereignis im iframe abfangen und eine Funktion auf der Hauptseite aufrufen.

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


<-- iframe page --> 

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

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

Ich denke, es funktionieren würde, aber nur knapp sein Ziel Test es

+0

Meinst du nicht parent.catchIt, nicht top.catchIt? – allyourcode

+4

wenn Sie Frames innerhalb anderer Frames haben, bedeutet top das Elternteil alle Frames. – TeKapa

Verwandte Themen