ควรใช้ window.opener / window.parent / window.top เมื่อใด


คำตอบ:


167
  • window.openerหมายถึงหน้าต่างที่เรียกwindow.open( ... )ให้เปิดหน้าต่างที่เรียกว่า
  • window.parentหมายถึงพาเรนต์ของหน้าต่างใน<frame>หรือ<iframe>
  • window.topหมายถึงหน้าต่างด้านบนสุดจากหน้าต่างที่ซ้อนอยู่ในหน้าต่าง<iframe>ย่อยอย่างน้อยหนึ่งชั้น

สิ่งเหล่านี้จะเป็นnull(หรืออาจจะundefined) เมื่อไม่เกี่ยวข้องกับสถานการณ์ของหน้าต่างอ้างอิง ("หน้าต่างอ้างอิง" หมายถึงหน้าต่างที่มีการเรียกใช้โค้ด JavaScript ในบริบท)


1
ขอบคุณ @pointy สำหรับการตอบกลับ ฉันมีเพจหลักที่เปิดเด็กโดยใช้window.open()ในการส่งเพจ ตอนนี้หน้าต่างลูกนี้เปิดหน้าต่างลูกอีกบานด้วยwindow.open()ตัวเองปิดเดียวกัน ตอนนี้เมื่อฉันส่งลูกคนที่สองของฉัน (ไม่มีลูกคนแรกแล้ว) ฉันต้องการเข้าถึงองค์ประกอบของหน้าของหน้าหลักของฉัน เป็นไปได้ไหมจากลูกคนที่สองเมื่อลูกคนแรกไม่มีอีกแล้ว
Sriram

4
@Sriram: ที่ชนิดของข้อมูลที่คุณต้องการที่จะใส่ในคำถามของคุณเพื่อให้ผู้คนรู้ว่าสิ่งที่เป็นปัญหาที่คุณกำลังจริงๆพยายามที่จะแก้
josh3736

5
@Sriram คุณจะต้องคว้าwindow.opener.openerก่อนที่หน้ากลางจะหายไป
Pointy

24

ฉันคิดว่าคุณต้องเพิ่มบริบทให้กับคำถามของคุณ อย่างไรก็ตามข้อมูลพื้นฐานเกี่ยวกับสิ่งเหล่านี้สามารถพบได้ที่นี่:

window.opener https://developer.mozilla.org/en-US/docs/Web/API/Window.opener

ฉันใช้ window.opener เป็นส่วนใหญ่เมื่อเปิดหน้าต่างใหม่ที่ทำหน้าที่เป็นกล่องโต้ตอบที่ต้องป้อนข้อมูลผู้ใช้และจำเป็นต้องส่งข้อมูลกลับไปที่หน้าต่างหลัก อย่างไรก็ตามสิ่งนี้ถูก จำกัด โดยนโยบายต้นทางดังนั้นคุณต้องตรวจสอบให้แน่ใจว่าทั้งเนื้อหาจากกล่องโต้ตอบและหน้าต่างตัวเปิดถูกโหลดจากต้นทางเดียวกัน

window.parent https://developer.mozilla.org/en-US/docs/Web/API/Window.parent

ฉันใช้สิ่งนี้เป็นส่วนใหญ่เมื่อทำงานกับ IFrames ที่ต้องสื่อสารกับวัตถุหน้าต่างที่มีอยู่

window.top https://developer.mozilla.org/en-US/docs/Web/API/Window.top

สิ่งนี้มีประโยชน์เพื่อให้แน่ใจว่าคุณกำลังโต้ตอบกับหน้าต่างเบราว์เซอร์ระดับบนสุด คุณสามารถใช้เพื่อป้องกันไม่ให้เว็บไซต์อื่นสร้าง iframing เว็บไซต์ของคุณได้

หากคุณเพิ่มรายละเอียดเพิ่มเติมในคำถามของคุณเราสามารถให้ตัวอย่างอื่น ๆ ที่เกี่ยวข้องเพิ่มเติมได้

อัปเดต: มีสองสามวิธีที่คุณสามารถจัดการกับสถานการณ์ของคุณได้
คุณมีโครงสร้างดังต่อไปนี้:

  • หน้าต่างหลัก
    • กล่องโต้ตอบ 1
      • กล่องโต้ตอบ 2 เปิดโดยกล่องโต้ตอบ 1

เมื่อ Dialog 1 รันโค้ดเพื่อเปิด Dialog 2 หลังจากสร้าง Dialog 2 ให้ไดอะล็อก 1 ตั้งค่าคุณสมบัติบน Dialog 2 ที่อ้างอิงตัวเปิด Dialog1

