มีไลบรารี JavaScript แบบโอเพ่นซอร์สที่ระบุหลายแท็บเบราว์เซอร์และสถานะไคลเอ็นต์สำหรับเบราว์เซอร์ใหม่หรือไม่ [ปิด]


11

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

ขณะนี้มีไลบรารีเช่น Backbone.js ที่สามารถช่วยจัดการสถานะในแท็บเดียวหรือหน้าต่างเดียว มีอะไรอีกบ้างที่ช่วยในการจัดการแท็บหลาย ๆ แท็บ (หรือหน้าต่าง) ทั่วโลกสถานะเฉพาะของแท็บและการจัดกิจกรรมข้ามแท็บโดยไม่ต้องอาศัยเซิร์ฟเวอร์เพื่อซิงค์ข้อมูลทั้งหมด


2
แอปพลิเคชันเว็บบางตัว (เช่น Trello) กำลังเลี่ยงผ่านสิ่งนี้โดยใช้ WebSockets เพื่อซิงค์ไคลเอ็นต์ทั้งหมดไม่ว่าจะอยู่ในเบราว์เซอร์เดียวกันหรือไม่ก็ตาม แต่มันอาจมีประโยชน์ ถ้าฉันเขียนไลบรารีเช่นนี้ฉันจะสร้างเลเยอร์บาง ๆ บน polyfill สำหรับ SharedWorkers เนื่องจาก SharedWorkers ทำสิ่งที่คุณต้องการที่นี่ แต่ยังไม่ได้รับการสนับสนุนที่ดี การแฮ็คเพื่อให้ทำงานนี้เป็นเหตุการณ์ localStorage ซึ่งจะทำงานแม้ว่าจะเปิดแท็บอย่างอิสระ
mahemoff

1
HTTP is great (and beutiful) because it is statelessวิทยาลัยครูของฉันสอนฉันว่า นับตั้งแต่ฉันเข้าร่วมอุตสาหกรรมฉันกำลังค้นหาสิ่งที่น่าสนใจ แต่ไม่สามารถหาได้ ทุกคนพูดถึงการรักษาสถานะที่คุณเห็นเท่านั้น!
Dipan Mehta

@DipanMehta: ถ้าคุณดู RFC2616 ฉันไม่แน่ใจว่าคุณเห็นด้วยกับอาจารย์ของคุณเกี่ยวกับส่วน "ความงาม" :) แม้ว่าฉันจะให้ความคิดที่ว่า "ไร้สัญชาติล้วนๆ" นั้นยอดเยี่ยมมากและฉันก็พบว่ามีปัญหา ว่าเรากำลังแล่เนื้อมัน ...
haylem

แอปพลิเคชันไร้สัญชาติและเว็บไม่เข้ากันได้ดี สิ่งเล็ก ๆ น้อย ๆ เช่นการเข้าสู่ระบบในรัฐดำเนินการ ดีมากถ้าคุณแค่ให้บริการไฟล์เล็ก ๆ แก่ทุกคนที่ขอให้ฉันเดา
psr

ฉันเขียนห้องสมุดเล็ก ๆเพื่อสื่อสารระหว่างแท็บที่เปิดอยู่ทั้งหมดในเว็บไซต์ของคุณโดยใช้เคล็ดลับ HTML5
catamphetamine

คำตอบ:


3

คำตอบสั้น ๆ :

คุณไม่สามารถอย่างแท้จริงผ่านข้อมูลของรัฐจากแท็บหนึ่งไปยังอีก ...

คำตอบยาว:

คุณไม่สามารถส่งผ่านข้อมูลสถานะจากแท็บหนึ่งไปยังอีกแท็บได้อย่างแท้จริงเนื่องจากจะเป็นการละเมิดช่องโหว่และการรักษาความปลอดภัยอย่างรุนแรง

อย่างไรก็ตามคุณสามารถผ่านสถานะทางอ้อมระหว่างสองแท็บได้โดยทาง:

อีกทางเลือกหนึ่งคือการสื่อสารผ่านคุกกี้เพื่อส่งผ่านข้อมูลระหว่าง 2 แท็บ แต่สิ่งนี้น่าจะทำให้เกิดปัญหาขึ้นกับเบราว์เซอร์สูงและต้องการการโหลดหน้าใหม่(และเพื่อความซื่อสัตย์ฉันไม่เคยลองเลย แต่คนอื่น ๆ ได้ทำ มัน )

