我对此感到非常困惑,所以如果有人能提供线索,我将不胜感激。
这是我的网站(内置 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()
}
});