2011-02-04 2 views
4

В приложении facebook мне нужно проверить, что представляет собой верхний фрейм (главное окно), и соответственно показывать контент.Получение URL-адреса верхнего фрейма

Я попытался с помощью следующих действий:

if (top.location.toString().toLowerCase().indexOf("facebook.com") <0) { ... } 

Который работает хорошо, если страница не внутри фрейма, но при загрузке страницы в плавающем фрейме (как это делает, когда используется в качестве приложения facebook) код генерирует

"Uncaught TypeError: Property 'toString' of object # is not a function".

Есть ли способ исправить этот код (с кросс-браузерной совместимостью - возможно, с jQuery)?

Спасибо!

Joel

+1

Вы не можете получить в верхнее местоположение, но вы можете у родителя, используя строку document.referrer. См. Ответ ниже. – mcanfield

ответ

6

Проблема у Вас есть, что вы не можете получить доступ к top.location в различных областях документа.

Это функция безопасности, встроенная в браузеры.

Read up on XSS и почему меры безопасности на месте :)

Вы также можете узнать много интересного, прочитав о the same origin policy

+0

Интересно ... Так есть ли какое-нибудь обходное решение, чтобы узнать, просматриваю ли я в настоящее время страницу через iframe или нет? (увидели, что вы редактируете XSS - спасибо за это. Я понимаю, что доступ к кукам файлов верхнего ранга, например, может быть проблематичным.Но получить имя хоста должно быть разрешено: /) – Joel

+2

Если вы не в iframe 'window.top === window' вернете true –

+0

Работает как шарм, thnx :) – Joel

0

Пробовали ли вы это:

var location = top.location.toString().toLowerCase(); 
if (location.indexOf("facebook.com") <0) { ... } 
+0

Должно быть одинаково. – Joel

1

Это может работать:

if (self!=top && document.referrer.toLowerCase().indexOf("facebook.com") <0) { ... } 

... до тех пор, пока вы не на вести диалог внутри рамки.

Но это на самом деле не является хорошим решением ^^

8

Это правда, что крест касается происхождения не позволит вам получить доступ к этому верхнему расположению окна. Однако, если вы просто хотите, чтобы расположение родительского окна iframe можно было получить через строку document.referrer.

В вашей IFRAME вы бы захватить URL:

var parentURL = document.referrer

https://developer.mozilla.org/en-US/docs/Web/API/document.referrer

Я использовал это успешно в моих собственных приложений IFRAME. Кроме того, имейте в виду, что если вы перемещаетесь внутри своего iframe, реферер изменится.

Николай Zakas имеет рецензию на своем блоге: http://www.nczonline.net/blog/2013/04/16/getting-the-url-of-an-iframes-parent/

3

С Мартином Jespersen посоветовал исправить, я мог проверить адрес в плавающем фрейме и Standart верхнего адрес:

//this is fix for IE 
if (!window.location.origin) { 
    window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: ''); 
    } 

//and here we will get object of address 
var urls = (window.location != window.parent.location) ? document.referrer: document.location; 

//Martins adviced fix for checking if You are not in iFrame  
if (window.top === window) { 
    urls = urls.origin; 
} 

//and now indexOf works in both ways - for iFrame and standart top address 
if (urls.indexOf("facebook.com") != -1) { 
    //do stuff 
} 
Смежные вопросы