ดังนั้นหาก "childwindow" คุณเป็นตัวแปรสำหรับวัตถุหน้าต่างโต้ตอบ 2 และ "หน้าต่าง" เป็นตัวแปรสำหรับวัตถุหน้าต่างโต้ตอบ 1 หลังจากเปิดกล่องโต้ตอบ 2 แต่ก่อนปิดกล่องโต้ตอบ 1 ให้ทำการมอบหมายคล้ายกับสิ่งนี้:

childwindow.appMainWindow = window.opener

หลังจากทำการมอบหมายด้านบนแล้วให้ปิดกล่องโต้ตอบ 1 จากนั้นจากโค้ดที่ทำงานอยู่ภายใน dialog2 คุณควรจะสามารถใช้ window.appMainWindowอ้างอิงหน้าต่างหลักอ็อบเจกต์หน้าต่าง

หวังว่านี่จะช่วยได้


ขอบคุณ @Mark สำหรับการตอบกลับ ฉันมีเพจหลักที่เปิดเด็กโดยใช้window.open()ในการส่งเพจ ตอนนี้หน้าต่างลูกนี้เปิดหน้าต่างลูกอีกบานด้วยwindow.open()ตัวเองปิดเดียวกัน ตอนนี้เมื่อฉันส่งลูกคนที่สองของฉัน (ไม่มีลูกคนแรกแล้ว) ฉันต้องการเข้าถึงองค์ประกอบของหน้าของหน้าหลักของฉัน เป็นไปได้ไหมจากลูกคนที่สองเมื่อลูกคนแรกไม่มีอีกแล้ว
Sriram

คำตอบที่อัปเดต @ josh3736 - ฉันไม่เห็นว่าความคิดเห็นนั้นมีประโยชน์อย่างไร ฉันไม่ได้แนะนำให้ใครได้รับการรับรองจาก w3schools ทุกคนที่นี่รู้วิธีใช้ google และได้รับคำจำกัดความพื้นฐานของ window.opener, window.top และ window.parent ใช้ลิงก์ด้านบนหรือค้นหาข้อมูลอ้างอิงใหม่ ๆ แต่แทบจะไม่มีจุดใดเลยในการทำซ้ำข้อมูลที่กำหนดคุณสมบัติเหล่านี้ที่นี่
Mark At Ramp51

คำอธิบายมีประโยชน์จริงๆ @ MarkAtRamp51 ขอบคุณ!
Sriram

3
ลิงก์อธิบายโดยละเอียด - มีอะไรผิดปกติกับ w3schools ประเด็นคือหลีกเลี่ยงการส่งเสริมหรือเชื่อมโยงไปยัง (และทำให้ Google PageRank ของ) w3school เพิ่มขึ้นเป็นแหล่งข้อมูลที่เชื่อถือได้ W3S แพร่กระจายข้อมูลที่ไม่ดีและส่วนหนึ่งของปัญหาคือผู้คนจำนวนมากเชื่อมโยงไปยังข้อมูลที่ไม่ดีนั้น ดีกว่าจะเชื่อมโยงไปยังแหล่งที่เชื่อถือได้มากขึ้นของข้อมูลเช่นMDN
josh3736

5

top, parent, opener (เช่นเดียวกับ window, self และ iframe) เป็นอ็อบเจกต์หน้าต่างทั้งหมด

  1. window.opener -> ส่งคืนหน้าต่างที่เปิดหรือเปิดหน้าต่างป๊อปอัปปัจจุบัน
  2. window.top -> ส่งคืนหน้าต่างที่อยู่บนสุดหากคุณกำลังใช้เฟรมนี่คือหน้าต่างเฟรมเซ็ตหากไม่ใช้เฟรมนี่จะเหมือนกับหน้าต่างหรือตัวเอง
  3. window.parent-> ส่งคืนเฟรมหลักของเฟรมปัจจุบันหรือ iframe เฟรมหลักอาจเป็นหน้าต่างเฟรมเซ็ตหรือเฟรมอื่นถ้าคุณมีเฟรมซ้อนกัน หากไม่ใช้เฟรมพาเรนต์จะเหมือนกับหน้าต่างปัจจุบันหรือตัวเอง

1

เมื่อคุณจัดการกับหน้าต่างป๊อปอัป window.opener มีบทบาทสำคัญเพราะเราต้องจัดการกับฟิลด์ของเพจหลักเช่นเดียวกับเพจลูกเมื่อเราต้องใช้ค่าในเพจหลักเราสามารถใช้ window.opener หรือเราต้องการข้อมูลบางอย่าง ในหน้าต่างลูกหรือหน้าต่างป๊อปอัพในขณะโหลดจากนั้นอีกครั้งเราสามารถตั้งค่าโดยใช้ window.opener

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.