JavaScript, чтобы определить, имеет ли родительский фрейм одно и то же происхождение?

Я ищу кросс-браузерный способ определить, является ли родительский фрейм тем же источником, что и мой фрейм, желательно без вывода предупреждений на консоль ошибок JavaScript.

Кажется, что работает следующее, но я бы хотел избежать ошибок при выводе на консоль (по крайней мере, Safari и Chrome делают это при доступе к location.href в родительском фрейме. Firefox выдает исключение, которое можно перехватить):

function parentIsSameOrigin() {
    var result = true;
    try {
        result = window.parent.location.href !== undefined;
    } catch (e) {
        result = false;
    }
    return result;
}

person tlrobinson    schedule 05.04.2010    source источник


Ответы (3)


Я бы сделал что-то вроде:

var sameOrigin;
try
{
    sameOrigin = window.parent.location.host == window.location.host;
}
catch (e)
{
    sameOrigin = false;
}
return sameOrigin;
person Zach    schedule 16.04.2010
comment
Спасибо - это меня реально разозлило! - person jack; 11.08.2013
comment
К сожалению, я провел несколько часов с этим решением, только чтобы узнать, что это не работает для WebKit, где ошибка того же происхождения неуловима. НЕ используйте это решение. - person Spork; 05.09.2013
comment
@Spork, у меня нет этой проблемы с последним Chrome (43). Подскажите, пожалуйста, в каком браузере/версии возникает эта проблема? - person Frédéric; 24.07.2015

Я использую этот метод, чтобы узнать, содержит ли iframe локальный контент,

но вы также можете передать его window.top из iframe

function islocal(win){
var H=location.href,
    local= H.substring(0, H.indexOf(location.pathname));
    try{
        win=win.document;
        return win && win.URL && win.URL.indexOf(local)== 0;
    }
    catch(er){
        return false
    }
}

// предупреждение о контрольном примере (islocal (window.top))

person kennebec    schedule 05.04.2010
comment
Это не кросс-браузер, так как window.URL поддержка сильно различается - person igorsantos07; 08.07.2015
comment
Единственные браузеры, не поддерживающие window.URL, устарели. Итак, если вы не JQuery.... - person Indolering; 03.11.2016

Попробуй это:

function parentIsSameOrigin()
{
    var result = true;
    if (window.parent)
    {
        result = Boolean
        (
            // more precise modifications needed here
            window.this.location.href.indexOf(window.parent.location.href) == 0
        );
    }
    return result;
}
person shinkou    schedule 05.04.2010
comment
Кажется, там есть лишнее this, но даже если я удалю его, я получу предупреждение. Простой доступ к window.parent.location.href вызывает его. - person tlrobinson; 05.04.2010
comment
Это также по-прежнему будет давать такое же исключение происхождения. - person Spork; 05.09.2013