दिलचस्प पोस्ट
जोरदार टाइप किए गए MVC3 दृश्य से मॉडल पास करने के लिए jquery में AJAX पोस्ट का उपयोग करने का उचित तरीका कस्टम HTTP हेडर: नामकरण सम्मेलनों एक ही पंक्ति में उत्पादन पिछले आउटपुट को ओवरराइट कर रहा है? अजगर (2.5) उद्देश्य-सी प्रतिनिधियों को आमतौर पर बनाए रखने के बजाय संपत्ति को क्यों दिया जाता है? कैसे एक PHP से curl को एक चर में कुकीज़ प्राप्त करने के लिए ब्राउज़र से सटीक ओएस संस्करण का पता लगाएं पायथन यूनिकोड एन्कोड त्रुटि WinRT में UI थ्रेड पर कोड चलाएं Preflight और रीडायरेक्ट के साथ CORS अनुरोध: अस्वीकृत समाधान? अजगर: कई संदर्भ प्रबंधकों पर "के साथ" ब्लॉक बनाएं AngularJS में डेटा बाइंडिंग कैसे काम करता है? पर्यावरण.टिककाउंट बनाम दिनांकटाइम.अब जावा परिणाम के परिणाम की जाँच करें कि क्या कोई परिणाम है या नहीं नोड / एक्सप्रेस: ​​EADDRINUSE, पता पहले से उपयोग में है – सर्वर को मार डालो पायथन सूची भ्रम

कैसे पहचानने के लिए कि एक वेबपेज iframe के अंदर या सीधे ब्राउज़र विंडो में लोड किया जा रहा है?

मैं एक आइफ्रेम आधारित फेसबुक एप लिख रहा हूं अब मैं सामान्य वेबसाइट के साथ-साथ फेसबुक में कैनवास पृष्ठ को प्रस्तुत करने के लिए उसी HTML पृष्ठ का उपयोग करना चाहता हूं। मैं जानना चाहता हूं कि क्या मैं यह निर्धारित कर सकता हूं कि पृष्ठ आईफ्रेम के अंदर या सीधे ब्राउज़र में लोड किया गया है या नहीं?

वेब के समाधान से एकत्रित समाधान "कैसे पहचानने के लिए कि एक वेबपेज iframe के अंदर या सीधे ब्राउज़र विंडो में लोड किया जा रहा है?"

समान मूल नीति के कारण ब्राउज़र window.top तक पहुंच को ब्लॉक कर सकते हैं। आईई कीड़े भी हो सकती हैं यहां काम कर रहे कोड है:

 function inIframe () { try { return window.self !== window.top; } catch (e) { return true; } } 

top और self दोनों window ऑब्जेक्ट्स ( parent के साथ) हैं, इसलिए आप देख रहे हैं कि आपकी विंडो शीर्ष खिड़की है

