2010-06-01 7 views
25

Ich versuche herauszufinden, der beste Weg zum Zugriff auf Element window und document Eigenschaften von einer übergeordneten Seite. Die kann über JavaScript erstellt werden oder über eine Referenz zugegriffen werden, die in einer Objekteigenschaft oder einer Variablen gespeichert ist, so dass, wenn ich das richtig verstehe, die Verwendung von document.frames ausgeschlossen ist.Was ist der prägnanteste browserübergreifende Weg, um auf ein <iframe> Elementfenster und Dokument zuzugreifen?

Ich habe gesehen, dass dies eine Reihe von Möglichkeiten, aber ich bin mir unsicher über die beste Vorgehensweise. Bei einer gegebenen auf diese Weise erstellt:

var iframe = document.createElement('iframe'); 
document.getElementsByTagName('body')[0].appendChild(iframe); 

Ich bin derzeit diese mit auf die document zuzugreifen, und es scheint, in den wichtigsten Browsern OK zu arbeiten:

var doc = iframe.contentWindow || iframe.contentDocument; 
if (doc.document) { 
    doc = doc.document; 
} 

Ich habe auch diese sehen Ansatz:

var iframe = document.getElementById('my_iframe'); 

iframe = (iframe.contentWindow) ? iframe.contentWindow : 
     (iframe.contentDocument.document) ? iframe.contentDocument.document : 
     iframe.contentDocument; 

iframe.document.open(); 
iframe.document.write('Hello World!'); 
iframe.document.close(); 

das hat mich verwirrt, da es das scheint, wenn iframe.contentDocument.document definiert ist, wirst du am Ende versucht iframe.contentDocument.document.document zugreifen .

Es gibt auch diese:

var frame_ref = document.getElementsByTagName('iframe')[0]; 

var iframe_doc = frame_ref.contentWindow ? frame_ref.contentWindow.document : 
    frame_ref.contentDocument; 

Am Ende, ich denke, ich bin verwirrt darüber, welche Eigenschaften halten, die Eigenschaften, ob contentDocument-document äquivalent ist, oder ob es eine solche Eigenschaft als contentDocument.document, etc .

mich auf eine genaue/rechtzeitige Bezug auf diese Eigenschaften, oder eine schnelle Einweisung geben Punkt auf jemand, wie effizient in einem Cross-Browser-Weg eines ‚s zugreifen window und document Eigenschaften (Kann ohne die Verwendung von jQuery o r andere Bibliotheken)?

Danke für jede Hilfe!

Antwort

3

Alle modernen Browser mit Ausnahme von Chrome unterstützen iframereference.contentWindow und iframereference.contentDocument, aber nur, wenn die im iframe geöffnete Seite sich in derselben Domäne wie die Seite mit dem iframe befindet.

So schließen Sie Chrome verwenden var iwin=iframereference.contentWindow, idoc=iwin.document;

.contentDocument die window.document der Seite in der iframe ist, als contentWindow.document ist, aber nicht .contentDocument.document.

Chrome Unterstützung in irgendeiner Zukunft für .contentDocument umfassen kann version- Ich hoffe es, weil es all anderen Browser das in einem Objekt-Elemente enthält Dokument finden auch die Art und Weise, Art text/html, wo die Daten Attribut die URL eines ist HTML-Seite.

+0

Danke, kennebec! Also habe ich ein paar Tests gemacht, um euer Feedback zu berücksichtigen. Es sieht tatsächlich wie IE (mindestens IE 7) ist der Nachzügler auf contentDocument; Chrome scheint das zu unterstützen. Würde 'var win = iframe.contentWindow; var doc = iframe.contentDocument || iframe.contentWindow.document; 'ein ausreichender und stabiler Cross-Browser (zurück zu IE 6) nach den' window' und 'document' Objekten suchen? – Bungle

+0

Die One-Line-Lösung, die ich gepostet habe, berücksichtigt all diese Überlegungen :) –

+1

@EmanueleDelGrande: Aber es hat es nicht erklärt. – DanMan

