窗口.opener为空,父窗口无法访问自己的弹出窗口,或JavaScript运行时错误0x800706b5 (faceb
window.opener is null, parent window cannot access its own popup, or JavaScript runtime error 0x800706b5 (facebook, twitter login or paypal payments)
在这个问题上花了很多时间之后,我想让任何遇到同样问题的人都能找到解决方案。
常用场景
- 你想实现外部认证与提供商,如Twitter, Facebook,微软,GitHub,或任何其他支持OAuth的网站;或
- 你想实现外部支付的供应商,如Braintree, Paypal等 你已经使用了一个服务器端OAuth库,例如带有NuGet包的Owin来支持Twitter和Facebook,就像在使用New Project向导生成的ASP.net项目中一样。你也可以使用其他库,或者在另一个MVC生态系统中开发,如Ruby或Node.js/React。
- 您希望打开一个窗口来执行身份验证,并在验证成功或失败时关闭该窗口,而不是将用户暂时重定向出您的站点。由于您的站点是单页应用程序,重定向整个视图会破坏用户体验。
- 您正在从本地主机测试所有这些,通过让您的运行操作打开localhost:port。此外,您正在使用IE或Edge作为浏览器。
你连接"Login with XXX"按钮来执行JavaScript,打开一个新窗口,向外部登录控制器发送一个GET请求,然后发送一个302重定向到外部登录提供商的OAuth端点,并附上OAuth信息("挑战"步骤)。
此时,尝试从父窗口访问弹出窗口将抛出JS错误0x800706b5(对象已被处置或不再可用)。这是可以的,因为窗口不再属于我们,直到它重定向回我们的网站。我们用try/catch和eat异常来处理这种极端情况,直到它再次可用为止。用户授权你的应用程序(POST到外部提供商),提供商重定向回你的网站。或者,提供者检测到用户已经登录&批准了这个应用程序,所以它会重定向回你的网站。无论哪种情况。弹出窗口返回到您的区域,其中一个控制器处理了GET。
在弹出窗口中的页面不能访问它的打开器,因为它现在是空的。如果你尝试了一个变通的方法,而不是让它的父存储一个引用,并不断检查try块内的引用,在弹出URI返回到你的域后,引用不会变得有效。如果您将您的站点上传到服务器,这将工作,引用将成为有效的,允许父检查由子设置的窗口变量(如requestingClose),并调用close()来关闭子。
解决方案已经由Alex Altotsky在这个线程中提供:
下面是需要明确的步骤,使您的站点在IE/Edge中运行在本地主机上,能够在重定向后访问其弹出框:
- 进入Internet选项>安全
- 选择可信站点图标(区域)
- 将安全级别更改为与Internet区域的安全级别完全相同的设置(默认为中高)
- 确保启用保护模式与Internet区域相同(默认选中)。 <
- 点击网站/gh>
- 添加http://localhost
- 取消勾选需要服务器验证 关闭站点对话框
- 点击应用到Internet选项对话框
相关文章:
- 关闭黑莓浏览器窗口 JavaScript
- 关闭窗口 Javascript
- 清除窗口Javascript幻灯片
- 弹出窗口JavaScript的站点地图生成器
- 根据弹出窗口javascript的返回值更改asp.net面板的可见性
- 将var添加到新窗口Javascript中
- 如何在引导模式弹出窗口(javascript,jquery)上运行函数
- 仅包含某些数组值的单个弹出窗口.JavaScript
- 将值传递给弹出窗口 [JavaScript]
- 在链接后控制父窗口(JavaScript)
- 将数据发送到单独的窗口javascript
- 正在访问窗口.Javascript 中的应用程序函数
- 将变量从父窗口Javascript函数传递到弹出窗口分区
- 在内容进入打印机之前关闭窗口(JavaScript)
- 窗口.JavaScript中的innerWidth
- 是否可以从子窗口关闭父窗口(Javascript)
- 窗口.javascript中的Innerheight减去数字
- 如果我重写窗口.javascript中的onerror应该返回true还是false
- 计数值后关闭窗口javascript
- 如何在缩略图图像的翻转上显示弹出窗口?Javascript、CSS