2013-04-07 23 views
8

Tôi cần phải tự động hóa biểu mẫu web sử dụng iframe để nhúng biểu mẫu con 'có thể được coi là các trang html riêng biệt.Nhận cá thể của đối tượng con trong iframe

Vì vậy, bạn nhận được tài liệu gốc có chứa những gì họ gọi là các trường xem là iframe. Trong các iframe là các trang web được nhúng 'con'.

Một ví dụ đơn giản:

Tôi đã cắt bỏ rất nhiều off the html để giảm nó đến một kích thước hợp lý

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

Sau đó, nhúng html con có thể đơn giản như thế này:

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

html chứa trong STYLE = trông hơi lạ - không chắc tại sao nó lại như thế. Nhưng tôi có thể thấy nó là một khung nội tuyến.

Tôi có một phiên bản của đối tượng tài liệu cấp cao nhất và tôi có một cá thể của div có id = 123. Tôi cần phải tự động hóa các đối tượng textarea ở trẻ em. Tôi đã thử những điều sau không hoạt động.

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

Tôi đang thử nghiệm điều này bằng IE9.

Tôi có thể lấy một phiên bản của trang web bên trong bằng html này không? Nếu vậy, làm thế nào?

EDIT

Nếu có ích, đây là html thực, chưa chỉnh sửa cho div đang đề cập đến.

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

div đó giữ biểu mẫu con. Biểu mẫu con giống như một trang web html khác. Nó có các trường nhập html chuẩn và vùng văn bản. Tôi cần phải gửi văn bản cho văn bản của trẻ em (từ cha mẹ). Nhưng vấn đề là tôi không thể truy cập vào đối tượng html con từ cha mẹ.

+0

tôi có lẽ không nhận ra những gì bạn đang làm việc với , nhưng thuộc tính phần tử 'arid',' artype', 'ardbn' và' arvfframe' được chỉ định là gì? – Jesse

+0

Tôi nghĩ bạn nói rằng các khung nhìn là một 'div' trong' iframe', nhưng bạn đang xử lý nó như một mảng? Ngoài ra, nó không ảnh hưởng đến mã của bạn, nhưng bạn thiếu dấu ngoặc kép trên một số thuộc tính. –

+0

@Jesse arid etc là các thuộc tính tùy chỉnh được ứng dụng web sử dụng. ứng dụng web là BMC Biện pháp khắc phục nếu điều đó hữu ích. –

Trả lời

2

Có thể nội dung của khung nội tuyến không được tải. Bạn có thể thử kiểm tra xem iframe có được tải hay không và nếu iframe có, hãy thử truy cập phần tử tài liệu của nó.

Ví dụ: mã truy cập phần tử tài liệu của khung nội tuyến được chia thành hàm AfterFrameLoads() được gọi trong sự kiện onload của 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

Vấn đề tôi đang gặp là truy cập tài liệu bên trong. tức là innerDoc luôn là null - chức năng gọi để kiểm tra tốt sau khi mọi thứ được nạp. viewfields không phải là null - nhưng vấn đề của tôi là lấy nội dung của các khung nhìn. –

+0

Có phải innerDoc nằm trên cùng một miền với trang có div/khung nội tuyến của khung nhìn không? Khi tôi kiểm tra mã này và cố gắng trỏ innerDoc đến một url nằm trên một miền khác, tôi nhận rằng innerDoc là null (không có đối tượng tài liệu), nhưng có một đối tượng cửa sổ cha. – KernelPanik

+0

Tài liệu phải là null nếu src của khung nội tuyến nằm trong một miền khác, nhưng tôi tò mò nếu đây là trường hợp. Khi tôi kiểm tra nguồn, nó đã hoạt động nếu khung nội tuyến nằm trong cùng một miền, nhưng không phải cho một trang web bên ngoài như microsoft.com. Tham khảo: http://stackoverflow.com/questions/3999101/html-getting-document-from-iframe – KernelPanik

8

Nếu bạn đang cố gắng lấy dữ liệu từ phụ huynh nhìn vào iframe thì đây là những gì bạn đang tìm kiếm. Xin lưu ý rằng điều này chỉ hoạt động nếu nguồn iframe là một trang từ cùng một miền, nếu không bạn sẽ không có quyền truy cập nội dung của nó.

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

Trước tiên hãy chắc chắn bạn iframe được nạp, thì bạn có thể gọi đây để truy cập vào iframe dom của bạn.

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

Cập nhật:

Nếu bạn muốn có một giải pháp js tinh khiết bạn có thể thử này:

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

Nếu tôi không sử dụng JQuery thì sao? –

+0

kiểm tra cập nhật ở trên. –

Các vấn đề liên quan