ดังนั้นเนื่องจากส่วนขยายเบราว์เซอร์เป็นเส้นทางที่ค่อนข้าง จำกัด คุณควรใช้วิธีการสื่อสารลูกค้า - เซิร์ฟเวอร์และพัฒนาระบบเพื่อให้ลูกค้าสามารถเผยแพร่กิจกรรมไปยังเซิร์ฟเวอร์จากนั้นส่งซ้ำอีกครั้ง (หรือการแพร่ภาพอื่น ๆ ) ให้กับลูกค้ารายอื่นผ่านโปรโตคอลการสื่อสารที่คุณเลือก


อัปเดต 1: ตามที่มีคนพูดถึงในความคิดเห็นก่อนที่จะลบออก (ไม่สามารถให้เครดิตเนื่องจากไม่แสดงในกล่องจดหมายขอโทษ)

HTML5 แนะนำwindow.postMessageAPI

สำหรับตัวอย่างการทำงานให้ดูที่จอห์นเรซิกบล็อกโพสต์ในข้ามหน้าต่างการส่งข้อความ และน่าสนใจมากถ้าคุณดูความคิดเห็นในโพสต์นี้คุณจะสังเกตเห็นคนที่เรียกว่าMalteพูดถึงห้องสมุดที่พวกเขาเขียนเพื่อใช้window.postMessageกับเบราว์เซอร์ที่ทันสมัยหรือรุ่นที่ใช้คุกกี้กับเบราว์เซอร์รุ่นเก่า

อ่านรายละเอียดและตัวอย่างเพิ่มเติมได้จาก:

อัปเดต 2:

เก็บไว้ในใจว่าเป็น 2012/03/04 เป HTML5 ก็ยังคงเป็นร่างเพื่อให้คุณสมบัติบางอย่างอาจถูกลบออก ดังนั้นใช้ด้วยความระมัดระวัง ...


เห็นได้ชัดว่าฉันผิดเพราะ HTML5 แนะนำ window.postMessage API แน่นอน
haylem

นอกจากนี้หากคุณอ่านโพสต์บล็อกของ John Resig บนCross-Window Messagingและความคิดเห็นคุณจะสังเกตเห็นคนที่เรียกว่าMalteพูดถึง [ ไลบรารี่ ] [3] พวกเขาเขียนเพื่อใช้สิ่งนี้กับเบราว์เซอร์สมัยใหม่หรือรุ่นคุกกี้ เบราว์เซอร์รุ่นเก่าดังนั้นสิ่งที่คุกกี้ของฉันไม่ได้บ้า
haylem

3

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


1

หากหน้าต่าง (หน้า) ของคุณมาจากโดเมนเดียวกัน (ต้นกำเนิด) คุณlocalStorageสามารถใช้เพื่อแชร์ข้อมูลและส่งข้อความ สิ่งหนึ่งที่คุณควรพิจารณาคือหน้าต่างเบราว์เซอร์แต่ละหน้า (หน้า) ทำงานในเธรดแยกต่างหาก ดังนั้นหากเรากำลังพูดถึงการสื่อสารข้ามหน้าต่างเรากำลังพูดถึงมัลติเธรด

คุณควรพิจารณาlocalStorageปัญหาบางอย่างกับ IE:

  • ฉันได้ทำการทดสอบ localStorage ใน IE8 แล้ว หลังจากการเปลี่ยนแปลงหลายพันรายการใน localStorage หน้าต่างจากต้นกำเนิดเดียวกันจะหยุดรับเหตุการณ์ 'ที่เก็บข้อมูล' ยิ่งไปกว่านั้นคุณพยายามอ่านจากรายการ localStorage เดียวกันค่าอาจแตกต่างกันในหน้าต่างที่แตกต่างกัน ดังนั้นฉันจะบอกว่า IE8 ไม่สนับสนุน localStorage

  • ตัวจัดการเหตุการณ์ IE9 และ IE10 เรียก 'storage' แม้ว่า localStorage จะถูกเปลี่ยนจากหน้าต่างนี้ ( ซึ่งขัดต่อข้อกำหนด )

  • นอกจากนี้ยังมีปัญหาที่พบกับ IE11

ฉันเพิ่งเผยแพร่ไลบรารี่การสื่อสารระหว่างหน้าต่าง(คุณลักษณะทั้งหมดอธิบายไว้ใน readme) มันให้การแบ่งปันข้อมูลที่ปลอดภัยด้ายการออกอากาศเหตุการณ์ นอกจากนี้ยังแก้ปัญหา IE บางอย่าง (ไม่รองรับ IE8 แน่นอนข้อผิดพลาด IE11 พร้อม iframe ภายในพาเรนต์ต้นทางที่แตกต่างกันอาจแก้ไขได้โดยการแก้ไข IE เท่านั้น - กำลังรอการอัปเดต IE11)

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