以下是用于从 iFrame 获取父窗口 URL 的 Google Chrome 版本。
window.location.ancestorOrigins;
我正在寻找与上述 FireFox 和 IE 声明等效的内容。是否可以实现呢?
尝试使用
document.referrer
也仅给出 iFrame Url。
不幸的是,FireFox 和 IE 没有与祖先起源相当的东西。
在获取父 URL 方面,您能做的最好的事情就是
document.referrer
,不幸的是,如果您正在处理 iframe,这意味着您可能无法访问外部页面并获取网页的真实 URL。
我做了这样的事情:
function getAncestorOrigins() {
if (location.ancestorOrigins !== undefined) {
return [...location.ancestorOrigins];
}
const urls = [];
let parentWin = window;
while (parentWin !== window.top) {
if (parentWin.document.referrer) {
try {
const url = new URL(parentWin.document.referrer);
urls.push(url.origin);
} catch (e) {
// console.error
}
}
// @ts-ignore
parentWin = parentWin.parent;
}
return urls;
}
我找到了这个替代解决方案。这对我有用...
var url = window.location != window.parent.location ?
document.referrer :
document.location.href;
一种方法是检查
window.parent[0].top.document
是否存在。
如果查询此对象时没有收到错误,则假设它位于同一域中,否则假设它位于不同域中。
var origins = location.ancestorOrigins;
if ( ! origins ) {
origins = { "length": 1 };
try {
if ( window.parent[0].top.document )
// Chrome & Firefox (same domain)
origins[0] = location.origin;
} catch(err) {
// Firefox (different domains CORS policy)
origins[0] = "*";
};
};
console.log(origins)
if ( origins[ origins.length -1 ] == location.origin ) {
// same domain
alert("Hello word!");
} else {
// different domains
var message = 'alert("Hello word!");';
window.parent.postMessage( message, origins[ origins.length -1 ] );
};