2013-02-25 33 views
6

मेरे पास कुछ जावास्क्रिप्ट है जो window.open और इंटर-विंडो संचार (जहां नया 'बच्चा' विंडो communicates success/failure to the 'parent' window) के उपयोग पर निर्भर करता है।अंतर-विंडो संचार के लिए ब्राउज़र समर्थन का पता लगाएं

यह (इंटर-विंडो संचार) ज्यादातर मामलों में ठीक काम करता है, लेकिन कुछ ब्राउज़र के लिए काम नहीं करता है जो इंटर-विंडो संचार का समर्थन नहीं करते हैं। उदाहरणों में Windows Phone और iPhone's UIWebView शामिल हैं।

मैं वर्तमान में इन परिदृश्यों का पता लगाने के लिए क्लाइंट-साइड (जावास्क्रिप्ट आधारित) user-agent sniffing करता हूं - और समस्या को हल करने के लिए एक अलग कोड पथ पर फ़ॉलबैक करता हूं।

क्या उपयोगकर्ता-एजेंट स्नीफिंग का कोई विकल्प है जिसका मैं उपयोग कर सकता हूं?

स्पष्ट होने के लिए, window.open काम करता है (जहां काम करता है 'यह अनुरोधित यूआरएल खोलता है')। विश्वसनीय नहीं है। Window.opener और postMessage का उपयोग 'बच्चे' से 'पैरेंट' तक इंटर-विंडो संचार करने के लिए किया जाता है।

+0

बच्चा विंडो.ऑनर संपत्ति तक भी पहुंच सकता है - जो शून्य होना चाहिए - लेकिन दुर्भाग्यवश यह विश्वसनीय पहचान तकनीक नहीं है। उदाहरण के तौर पर, यदि आप सीधे बच्चे की खिड़की खोलते हैं (माता-पिता से window.open का उपयोग किए बिना) तो window.opener शून्य हो जाएगा, भले ही बच्चा वास्तव में इंटर-विंडो संचार का समर्थन करता हो। – mjwills

+0

मुझे पता है कि 'window.open' काम करेगा, लेकिन क्या फ़ंक्शन बाल विंडो आईडी लौटाएगा? – Raptor

+0

मुझे यकीन नहीं है कि यह जानकारी कैसे मदद करेगी। मैं जो चाहता हूं वह बाल खिड़की के अंदर फीचर डिटेक्शन है कि क्या यह अपने माता-पिता से बात कर सकता है या नहीं। Window.open फ़ंक्शन कॉल का वापसी मूल्य केवल माता-पिता के लिए उपलब्ध है - इसलिए 'यह इस एयरटाइट हैचवे के दूसरी तरफ होने के बजाय शामिल है'। यह सब कहा जा रहा है, वापसी मूल्य की जांच मोबाइल आईई 9 में शून्य, और UIWebView में एक विंडो ऑब्जेक्ट। और ध्यान दें कि दोनों मामलों में नई विंडो सही ढंग से लोड की गई थी (लेकिन इसके माता-पिता के साथ संवाद करने में असमर्थ रहेगी)। – mjwills

उत्तर

2

अपने सलामी बल्लेबाज खिड़की संदेश कॉलबैक में आप इस तरह चाइल्ड विंडो को वापस एक जवाब भेज सकेंगे:

function yourMessageCallback(event) { 
    // your other handler stuff here... 
    event.source.postMessage('Yeah I got it', event.origin); 
} 

तो फिर तुम भेजने पक्ष यह है कि आप स्पष्ट कर सकते हैं जब जबाब आता है पर एक टाइमर कर सकते हैं:

// do your postmessage here 

function notReceived() { 
    // do stuff if the message didn't go through 
} 

var messageTimer = setTimeout(notReceived, 500); // 500ms should be enough for everyone? 

window.addEventListener('message', function(event) { 
    // do necessary origin checks first etc... (not shown here) 

    if (event.data == 'Yeah I got it') { 
    clearTimeout(messageTimer); 
    // do stuff if the message went through 
    } 
}, false); 

मुझे पता है कि यह थोड़ा हैकिश समाधान हो सकता है लेकिन शायद उपयोगकर्ता एजेंट स्नीफिंग से कम हो सकता है?

+0

मुझे डर है कि मैं आपके प्रस्ताव @ सैक्टर को गलत समझ सकता हूं। क्या पहली कोड ब्लॉक को मूल विंडो के अंदर रखा जाना चाहिए और दूसरे को बच्चे की खिड़की के अंदर रखा जाना चाहिए? ध्यान रखें कि [माता-पिता के लिए पोस्ट मैसेज काम नहीं करेगा] (http://stackoverflow.com/a/12265816/34092)। – mjwills

+0

या आप सुझाव दे रहे हैं कि 'बस पोस्ट मैसेज का प्रयास करें, और अगर हमें' एक 'वापस नहीं मिलता है तो हम जानते हैं कि यह काम नहीं करता है। यह काम कर सकता है लेकिन संभवतः मेरे मूल पोस्ट पर दूसरी टिप्पणी के समान समस्या है। तो यदि बच्चे की खिड़की सीधे ब्राउज़र में अंतिम उपयोगकर्ता द्वारा खोला जाता है - माता-पिता की खिड़की के बजाय। ओपन - तो आपकी प्रस्तावित तकनीक यह पता लगाने में सक्षम नहीं होगी कि अंतर-फ्रेम संचार समर्थित है या नहीं। – mjwills

+0

हां, मैं सिर्फ यह जांचने का सुझाव दे रहा हूं कि हमें वापस आ गया है या नहीं। मैंने सोचा था कि आपका लक्ष्य यह जांचना था कि क्या आप वास्तव में माता-पिता को संदेश प्राप्त कर सकते हैं, भले ही यह सैद्धांतिक रूप से संभव न हो (यदि यह गलत तरीके से नहीं खोला गया था)। इसके लिए मुझे दुर्भाग्य से कोई जवाब नहीं है। – sactor

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