2009-07-08 12 views
22

मैंने सुना है कि HTML5 में window.postMessage() है, लेकिन ऐसा लगता है कि विंडो (या टैब, इस प्रश्न के दौरान) पर एक हैंडल होने की आवश्यकता है, तो आप संदेश पोस्ट कर रहे हैं। अगर मैं सभी खुली खिड़कियों पर प्रसारण करना चाहता हूं तो क्या होगा? क्या यह संभव है?जावास्क्रिप्ट का उपयोग कर सभी खुली विंडोज़/टैब पर एक संदेश भेजना

(जो मैं करने की कोशिश कर रहा हूं वह बिना किसी सर्वर राउंड-ट्रिप के अन्य विंडो को चेतावनी देता है जब कोई उपयोगकर्ता एक विंडो में कुछ करता है जो दूसरों को प्रभावित करता है, ताकि वे अपनी सामग्री को अपडेट कर सकें। हालांकि, कुछ खिड़कियां हो सकती हैं मौजूदा लोगों से खोला गया - मुझे उनसे संदर्भों को अवरुद्ध करने और स्टोर करने की इजाजत दी गई - कुछ ताजा विंडो उपयोगकर्ता द्वारा मैन्युअल रूप से खोली जा सकती हैं और फिर एक बुकमार्क चुना गया या यूआरएल टाइप किया जा सकता है। इस मामले में ऐसा कोई तरीका नहीं लगता है अवरोध और स्टोर संदर्भ।)

+0

अपने यूज-केस के आधार पर, धूमकेतु (या अन्य इसी तरह "HyBi" mecanism) एक बेहतर विकल्प हो सकता है; उदाहरण के लिए यदि आप अधिसूचना को क्रॉस-ब्राउजर होना चाहते हैं (यानी उपयोगकर्ता ने आईई और फ़ायरफ़ॉक्स खोला है, तो यह आईई में बदलाव करता है, और फ़ायरफ़ॉक्स को सूचित करने की अपेक्षा करता है)। साथ ही, मुझे नहीं पता कि सभी ब्राउज़र कैसे काम करते हैं (कॉन्फ़िगर करने योग्य विकल्प हो सकते हैं जो उनके डिफ़ॉल्ट व्यवहार को बदलते हैं, जैसे फ़ायरफ़ॉक्स के लिए -no-remote कमांड लाइन तर्क) लेकिन एक ही ब्राउज़र के लिए भी, सभी विंडो सक्षम नहीं हो सकती हैं धूमकेतु शैली/सर्वर संचालित संचार के बिना संवाद करने के लिए। –

+0

धन्यवाद, लेकिन मेरे पास पहले से ही सर्वर-साइड फ़ॉलबैक है ... मैं चाहता था कि जब संभव हो तो मैं अधिक कुशल होने के कारण थोड़ा सा स्नैपियर महसूस करूँगा। – Kev

+0

यह सवाल डुप्लिकेट के रूप में क्यों बंद किया गया है, जब इसे माना जाता है कि 6 साल बाद डुप्लीकेट किया गया था? – Kev

उत्तर

19

IMO इस postMessage का उपयोग कर संभव नहीं है। सत्र स्टोरेज स्थानीय स्टोरेज का उपयोग करने के बारे में कैसे? इसे लिखने के लिए एक स्टोरेज इवेंट उत्पन्न करना चाहिए जिसे समान सत्र संग्रहण साझा करने वाली सभी विंडो में प्रचारित किया जाना चाहिए।

+0

या कुकीज़ (जब तक कि वे एक ही डोमेन में हैं) –

+3

कुकीज़ भी एक समाधान हो सकता है, लेकिन भंडारण का लाभ यह है जब उस पर ऑपरेशनों को करने की घटनाओं को उत्पन्न करता है। कुकीज़ का उपयोग करते समय आपको नई कुकीज़ के लिए प्रत्येक एक्स सेकंड (setInterval) की जांच करनी होगी और कुकी को निकालने के लिए एक और समस्या होगी। – Rafael

+0

मुझे सत्र कार्यक्रमों के बारे में पता नहीं था - एमडीसी का सत्र स्टोरेज दस्तावेज थोड़ा भ्रम है। नेतृत्व के लिए धन्यवाद! – Kev

26

मैंने ऐसा करने के लिए एक लाइब्रेरी लिखी है: intercom.js (उसी कारण से आपने रेखांकित किया है)।

वर्तमान में हम यह प्रयोग कर रहे हैं सभी खिड़कियों को सूचनाएं प्रसारित करने के लिए है, तो केवल एक ही खिड़की सर्वर के लिए एक सॉकेट कनेक्शन को बनाए रखने की जरूरत है। जैसा कि कुछ अन्य ने सुझाव दिया है, यह स्थानीय स्टोरेज एपीआई का उपयोग करता है।

intercom.on('notice', function(notice) { 
    console.log(notice.message); 
}); 

इंटरफ़ेस socket.io नकल करने के लिए डिज़ाइन किया गया है

var intercom = Intercom.getInstance(); 

$('a').on('click', function() { 
    intercom.emit('notice', {message: 'Something just happened!'); 
}); 

संदेश पकड़ने के लिए,:

प्रयोग वास्तव में सरल है। http://dueljs.studentivan.ru और डॉक्स:

+0

यह बहुत अच्छा लग रहा है। बेवकूफ सवाल, लेकिन क्या यह विभिन्न डोमेन के बीच काम करता है? मैं 'स्टोरेज' घटनाओं को अलग-अलग डोमेन में विंडोज़ में काम करने की अपेक्षा नहीं करता क्योंकि उनके पास अपना 'लोकल स्टोरेज' होगा। मुझे पता है कि मैं इसका परीक्षण कर सकता हूं, लेकिन मैंने सोचा कि मैं – Ian

+1

से पूछूंगा कि यह एक ही डोमेन पर होना चाहिए:/यदि आप * वास्तव में * पागल होना चाहते हैं तो आप शायद आईफ़्रेम और पोस्ट मैसेज + इंटरकॉम के साथ पागल हो सकते हैं क्रॉस-डोमेन काम कर रहा है। – brianreavis

+0

क्या यह साझा वेब श्रमिकों के लिए फ़ॉलबैक के रूप में प्रभावी ढंग से काम करेगा? मैं एक वेबवर्कर स्थापित करने की कोशिश कर रहा हूं जिसका डेटा टैब के बीच साझा किया गया है, सॉकेट.ओओ के लिए बाध्यकारी के विपरीत नहीं, सिवाय इसके कि यह सर्वर के बजाय कार्यकर्ता के साथ संचार कर रहा है। यदि कार्यकर्ता के साथ टैब बंद है तो इसे एक अलग टैब पर फिर से लॉन्च किया जाना चाहिए। –

संबंधित मुद्दे