我的示例Facebook应用程序昨天在Chrome中运行良好。该页面通过JavaScript SDK集成了Silverlight广告Facebook。我可以查看基本登录状态,登录Facebook,获取您的姓名并注销。
今天,在我没有任何变化的情况下,Chrome在Google搜索结果中出现了一个非常常见的JavaScript错误,但没有真正的答案。它仍然适用于IE和Firefox。
以下是公开网址:
http://www.andrewdothay.net/prj/facebook/
当您在Chrome中打开JavaScript控制台时,会抛出大量这些错误:
不安全的JavaScript尝试使用网址访问框架
来自带有网址http://www.facebook.com/login.php?api_key=151352704876752&cancel_url=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df1175dd3f%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&channel_url=http%3A%2F%2Fwww.andrewdothay.net%2Fprj%2Ffacebook%2F&display=popup&fbconnect=1&locale=en_US&method=auth.login&next=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df3c546942%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&return_session=1&sdk=joey&session_version=3&v=1.0的框架的http://www.andrewdothay.net/prj/facebook/。
域,协议和端口必须匹配。
有关Chrome浏览器的最新动态吗?
更新
我发现今天的机器上的Chrome在我调用FB.login()时阻止了登录弹出窗口,但我知道我昨天没有在JavaScript控制台中收到这190条错误消息。
因此,当我允许Chrome中的弹出窗口时,它确实适用于最终用户,但所有这些新的错误消息都会影响我作为开发人员的诊断体验。
答案 0 :(得分:28)
我找到了解决方案。如果在没有用户操作的情况下执行FB.login,webkit将阻止弹出窗口。
例如,我在我的项目中使用了一个邀请系统。输入/文本输入邀请代码。我检查了邀请代码是否有ajax / post请求。如果它可用,我运行FB.login()。正如您所猜测的,浏览器阻止了弹出窗口,并且在js控制台上出现了大量错误。
因此,您必须在用户操作后运行FB.login()。我将在ajax / post和FB.login()之间放置一个facebook登录按钮。用户必须点击它 - 很糟糕 - 但他们不会发现问题。
顺便说一下,问题在几天之后再次发生。我认为这是关于浏览器的信任系统。当你开发它时,你经常访问很多次,浏览器认为它最初是可靠的。我不确定这部分,但我的解决方案有效。
答案 1 :(得分:5)
在我的情况下,这是因为facebook JS在单页上多次加载:一个用于登录,第二个用于“喜欢”按钮。删除“喜欢”模块中的引用可以节省时间。
答案 2 :(得分:2)
在我的情况下,问题与<div id="fb-root"></div>
标记有关。在开场<body>
标记as recommended by the docs之后,我并未立即将其置于其中。
将它放在正确的位置后,“不安全的JavaScript ...”错误停止了。
答案 3 :(得分:2)
从我的FB.init调用中删除'xfbml:true'选项为我修复了此问题。
我在Android Jelly Bean的默认互联网浏览器中遇到了问题
答案 4 :(得分:1)
MücahitYılmaz是对的。以下面粘贴的示例为例,如果使用setTimeout()方法,则会失败,其他方面也可以。我仍然在循环中收到警告消息,直到我正确登录,但这是一个很小的代价。我相信用户不会看到它。
$(document).ready(function() {
$("#facebook_link").click(function() {
//setTimeout(fb);
fb();
return false;
});
function fb() {
FB.getLoginStatus(function(response) {
if (response.session) {
// logged in and connected user, someone you know
gotResponse(response);
} else {
// no user session available, someone you dont know
FB.login(function(response) {
if (response.session) {
// user successfully logged in
gotResponse(response);
} else {
// user cancelled login, do nothing
}
});
}
});
}
function gotResponse(response) {
console.dir(response);
}
});
重现起来很容易:在另一个标签页面登录Facebook,然后尝试使用此代码,您将看不到任何警告。注销,然后尝试代码,你会收到警告。这是因为它击中了.login块。
答案 5 :(得分:1)
我在Chrome浏览器中遇到此问题,这是由于我的Chrome设置。我将浏览器设置为禁止第三方网站设置cookie数据。允许弹出窗口对我来说不是问题。创建facebook iFrame时,必须设置一个cookie,然后用它来跟踪用户是否需要登录。如果不允许设置该cookie,则该站点将失败。在facebook api中有用的一件事是一个显示某些东西失败的设置。我不认为这是一个可以订阅并分配回调的事件。
这是订阅时FB javascript sdk的链接。对于查找失败请求的回调的任何响应都将受到赞赏 https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/
答案 6 :(得分:1)
在我的情况下,问题与协议类型有关: 从:
<div class="fb-like-box" data-href="https://www.facebook.com/xxxxxx"
为:
<div class="fb-like-box" data-href="http://www.facebook.com/xxxxxx"
由于我的网上商店没有使用https,我从likebox的data-href属性中删除了's'。
答案 7 :(得分:0)
MücahitYılmaz的解决方案也适用于我。我不需要访问用户的信息,因此我从示例应用程序中删除了登录脚本。同时删除了欢迎消息以及需要存储在$basic
变量中的信息的任何信息。