window.frameElement तत्व को वापस करता है (जैसे <iframe> या <object>) जिसमें विंडो एम्बेडेड है, या नल यदि विंडो शीर्ष-स्तर है तो कोड की पहचान करना ऐसा दिखता है

 if (window.frameElement) { // in frame } else { // not in frame } 

यह मानक और नयी विधि है। यह बिल्कुल क्रोम और फ़ायरफ़ॉक्स में काम करता है मैं इसे सार्वभौमिक समाधान के रूप में नहीं सुझा सकता लेकिन इसका उल्लेख मुझे यहां हुआ होना चाहिए।

रोबॉर्ग सही है, लेकिन मैं एक साइड नोट जोड़ना चाहता था।

आईई 7 / आईई 8 में जब माइक्रोसॉफ्ट ने अपने ब्राउज़र में टैब्स जोड़े तो उन्होंने एक चीज तोड़ दी जो आपके जेएस से तबाह हो जाएगी अगर आप सावधान न हों

इस पृष्ठ लेआउट की कल्पना करो:

 MainPage.html IframedPage1.html (named "foo") IframedPage2.html (named "bar") IframedPage3.html (named "baz") 

अब फ्रेम "बाज़" में आप एक लिंक पर क्लिक करते हैं (कोई लक्ष्य नहीं, "बाज़" फ़्रेम में लोड) यह ठीक काम करता है

यदि पेज लोड हो जाता है, तो उसे विशेष कोड कहते हैं, यह जांचने के लिए जेएस का उपयोग करता है कि "यह" में "बार" नामक एक मूल फ्रेम है, तो वह सही (अपेक्षित) लौटाएगा।

अब बताता है कि जब यह लोड हो रहा है, तो विशेष.html पृष्ठ, पैरेंट फ्रेम (अस्तित्व और उसके नाम के लिए) की जांच करता है, और यदि यह "बार" है, तो वह बार फ्रेम में स्वतः पुनः लोड हो जाता है।

 if(window.parent && window.parent.name == 'bar'){ window.parent.location = self.location; } 

अब तक सब ठीक है। अब बग आता है

कहते हैं कि सामान्य लिंक जैसे सामान्य लिंक पर क्लिक करने और "baz" फ़्रेम में special.html पृष्ठ लोड करने के बजाय, आप इसे मध्य-क्लिक करते हैं या इसे नए टैब में खोलने के लिए चुना करते हैं।

जब वह नया टैब लोड होता है ( कोई भी मूल फ़्रेम्स के साथ नहीं! ) IE पृष्ठ लदान का अंतहीन लूप दर्ज करेगा! क्योंकि IE "जावास्क्रिप्ट में फ्रेम संरचना" पर प्रतियां "" जैसे कि नए टैब में एक अभिभावक है, और उस माता पिता का नाम "बार" है

अच्छी खबर यह है कि जाँच कर रही है:

 if(self == top){ //this returns true! } 

उस नए टैब में सत्य वापस आ जाता है, और इस प्रकार आप इस अजीब स्थिति के लिए परीक्षण कर सकते हैं

स्वीकार्य जवाब ने फ़ायरफ़ॉक्स 6.0 एक्सटेंशन (एडॉन-एसडीके 1.0) की सामग्री स्क्रिप्ट के अंदर मेरे लिए काम नहीं किया: फ़ायरफ़ॉक्स प्रत्येक में सामग्री स्क्रिप्ट को निष्पादित करता है: शीर्ष-स्तरीय विंडो और सभी आईफ़्रॉमें में।

सामग्री स्क्रिप्ट के अंदर मुझे निम्नलिखित परिणाम मिलते हैं:

  (window !== window.top) : false (window.self !== window.top) : true 

इस आउटपुट के बारे में अजीब बात यह है कि यह कोड हमेशा एक iframe या शीर्ष-स्तरीय विंडो में चलाया जाता है या नहीं, इसके समान है।

दूसरी तरफ, Google क्रोम मेरी सामग्री स्क्रिप्ट को केवल शीर्ष-स्तरीय विंडो में ही एक बार निष्पादित करता है, इसलिए ऊपर बिल्कुल भी काम नहीं करेगा।

आखिरकार, दोनों ब्राउज़रों में सामग्री स्क्रिप्ट में मेरे लिए क्या काम किया है:

  console.log(window.frames.length + ':' + parent.frames.length); 

Iframes के बिना यह 0:0 प्रिंट करता है, जिसमें एक फ्रेम वाले एक शीर्ष-स्तरीय विंडो में 1:1 प्रिंट होता है, और एक दस्तावेज की केवल iframe में यह 0:1 प्रिंट करता है।

यह मेरे विस्तार को दोनों ब्राउज़रों में निर्धारित करने की अनुमति देता है यदि कोई भी iframes मौजूद है, और अतिरिक्त फ़ायरफ़ॉक्स में अगर यह एक iframes के अंदर चलाया जाता है

मैं इसका उपयोग कर रहा हूं:

 var isIframe = (self.frameElement && (self.frameElement+"").indexOf("HTMLIFrameElement") > -1); 

चूंकि आप किसी फेसबुक ऐप के सन्दर्भ में पूछ रहे हैं, इसलिए जब आप आरंभिक अनुरोध किए जाते हैं तो आप इसे सर्वर पर खोजना चाहेंगे। Facebook iframe से कहलाता है तो fb_sig_user कुंजी सहित क्वेरी स्ट्रिंग डेटा के एक समूह के साथ गुजरता है।

चूंकि आपको संभवत: आपके ऐप में वैसे भी इस डेटा की जांच करने और उसका उपयोग करने की आवश्यकता हो, इसलिए इसका उपयोग उचित प्रसंग को निर्धारित करने के लिए करें।

यह कैसे पूरा करने के लिए एक उदाहरण के रूप में इस जावास्क्रिप्ट फ़ंक्शन का उपयोग करें।

 function isNoIframeOrIframeInMyHost() { // Validation: it must be loaded as the top page, or if it is loaded in an iframe // then it must be embedded in my own domain. // Info: IF top.location.href is not accessible THEN it is embedded in an iframe // and the domains are different. var myresult = true; try { var tophref = top.location.href; var tophostname = top.location.hostname.toString(); var myhref = location.href; if (tophref === myhref) { myresult = true; } else if (tophostname !== "www.yourdomain.com") { myresult = false; } } catch (error) { // error is a permission error that top.location.href is not accessible // (which means parent domain <> iframe domain)! myresult = false; } return myresult; } 

मुझे यकीन नहीं है कि यह उदाहरण पुराने वेब ब्राउज़र के लिए कैसे काम करता है, लेकिन मैं इसके बिना आईई, फ़ायरफ़ॉक्स और क्रोम के लिए इसका उपयोग करता हूं और जारी करता हूं:

 var iFrameDetection = (window === window.parent) ? false : true; 
 if(typeof(parent) == 'undefined') { console.log('Not Iframe'); } else { console.log('iframe'); } 

यदि आप जानना चाहते हैं कि उपयोगकर्ता फेसबुक ऐप टैब या कैनवास से साइन इन अनुरोध के लिए अपना ऐप एक्सेस कर रहा है। यदि आप इसे नहीं प्राप्त करते हैं, तो शायद उपयोगकर्ता फेसबुक से एक्सेस नहीं कर रहा है सुनिश्चित करें कि हस्ताक्षरित_संदर्भ क्षेत्र की संरचना और क्षेत्रों की सामग्री की पुष्टि करें।

Php-sdk के साथ आप इस तरह साइन-इन अनुरोध प्राप्त कर सकते हैं:

 $signed_request = $facebook->getSignedRequest(); 

आप यहां साइन-इन अनुरोध के बारे में अधिक पढ़ सकते हैं:

https://developers.facebook.com/docs/reference/php/facebook-getSignedRequest/

और यहाँ:

https://developers.facebook.com/docs/reference/login/signed-request/

यह कोड का एक प्राचीन टुकड़ा है जिसे मैंने कई बार उपयोग किया है:

 if (parent.location.href == self.location.href) { window.location.href = 'https://www.facebook.com/pagename?v=app_1357902468'; } 
 if (window.frames.length != parent.frames.length) { page loaded in iframe } 

लेकिन अगर आईफ्रेम की संख्या आपके पृष्ठ और पेज में अलग होती है जो आपको आईफ्रेम में लोड कर रहे हैं। इस कोड के परिणाम की 100% गारंटी रखने के लिए अपने पृष्ठ में कोई आइफ्रेम न बनाएं

प्रत्येक पेज में यह जावास्क्रिप्ट लिखें

 if (self == top) { window.location = "Home.aspx"; } 

तो यह स्वतः होम पेज पर रीडायरेक्ट करेगा