รับองค์ประกอบจากภายใน iFrame


คำตอบ:


382
var iframe = document.getElementById('iframeId');
var innerDoc = (iframe.contentDocument) ? iframe.contentDocument : iframe.contentWindow.document;

คุณสามารถเขียนได้ง่ายขึ้น:

var iframe = document.getElementById('iframeId');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;

และเอกสารภายในอันแรกที่ถูกต้องจะถูกส่งกลับ

เมื่อคุณได้รับเอกสารภายในคุณก็สามารถเข้าถึงภายในได้เช่นเดียวกับที่คุณเข้าถึงองค์ประกอบใด ๆ ในหน้าปัจจุบันของคุณ ( innerDoc.getElementById... ฯลฯ )

สำคัญ:ตรวจสอบให้แน่ใจว่า iframe อยู่ในโดเมนเดียวกันมิฉะนั้นคุณจะไม่สามารถเข้าถึง internals ได้ นั่นจะเป็นการเขียนสคริปต์ข้ามไซต์


4
คำตอบที่ดี คุณรู้หรือไม่ว่าคุณสามารถทำได้: var innerDoc = iframe.contentDocument || iframe.contentWindow.document; // อ่านได้มากขึ้นและมีความหมายเหมือนกัน
David Snabel-Caunt

5
ฉันเคยเห็นผู้คนสับสนมากกว่าผู้ประกอบการที่สาม พวกเขาดูเหมือนจะไม่รู้ว่ามีการส่งคืนที่ถูกต้องครั้งแรก
geowa4

5
ในความเป็นจริงที่ฉันแก้ไขคำตอบที่จะรวมไว้ผู้ชายข้ามไหล่ของฉันถามฉันสิ่งที่ไม่ ...
geowa4

12
อาจจะดีกว่าเพื่อให้ความรู้กว่าการใช้รหัสที่ซับซ้อนมากขึ้นสำหรับความเรียบง่าย :)
เดวิด Snabel-Caunt

1
@JellicleCat: วิธีใด ๆ ที่เป็นวิธีการทำ "การปลอมแปลงคำขอข้ามไซต์" หรือที่เรียกว่า "คลิกเดียว" โจมตีหรือ "เซสชันขี่"
CSharper

12

อย่าลืมเข้าถึง iframe หลังจากโหลดเสร็จแล้ว วิธีเก่า แต่เชื่อถือได้โดยไม่มี jQuery:

<iframe src="samedomain.com/page.htm" id="iframe" onload="access()"></iframe>

<script>
function access() {
   var iframe = document.getElementById("iframe");
   var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
   console.log(innerDoc.body);
}
</script>

3
window.parent.document.getElementById("framekit").contentWindow.CallYourFunction('pass your value')

CallYourFunction() เป็นฟังก์ชั่นภายในหน้าและการกระทำที่ฟังก์ชั่นนั้น


5
กำลังเรียกใช้ฟังก์ชันจาก iFrame ไม่ได้รับการอ้างอิงไปยังองค์ประกอบ
Nick Mitchell

3

คำตอบข้างต้นให้คำตอบที่ดีโดยใช้ Javscript นี่เป็นวิธีแก้ปัญหา jQuery ง่าย ๆ :

$('#iframeId').contents().find('div')

เคล็ดลับที่นี่คือ.contents()วิธีการของ jQuery .children()ซึ่งแตกต่างจากที่สามารถรับองค์ประกอบ HTML เท่านั้น.contents()สามารถรับทั้งโหนดข้อความและองค์ประกอบ HTML นั่นเป็นสาเหตุที่เราสามารถรับเนื้อหาเอกสารของ iframe ได้โดยใช้มัน

อ่านเพิ่มเติมเกี่ยวกับ jQuery .contents(): .contents ()

โปรดทราบว่า iframe และหน้าจะต้องอยู่ในโดเมนเดียวกัน


1

ไม่มีคำตอบอื่นใดที่เหมาะกับฉัน ฉันสิ้นสุดการสร้างฟังก์ชันภายใน iframe ของฉันที่ส่งคืนวัตถุที่ฉันค้นหา:

function getElementWithinIframe() {
    return document.getElementById('copy-sheet-form');
}

จากนั้นคุณเรียกใช้ฟังก์ชันนั้นเพื่อดึงองค์ประกอบ:

var el = document.getElementById("iframeId").contentWindow.functionNameToCall();

0

หาก iframe ไม่ได้อยู่ในโดเมนเดียวกันซึ่งคุณไม่สามารถเข้าถึง internals จาก parent แต่คุณสามารถแก้ไขซอร์สโค้ดของ iframe ได้จากนั้นคุณสามารถแก้ไขเพจที่แสดงโดย iframe เพื่อส่งข้อความไปยังหน้าต่างพาเรนต์ซึ่งช่วยให้ คุณสามารถแบ่งปันข้อมูลระหว่างหน้า แหล่งที่มาบางส่วน:


-3

โค้ดด้านล่างจะช่วยให้คุณค้นหาข้อมูล iframe

let iframe = document.getElementById('frameId');
let innerDoc = iframe.contentDocument || iframe.contentWindow.document;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.