2013-04-07 12 views
8

ho bisogno di automatizzare un modulo web, che utilizza iframe per incorporare bambino 'forme' che possono essere considerati come pagine HTML separato.Ottenere istanza di oggetto figlio in iframe

in modo da ottenere un documento principale che contiene quello che chiamano campi vista che sono iframe. All'interno degli iframe ci sono le pagine Web incorporate "figlio".

Un semplice esempio:

ho tagliato fuori un sacco fuori dalla html per ridurlo a una dimensione ragionevole

<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> 

Poi il incorporato html figlio potrebbe essere semplice come questo:

<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> 

L'HTML contenuto nello STILE = sembra un po 'strano, non so perché sia ​​così. Ma posso vedere che è una sorta di iframe.

ho un'istanza dell'oggetto documento di livello superiore e ho un'istanza del div con id = 123. Ho bisogno di automatizzare l'oggetto textarea nel bambino. Ho provato quanto segue che non ha funzionato.

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"); 

Sto testando questo utilizzando IE9.

Sarò in grado di ottenere un'istanza della pagina web interna con questo html? Se é cosi, come?

EDIT

Se aiuta, qui è il vero e proprio, html inedito per il div in questione.

<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> 

Questo div mantiene la forma figlio. Il modulo figlio è come un'altra pagina Web html. Ha campi di input html standard e textarea. Ho bisogno di inviare del testo alle textarea nel bambino (dal genitore). Ma il problema è che non posso ancora accedere all'oggetto html secondario dal genitore.

+0

probabilmente non riconoscono ciò che si sta lavorando , ma quali sono gli attributi di elemento 'arid',' artype', 'ardbn' e' arvfframe' specificati? – Jesse

+0

Pensavo avessi detto che viewfields era un 'div' in un 'iframe', ma lo stai trattando come un array? Inoltre, non dovrebbe influenzare il tuo codice, ma ti mancano le virgolette su alcuni attributi. –

+0

@Jesse arid ecc sono attributi personalizzati utilizzati dall'applicazione web. l'app web è BMC Remedy se questo aiuta. –

risposta

2

E 'possibile che il contenuto del iframe non vengono caricati. Puoi provare a verificare se l'iframe è caricato, e se lo è, prova ad accedere al suo elemento del documento.

Ad esempio, il codice per accedere all'elemento del documento dell'iframe è suddiviso in funzione AfterFrameLoads() che viene richiamata durante l'evento onload dell'iframe.

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

Il problema che sto avendo è l'accesso al documento interno. per esempio innerDoc è sempre nullo - chiama la funzione per controllare bene dopo che tutto è stato caricato. i campi visivi non sono nulli, ma il mio problema è ottenere i contenuti dei campi di vista. –

+0

innerDoc si trova sullo stesso dominio della pagina che ha i div di vista/iframe? Quando ho provato questo codice e ho provato a puntare innerDoc su un URL che si trovava su un dominio diverso, ho ottenuto che innerDoc era nullo (nessun oggetto documento), ma che c'era un oggetto finestra padre. – KernelPanik

+0

Il documento dovrebbe essere nullo se lo src dell'iframe si trova in un dominio diverso, ma sono curioso di sapere se questo è il caso. Quando ho testato la fonte, ha funzionato se l'iframe era nello stesso dominio, ma non per un sito esterno come microsoft.com. Rif: http://stackoverflow.com/questions/3999101/html-getting-document-from-iframe – KernelPanik

8

Se si sta tentando di ottenere i dati dal genitore esaminando la iframe allora questo è quello che state cercando. Ricorda che questo funziona solo se la sorgente iframe è una pagina dello stesso dominio, altrimenti non avresti il ​​permesso di accedere ai suoi contenuti.

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

prima assicurarsi che il iframe è caricato, allora si può chiamare questo per accedere al vostro iframe dom.

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

Aggiornamento:

Se si desidera una soluzione js pura si può provare questo:

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

Cosa succede se non stavo usando JQuery? –

+0

controlla l'aggiornamento sopra. –

Problemi correlati