11

Es gibt einen einfacheren Weg, den es schon länger gibt ... Verwenden Sie window.frames, um einen Verweis auf das Fensterobjekt des Rahmens zu erhalten.

Nach dem Name oder ID:

var iframe_doc = window.frames.my_iframe.document; 

oder wenn Sie es vorziehen:

var iframe_doc = window.frames['my_iframe'].document; 

oder Index:

var iframe_doc = window.frames[0].document; 

gute Referenz für window.frames hier: http://developer.mozilla.org/en/DOM/window.frames

Ein Auszug:

jedes Element in dem window.frames pseudo-Array die zu den gegebenen < Rahmen entsprechenden Fenster Objekt repräsentiert > 's oder <iframe>' s Inhalt, nicht die (i) Rahmen-DOM-Element (d. h window.frames [0] ist die gleiche wie document.getElementsByTagName ( "iframe") [0] .contentWindow)

12

Während der Zeit, die ich viele Tests gemacht, und schließlich kam mit diesem kurzen, aber robuste Syntax, die auf jedem Browser funktioniert konnte ich Test:


             
  
    var doc = iframe.contentDocument ? iframe.contentDocument : (iframe.contentWindow.document || iframe.document); 
  

EDIT: @DaggNabbit bemerkt, dass ein Referenzfehler in iframe.contentWindow.document, wenn iframe.contentWindow nicht gesetzt ist, die Codeausführung blockieren würde, nicht iframe.document erlaubt werden zurückgegeben .
So raffiniert ich meinen Code:

var doc = iframe.contentDocument ? 
    iframe.contentDocument : 
    (iframe.contentWindow ? iframe.contentWindow.document : iframe.document); 

HINWEIS: iframe.document ist eine Abhilfe für IE5.

+0

Der letzte Teil dieser Bedingung scheint fischig. Es wird davon ausgegangen, dass "iframe.contentWindow" existiert, indem auf eine Eigenschaft davon verwiesen wird. Wenn es nicht existiert, wird es einen ReferenceError werfen, und die '|| iframe.document' part wird niemals ausgeführt. Auch wenn '|| Wenn iframe.document' ausgeführt wird, wird es wahrscheinlich nichts Nützliches machen (unter der Annahme, dass iframe ein Iframe-Element ist, wird es keine Eigenschaft "document" haben, es sei denn, dass jemand es dort festhielt). Anscheinend [das würde in Safari circa 2004 nicht funktionieren] (http://compgroups.net/comp.lang.javascript/contentwindow-portable-alternative/153090). Was ist los mit 'Frames'? –

+1

Auch die gemischte Verwendung eines ternären und kurzgeschlossenen "||" -Operators macht dies unnötig unhandlich. Über den Kommentar beiseite, warum schreibe nicht einfach 'var doc = iframe.contentDocument || iframe.contentWindow.document || iframe.document; '? –

+0

@DaggNabbit danke für Ihre Klarstellung: "_It iframe übernimmt.contentWindow existiert durch Verweisen auf eine Eigenschaft von it_ ": no, es bedeutet, dass, wenn' iframe.document' nicht gesetzt ist, dann 'iframe.contentWindow.document' ist. Wenn Sie das Vorhandensein der' contentWindow'-Eigenschaft und ihrer "document" sub-property, das können Sie zwar tun, aber meine Tests in verschiedenen Browsern haben gezeigt, dass, wenn die 'contentDocument' -Eigenschaft nicht gesetzt ist,' contentWindow' und 'contentWindow.document' –

0

Ich denke, das ist ein sehr einfacher und Cross-Browser-Weg

//get document object of IFRAME 
if(typeof frame.contentDocument!='undefined') { 
    iframeDocument=frame.contentDocument; 
} else { 
    iframeDocument=frame.document; 
} 
//get window object of IFRAME 
if(typeof frame.contentWindow!='undefined') { 
    iframeWindow=frame.contentWindow; 
} else { 
    iframeWindow=frame.window; 
} 

können Sie testen es

Verwandte Themen