मैं एक iframe आधारित फेसबुक अनुप्रयोग लिख रहा हूँ। अब मैं सामान्य वेबसाइट के साथ ही फेसबुक के भीतर कैनवास पेज रेंडर करने के लिए एक ही html पृष्ठ का उपयोग करना चाहते। मुझे पता है कि अगर मैं पेज iframe के भीतर या सीधे ब्राउज़र में लोड किया गया है कि क्या यह निर्धारित कर सकते हैं?
यदि एक वेबपेज एक iframe के भीतर या सीधे ब्राउज़र विंडो में लोड किया जा रहा है कैसे पहचान करने के लिए?
ब्राउज़र के लिए उपयोग ब्लॉक कर सकते हैं window.topके कारण एक ही मूल नीति । आईई कीड़े भी जगह ले लो। यहाँ काम कर कोड है:
function inIframe () {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}
topऔर selfदोनों कर रहे हैं windowवस्तुओं (के साथ parent), इसलिए यदि आपके खिड़की शीर्ष खिड़की है आप देख रहे हैं।
RoBorg सही है, लेकिन मैं एक पक्ष टिप्पणी जोड़ना चाहते थे।
IE7 / IE8 में जब माइक्रोसॉफ्ट अपने ब्राउज़र के टैब जोड़ा वे एक बात अगर आप सावधान नहीं हैं कि अपने जे एस के साथ कहर का कारण होगा तोड़ दिया।
यह पेज लेआउट कल्पना कीजिए:
MainPage.html
IframedPage1.html (named "foo")
IframedPage2.html (named "bar")
IframedPage3.html (named "baz")
अब फ्रेम "baz" में आप ( "baz" फ्रेम में कोई लक्ष्य, भार) एक लिंक पर क्लिक करें यह ठीक काम करता है।
(उम्मीद) पृष्ठ लोड हो जाता है कि, की सुविधा देता है यदि यह special.html फोन, यदि "यह" नामक एक माता पिता फ्रेम है की जाँच करने के जे एस का उपयोग करता है "बार" यह सच वापस आ जाएगी।
अब कहते हैं कि special.html पेज जब यह लोड करता है, अस्तित्व और उसके नाम के लिए माता-पिता फ्रेम (जाँच करता है, और अगर यह है "बार" यह बार फ्रेम में ही पुन: लोड करने देता है। उदाहरण के लिए
if(window.parent && window.parent.name == 'bar'){
window.parent.location = self.location;
}
अब तक सब ठीक है। अब बग आता है।
बजाय सामान्य की तरह मूल लिंक पर क्लिक करने, और "baz" फ्रेम में special.html पेज लोड करने की सुविधा देता है कहते हैं, आप इसे मध्यम क्लिक करके या फिर एक नया टैब में खोलने के लिए चुना है।
जब कि नए टैब भार ( सब पर कोई माता पिता फ्रेम के साथ! ) आईई पेज लोड हो रहा है की एक अंतहीन लूप में प्रवेश करेंगे! क्योंकि जावास्क्रिप्ट में फ्रेम संरचना ऐसी है कि नए टैब करता है एक माता पिता है, और है कि माता-पिता का नाम "बार" है आईई "से अधिक प्रतियां"।
अच्छी खबर यह है कि जाँच कर रहा है:
if(self == top){
//this returns true!
}
कि नए टैब में सच वापसी करता है, और इस तरह आप इस अजीब हालत के लिए परीक्षण कर सकते हैं।
चूंकि आप एक फेसबुक अनुप्रयोग के संदर्भ में पूछ रहे हैं, तो आप जब प्रारंभिक अनुरोध किया जाता है सर्वर पर इस का पता लगाने पर विचार करना चाहते हो सकता है। फेसबुक fb_sig_user कुंजी अगर यह एक iframe से कहा जाता है सहित डेटा querystring का एक समूह के साथ पारित करेंगे।
के बाद से आप शायद जाँच और अपने एप्लिकेशन में वैसे भी इस डेटा का उपयोग करने की जरूरत है, इसका इस्तेमाल उचित संदर्भ निर्धारित करने के लिए प्रस्तुत करना।
यह कैसे पूरा करने के लिए एक उदाहरण के रूप में इस जावास्क्रिप्ट समारोह का उपयोग करें।
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;
}
स्वीकार किए जाते हैं जवाब एक Firefox 6.0 एक्सटेंशन (हिट्स-एसडीके 1.0) की सामग्री स्क्रिप्ट के अंदर मेरे लिए काम नहीं किया: फ़ायरफ़ॉक्स प्रत्येक में सामग्री स्क्रिप्ट निष्पादित करता है: शीर्ष-स्तरीय खिड़की और सभी iframes में।
सामग्री स्क्रिप्ट के अंदर मैं निम्नलिखित परिणाम प्राप्त:
(window !== window.top) : false
(window.self !== window.top) : true
इस उत्पादन के बारे में अजीब बात यह है कि यह हमेशा एक ही परवाह किए बिना कोड एक iframe या उच्च-स्तरीय विंडो के अंदर चलाया जाता है या नहीं।
दूसरी ओर गूगल क्रोम उच्च-स्तरीय विंडो के भीतर केवल एक बार मेरी सामग्री स्क्रिप्ट निष्पादित करने के लिए है, इसलिए ऊपर बिल्कुल काम नहीं होगा लगता है।
क्या अंत में दोनों ब्राउज़र में एक सामग्री स्क्रिप्ट में मेरे लिए काम किया है:
console.log(window.frames.length + ':' + parent.frames.length);
Iframes के बिना इस प्रिंट 0:0, एक फ्रेम यह प्रिंट से युक्त एक उच्च-स्तरीय विंडो में 1:1, और एक दस्तावेज़ यह प्रिंट का केवल iframe में 0:1।
यह मेरा विस्तार दोनों ब्राउज़र में निर्धारित करने के लिए अगर कोई iframes मौजूद हैं अनुमति देता है, और Firefox में अतिरिक्त यह iframes में से एक के अंदर चलाया जाता है, तो।
ऐसा नहीं है कि मैं कई बार उपयोग किया है कोड का एक प्राचीन टुकड़ा है:
if (parent.location.href == self.location.href) {
window.location.href = 'https://www.facebook.com/pagename?v=app_1357902468';
}
मैं इस का उपयोग कर रहा:
var isIframe = (self.frameElement && (self.frameElement+"").indexOf("HTMLIFrameElement") > -1);
if (window.frames.length != parent.frames.length) { page loaded in iframe }
लेकिन केवल तभी जब iframes की संख्या अपने पृष्ठ और पेज में अलग है आप iframe में लोड कर रहे हैं जो। अपने पृष्ठ में कोई आइफ्रेम बनाने के लिए इस कोड का परिणाम की 100% गारंटी के लिए
प्रत्येक पृष्ठ में इस जावास्क्रिप्ट लिखें
if (self == top)
{ window.location = "Home.aspx"; }
तो यह स्वचालित रूप से घर पृष्ठ पर रीडायरेक्ट करेगा।
आप उपयोगकर्ता हस्ताक्षर अनुरोध के लिए फेसबुक पेज टैब या कैनवास की जांच से आपका ऐप्स एक्सेस है अगर जानना चाहते हैं। आप इसे नहीं मिलता है, शायद उपयोगकर्ता फेसबुक से पर न गया हो। यकीन है कि इस बात की पुष्टि signed_request क्षेत्रों संरचना बनाने के लिए और सामग्री क्षेत्रों के लिए।
php-SDK के साथ आप इस तरह हस्ताक्षर अनुरोध प्राप्त कर सकते हैं:
$signed_request = $facebook->getSignedRequest();
आप हस्ताक्षर अनुरोध के बारे में अधिक पढ़ सकते हैं:
https://developers.facebook.com/docs/reference/php/facebook-getSignedRequest/
और यहाँ:
https://developers.facebook.com/docs/reference/login/signed-request/
window.frameElementतत्व (जैसे <iframe> या <object>), जिसमें खिड़की एम्बेडेड, या रिक्त है यदि विंडो उच्च-स्तरीय है देता है। तो पहचान करने कोड की तरह दिखता है
if (window.frameElement) {
// in frame
}
else {
// not in frame
}
यह मानक है और नहीं बल्कि नई विधि। यह बिल्कुल क्रोम और फ़ायरफ़ॉक्स में काम करता है। मैं सार्वभौमिक समाधान के रूप में की सिफारिश नहीं कर सकते हैं, लेकिन यह यहाँ उल्लेख किया जाना चाहिए मुझे लगता है।
मैं वास्तव में window.parent जाँच करने के लिए इस्तेमाल किया और यह मेरे लिए काम किया, लेकिन हाल ही में खिड़की एक चक्रीय वस्तु है और हमेशा एक माता पिता कुंजी, iframe या कोई आइफ्रेम है।
टिप्पणी के रूप में कठिन काम करता है window.parent के साथ तुलना का सुझाव देते हैं। सुनिश्चित नहीं हैं कि अगर यह अगर आइफ्रेम वास्तव में माता पिता के रूप में एक ही वेबपेज है काम करेंगे।
window === window.parent;
मुझे यकीन है कि कैसे इस उदाहरण पुराने वेब ब्राउज़र के लिए काम करता है नहीं कर रहा हूँ, लेकिन मैं आईई, फ़ायरफ़ॉक्स और बिना क्रोम और जारी करने के लिए इस का उपयोग करें:
var iFrameDetection = (window === window.parent) ? false : true;
बेस्ट के लिए अब लीगेसी ब्राउज़र फ़्रेम ब्रेकिंग स्क्रिप्ट
अन्य समाधान मेरे लिए काम किया नहीं था। यह एक सभी ब्राउज़रों पर काम करता है:
एक तरीका यह क्लिकजैकिंग के खिलाफ की रक्षा करने के लिए प्रत्येक पृष्ठ फंसाया नहीं किया जाना चाहिए में एक "फ्रेम ब्रेकर" स्क्रिप्ट शामिल करने के लिए है। निम्नलिखित कार्यप्रणाली भी लिगेसी ब्राउज़र में फंसाया जा रहा से एक वेबपेज, कि एक्स फ़्रेम-विकल्पों को-हैडर का समर्थन नहीं करते नहीं कर पाएगा।
दस्तावेज़ के शीर्ष तत्व में, निम्नलिखित जोड़ें:
<style id="antiClickjack">body{display:none !important;}</style>
सबसे पहले शैली तत्व में ही करने के लिए एक आईडी लागू होते हैं:
<script type="text/javascript">
if (self === top) {
var antiClickjack = document.getElementById("antiClickjack");
antiClickjack.parentNode.removeChild(antiClickjack);
} else {
top.location = self.location;
}
</script>
इस तरह, सब कुछ दस्तावेज़ के शीर्ष में हो सकता है और आप केवल अपने एपीआई में एक विधि / taglib की जरूरत है।
यह मेरे लिए आसान समाधान किया जा रहा समाप्त हो गया।
<p id="demofsdfsdfs"></p>
<script>
if(window.self !== window.top) {
//run this code if in an iframe
document.getElementById("demofsdfsdfs").innerHTML = "in frame";
}else{
//run code if not in an iframe
document.getElementById("demofsdfsdfs").innerHTML = "no frame";
}
</script>













