2013-04-07 14 views
8

Ich muss ein Webformular automatisieren, das iframes verwendet, um untergeordnete Formulare einzubetten, die als separate HTML-Seiten betrachtet werden können.Instanz des untergeordneten Objekts in iframe abrufen

So erhalten Sie ein übergeordnetes Dokument, das enthält, was sie Sichtfelder nennen, die Iframes sind. Innerhalb der Iframes befinden sich die "Kind" eingebetteten Webseiten.

Ein einfaches Beispiel:

Ich habe viel von der html ausschneiden es auf eine vernünftige Größe

<html> 
<body> 
    <div id="123" arid=123 artype="View" ardbn="vfMyChild" 
    class="arfid123 ardbnvfMyChild" 
STYLE="top:49 left:75 width:1038 height:322" arvfframe="&lt;iframe style=&quot;top:0 left:0 width:1038; height:322&quot name=&quot;VF123&quot; title=&quot;View Field&quot; src=&quot;javascript:&amp;quot&#59;&amp;lt&#59;HTML&amp;gt&#59;&amp;lt&#59;/HTML&amp;gt&#59;&amp;quot&#59;&quot; &gt; 
&lt;/iframe&gt;"> 
</div> 

</body> 
</html> 

Dann wird der eingebettete zu reduzieren Kind HTML könnte einfach so sein:

<html> 
<body> 
<div id="321" arid=321 artype="Char" ardbn="txtRegister"> 
    <label id="label321" class="label f6">Register:</label> 
    <textarea id="arid_321" cols="20" maxlen=255 rows=1></textarea> 
</div> 
</body> 
</html> 

Das HTML in der STYLE = sieht ein bisschen seltsam - nicht sicher, warum es so ist. Aber ich kann sehen, dass es eine Art Iframe ist.

Ich habe eine Instanz des Top-Level-Dokumentobjekts und ich habe eine Instanz des Div mit ID = 123. Ich muss das Textarea-Objekt im Kind automatisieren. Ich habe folgendes versucht, was nicht funktioniert hat.

var viewfields; //is a ref to the div with id=123 

if(viewfields) { 
    window.alert("viewfields.length=" + viewfields.length); //prints len=1 as expected 
    // line below get Caught exception: Unable to get value of the 
    // property 'document': object is null or undefined 
    var innerDoc = viewfields[0].contentDocument || viewfields[0].contentWindow.document; 
    if(innerDoc) { 
      window.alert("Wohoo we have an innerDoc"); 
    } 
} else 
     window.alert("no view fields found"); 

Ich teste dies mit IE9.

Kann ich eine Instanz der inneren Webseite mit diesem HTML bekommen? Wenn das so ist, wie?

EDIT

Wenn es hilft, hier ist die eigentliche, ungeschnittene html für die div in Frage.

<div id="WIN_0_536870915" arid=536870915 artype="View" ardbn="vfCubaChildren" class="arfid536870915 ardbnvfCubaChildren" STYLE="top:49&#59; left:75&#59; width:1038&#59; height:322&#59;z-index:1001&#59;background-color:transparent&#59;" arvfframe="&lt;iframe style=&quot;top:0&amp;#59&#59; left:0&amp;#59&#59; width:1038&amp;#59&#59; height:322&amp;#59&#59;background-color: transparent&amp;#59&#59;&quot; name=&quot;VF536870915&quot; frameborder=1 scrolling=&quot;auto&quot; allowtransparency=&quot;true&quot; title=&quot;View Field&quot; src=&quot;javascript:&amp;quot&#59;&amp;lt&#59;HTML&amp;gt&#59;&amp;lt&#59;/HTML&amp;gt&#59 ;&amp;quot&#59;&quot; onload=&quot;DVFol&amp;#40&#59;&amp;#41&#59;&quot;&gt; 
&lt;/iframe&gt;"> 
</div> 

Das div hält die untergeordnete Form. Das untergeordnete Formular ist wie eine andere HTML-Webseite. Es hat Standard-HTML-Eingabefelder und Textareas. Ich muss Text in die Textarea im Kind (vom Elternteil) posten. Aber das Problem ist, dass ich noch nicht auf das Child-HTML-Objekt vom Eltern zugreifen kann.

+0

