2011-08-17 35 views
1

我有一个用window.opener.location.href = XXX修改其父页面的登录弹出窗口。代码就像这样。如何知道window.opener是否来自我的网页?

if (window.opener) { 
     window.opener.location.href = window.location.href; 
     self.close(); 
    } 

这里的问题是,如果有人有一个链接到我的网页,如可以说,从电子邮件中的链接,该代码会被执行,父是电子邮件客户端。这将抛出一个JavaScript错误的原因我想改变一个网页,是不是我的。(在Chrome中,它说:“不安全的JavaScript尝试通过网址访问框架”)

我想知道是否有一种方法我可以找出window.opener是否来自我的网页。

+1

为什么你不能在'try ... catch ...'块中粘住它? – zzzzBov

+0

出于某种原因在铬,它不赶上它 – e3matheus

+1

你可以尝试检查开启者的领域。假设您使用单个域。真正的问题是:你为什么要执行JS重定向? – zzzzBov

回答

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更新移动到父级上的函数中,然后让子窗口调用该函数来告诉父级更新自己 - 这可以通过对我发布的代码进行最小限度的更改来完成。但是,如果是我,我可能根本不会使用弹出窗口,因为我可以在主页上执行动态对话框覆盖thingy(jQuery的对话框只是一个简单的方法)。

并说,为什么人们会直接链接到您的登录页面?假设他们可能,要测试右侧父窗口是否存在的地方是登录首次显示时,而不是在用户输入他们的详细信息并尝试提交之后。

+0

要理解的一件事是在我网站的每一页上,我有一个下拉表单,就像twitter中的一个,所以你可以登录。 所以考虑到这一点,这里是我的答案。 1)location.href不能在父函数中,因为它根据你想要记录的页面而变化。 2)它的Facebook登录弹出窗口,这就是为什么我不使用JQuery对话框。 这就是说,你提供的代码有效。显然,Chrome中的捕获技术确实能够捕获异常,但它仍然会在开发人员工具中显示错误。有没有办法让这个错误不显示? – e3matheus

+0

没有try/catch块没有办法做到这一点吗?在尝试使用它之前无法检查window.opener.location以检查有效性吗?尝试/赶上是相当昂贵的... –

+0

@JoeShelby - 一个单一的try/catch并不昂贵 - 它不像是在一个循环或其他东西。我很高兴知道,如果您想提出建议,还有更好的方法吗? – nnnnnn

相关问题