我有一个登录弹出窗口,用window.opener.location.href = XXX修改其父页面。代码就是这样的。
if (window.opener) {
window.opener.location.href = window.location.href;
self.close();
}
问题在于,如果某人有我的网页链接,比如说,来自电子邮件的链接,这段代码将被执行,而父级则是电子邮件客户端。这将导致javascript错误,因为我正在尝试更改不属于我的网页。(在Chrome中,它说“不安全的JavaScript尝试使用URL访问框架”)
我想知道是否有办法可以找出window.opener是否来自我的网页。
答案 0 :(得分:2)
不是防弹,但是您可以在主页上定义一些功能,然后检查它是否存在,以检查它是您的页面?包含在try / catch中以避免在页面不属于您时出现其他错误?
// on parent, make this function name something unlikely to appear
// on other pages
function checkParentIdentity() { return "some ID string"; }
// on popup
try {
if (window.opener
&& window.opener.checkParentIdentity
&& window.opener.checkParentIdentify() === "some ID string") {
window.opener.location.href = window.location.href;
self.close();
}
} catch(e) {
// error message here
}
话虽如此,我并不是说它是一个好的想法,只是一个可能适合你现有代码的想法。如果是我,我会将location.href
更新移动到父级的函数中,然后让子窗口调用该函数来告诉父级更新自己 - 这可以通过对代码的最小更改来完成我已经发布。但是,如果是我,我可能根本不会使用弹出窗口,因为我可以在主页面上执行动态对话框覆盖(jQuery的对话框只是一种简单的方法)。
说过 ,为什么人们会直接链接到您的登录页面?假设它们可能,您想要测试右父窗口是否存在的点是登录首次显示,而不是在用户输入其详细信息并尝试提交之后。