ich wahrscheinlich nicht erkennen, was Sie arbeiten mit , aber was sind die Attribute "arid", "artype", "ardbn" und "arvfframe"? – Jesse

+0

Ich dachte, du sagtest Viewfields war ein 'div' in einem' iframe', aber du behandelst es wie ein Array? Außerdem sollte sich dies nicht auf Ihren Code auswirken, Ihnen fehlen jedoch Anführungszeichen für einige Attribute. –

+0

@Jesse arid usw. sind benutzerdefinierte Attribute, die von der Webanwendung verwendet werden. Web-App ist BMC Abhilfe, wenn das hilft. –

Antwort

2

Es ist möglich, dass der Inhalt des iframe nicht geladen wird. Sie können versuchen, zu überprüfen, ob der Iframe geladen ist, und wenn dies der Fall ist, versuchen Sie, auf das Dokumentelement zuzugreifen. Der Code für den Zugriff auf das Dokumentelement des iframe wird beispielsweise in die Funktion AfterFrameLoads() aufgeteilt, die während des onload-Ereignisses des iframe aufgerufen wird.

var viewfields; //is a ref to the div with id=123` 

if(viewfields) { 
    window.alert("viewfields.length=" + viewfields.length); //prints len=1 as expected 

    // Check if iframe loading is complete, attach rest of code to onload event 
    if (viewfields[0].addEventListener){ // for Mozilla, FF, Chrome, etc... 
     viewfields[0].addEventListener("onload",AfterFrameLoads()); 
    } 
    else if (viewfields[0].attachEvent){ // for IE and Opera 
     viewfields[0].attachEvent("onload",AfterFrameLoads()); 
    } 
} 

// Attempt to access document after iframe loads. 

function AfterFrameLoads(){ 
    var innerDoc = viewfields[0].contentDocument || viewfields[0].contentWindow.document;  

    if(innerDoc) { 
      window.alert("Wohoo we have an innerDoc"); 
    } 
    else { 
     window.alert("no view fields found"); 
    } 
} 
+0

Das Problem, das ich habe, ist der Zugriff auf das innere Dokument. dh innerDoc ist immer Null - Aufruf-Funktion, die überprüft wird, nachdem alles geladen ist. Viewfields ist nicht null - aber mein Problem ist, den Inhalt der Viewfields zu bekommen. –

+0

Befindet sich innerDoc in derselben Domäne wie die Seite mit den Viewfeldern div/iframe? Als ich diesen Code getestet habe und versucht habe, innerDoc auf eine URL zu verweisen, die sich auf einer anderen Domain befand, bekam ich, dass innerDoc null war (kein Dokumentobjekt), aber dass es ein Elternfensterobjekt gab. – KernelPanik

+0

Das Dokument sollte null sein, wenn der src des iframes in einer anderen Domäne ist, aber ich bin gespannt, ob das der Fall ist. Als ich die Quelle getestet habe, funktionierte es, wenn der Iframe in der gleichen Domäne war, aber nicht für eine externe Seite wie microsoft.com. Ref: http://stackoverflow.com/questions/3999101/html-getting-document-from-iframe – KernelPanik

8

Wenn Sie die Daten aus dem Elternteil zu erhalten versuchen, die iframe Blick in dann ist es das, was Sie suchen. Beachten Sie, dass dies nur funktioniert, wenn die Quelle iframe eine Seite aus derselben Domäne ist, sonst hätten Sie nicht die Berechtigung, auf ihren Inhalt zuzugreifen.

http://jsfiddle.net/wao20/Ja54y/19/

Zuerst stellen Sie sicher, Ihre iframe geladen ist, dann können Sie diesen Anruf Ihr iframe dom zuzugreifen.

$('#iframe_id_123').contents().find('#element_inside_your_iframe'); 

Update:

Wenn Sie eine reine js Lösung wollen, können Sie dies versuchen:

var f = document.getElementById('f123'); 
if (f != undefined){ 
    var doc = f.contentDocument || f.contentWindow.document; 
    var txt = doc.getElementById('secret'); 
    alert(txt.value); 
} 
else { 
    alert('No iframe, no secret!'); 
} 

http://jsfiddle.net/wao20/Ja54y/34/

+2

Was ist, wenn ich JQuery nicht verwende? –

+0

Überprüfen Sie das Update oben. –

Verwandte Themen