5

我对此感到非常困惑,所以如果有人能提供线索,我将不胜感激。

这是我的网站(内置 Rails): http: //floating-autumn-3174.herokuapp.com/

当有人试图通过 Facebook 或 Twitter 上的链接访问该网站时,基本上会加载一个新标签,但随后会立即关闭。这只发生在 Chrome 中。在 Firefox 中运行良好。

如果我右键单击该链接,然后选择“在新选项卡中打开”它加载正常。

如果我右键单击并复制链接,它就可以正常工作。

我认为这可能与 SSL 重定向有关,但我用我的登台环境(无 SSL)进行了测试,它工作得很好。

所以基本上这种自动关闭只发生在 Chrome 中,并且在单击加载新标签的链接时发生。

任何线索发生了什么或如何更好地解决这个问题?

编辑

好的,在进一步研究了我们包含的 javascripts 之后,我相信我已经找到了问题所在。它涉及我们用来处理弹出窗口的一些 JS。首先让我解释一下我们要做什么。我们通过 Facebook 进行身份验证。当用户单击“通过 Facebook 登录”时,会弹出一个弹出窗口并进行身份验证。成功后,弹出窗口关闭,主窗口刷新为登录状态。这一切都很好,但我意识到弹出关闭代码正在杀死所有其他新窗口。下面是完整的代码片段:

function popupCenter(url, width, height, name) {
 var left = (screen.width/2)-(width/2);
 var top = (screen.height/2)-(height/2);
 return window.open(url, name,     "menubar=no,toolbar=no,status=no,width="+width+",height="+height+",toolbar=no,left="+left+",top="+top);
}

$(document).ready(function(){
$("a.popup").click(function(e) {
popupCenter($(this).attr("href"), $(this).attr("data-width"), $(this).attr("data-height"), "authPopup");
e.stopPropagation(); return false;
});


if(window.opener) {
 window.opener.location.reload(true);
 window.close()
}
});

最后一个 if 语句是我认为导致问题的原因。我是一个严肃的 JS 菜鸟,所以我不知道如何解决这个问题。基本上,如果链接用于弹出窗口,我只希望触发最后一个条件。我怎么能这样做呢?再次感谢所有帮助。

编辑 2

我在下面继续 Rob 的回答,并认为它正在工作,但实际上遇到了一个我希望得到帮助的边缘案例。显然,当用户第一次通过 Facebook 身份验证时,window.name 不再是“authPopup”。我认为那是因为弹出窗口实际上经历了多个步骤,并以请求权限的屏幕结束。在这种情况下,弹出窗口不会关闭。在任何后续登录时,弹出窗口都会关闭,因为它不需要完成所有步骤并且“authPopup”条件保持为真。我怎么能处理这个?

编辑 3

我已经找到了一个我认为可行的解决方案。根据 Rob 的建议,我首先查看了 Facebook auth 屏幕的窗口名称,但发现它每次都会更改并且不容易预测。所以我决定走全局变量路线。这是我正在使用的最终代码,以防其他人发现它有用。

function popupCenter(url, width, height, name) {
 var left = (screen.width/2)-(width/2);
 var top = (screen.height/2)-(height/2);
 popupValue = "on";
 return window.open(url, name, "menubar=no,toolbar=no,status=no,width="+width+",height="+height+",toolbar=no,left="+left+",top="+top     );
}

$(document).ready(function(){
$("a.popup").click(function(e) {
popupCenter($(this).attr("href"), $(this).attr("data-width"), $(this).attr("data-height"), "authPopup");
e.stopPropagation(); return false;
});


if(window.opener && window.opener.popupValue === 'on') {
 delete window.opener.popupValue;
 window.opener.location.reload(true);
 window.close()
}
});
4

2 回答 2

3

只需检查window.name属性的值:

if (window.opener && window.name === 'authPopup') {
    window.opener.location.reload();
    window.close();
}

此外,您还可以验证打开器的 URL,以便其他网站在名为“authPopup”的窗口中打开您的网站时不会刷新。由于页面在同一个域中,您还可以在原始窗口中设置一个变量,以便在用户导航离开时页面不会刷新到另一个页面。

于 2012-06-27T18:02:11.937 回答
1

附加到页面的 jQuery 副本存在一个神秘问题line 23

 <script src="/assets/application-21790dbf22ce0f60b3dc6f16af392f76.js" type="text/javascript"></script>

使用来自jquery.com的当前版本的 jQuery 替换此文件的内容可解决此问题,或者您可以使用 CDN 托管副本:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

使用下载的页面副本测试此修复。

胭脂 jQuery 脚本被缩小了,因此几乎不可能/真的很愚蠢地弄清楚它到底有什么问题......我看到的主要区别是损坏的副本包含window.close()而当前的 jQuery 副本不包含。可能是一个损坏的插件。

编辑:

进一步检查,这解决了问题,但揭示了另一个问题:在滑块中更改页面会关闭打开的选项卡。您是否将远程内容拉入轮播元素?我现在也懵了!

于 2012-06-27T08:59:28.047 回答