在Chrome中,Facebook给出了“不安全的JavaScript尝试访问带有URL的框架”错误

我的示例Facebook应用程序昨天在Chrome中工作很好。 该页面通过JavaScript SDK集成了Silverlight和Facebook。 我可以检查基本的login状态,login到Facebook,得到你的名字并注销。

今天,我没有任何改变,Chrome浏览器中有一个JavaScript错误,在Googlesearch结果中很常见,但没有真正的答案。 它仍然在IE和Firefox的伟大。

这是公共URL:

http://www.andrewdothay.net/prj/facebook/

当您在Chrome中打开JavaScript控制台时,会抛出大量这样的错误:


不安全的JavaScript尝试使用URL访问框架

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&显示=popup&fbconnect = 1&语言环境= EN_US&方法= AUTH。login&下一= 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% 26帧%3Df3760623c%26result%3DxxRESULTTOKENxx&return_session = 1&sdk = joey&session_version = 3&v = 1.0从URL http://www.andrewdothay.net/prj/facebook/ 。

域,协议和端口必须匹配。


有关Chrome浏览器正在进行的操作的任何想法?


更新

当我调用FB.login()时,我发现今天的机器上的Chrome阻止了loginpopup窗口,但是我知道昨天我没有在JavaScript控制台中看到这190条错误消息。

所以,当我在Chrome中允许popup式窗口时,它可以为最终用户使用,但是所有这些新的错误信息正在破坏我作为开发人员的诊断经验。

我find了解决scheme。 如果在没有用户操作的情况下执行FB.login,则webkit会阻止popup窗口。

例如,我在我的项目中使用了邀请系统。 有一个input/文字input邀请码。 我检查了邀请代码是可用与ajax / post请求。 如果可用,我运行FB.login()。 正如你所猜测的,浏览器阻止popup窗口和js控制台出现吨错误。

所以你必须在用户操作之后运行FB.login()。 我将在ajax / post和FB.login()之间放置一个Facebookloginbutton。 用户将不得不点击它 – 这很糟糕,但他们不会看到问题。

顺便说一句,问题发生在几天。 我认为这是关于浏览器的信任系统。 当你开发它时,你会多次访问,浏览器认为它起初是可靠的。 我不确定这部分,但我的解决scheme。

在我的情况下,这是因为Facebook的JS在单个页面多次加载:一个login和第二个“喜欢”button。 删除“喜欢”模块中的引用可以节省一天的时间。

从我的FB.init调用中删除'xfbml:true'选项为我解决了这个问题。

我在Android Jelly Bean的默认互联网浏览器中遇到了问题

MücahitYılmaz是正确的。 以我粘贴下面的例子,如果你使用setTimeout()方法失败,其他方式工作。 我仍然得到了一个循环的警告消息,直到我正确login,但这是一个小的代价。 我相信用户不会看到它。

 $(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); } 

});

很容易重现:在另一个选项卡上login到Facebook,然后尝试此代码,您将看不到任何警告。 注销,然后尝试代码,你会得到警告。 这是因为它碰到了.login块。

我有一个铬浏览器的这个问题,这是由于我的铬设置。 我让浏览器禁止第三方网站设置cookie数据。 允许popup窗口对我来说不是问题。 当facebook iFrame被创build时,它必须设置一个cookie,然后用它来跟踪用户是否需要login。 如果不允许设置该cookie,则该站点将失败。 有一件事会在Facebook的API中有用的是一个设置,显示什么时候失败。 我不认为这是一个可以订阅和分配callback的事件。

这里是关于订阅的FB JavaScript SDK的链接。 任何响应find一个callback失败的请求将不胜感激。
https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

在我的情况下,问题与<div id="fb-root"></div>标签有关。 按照文档的build议,我并没有在开始的<body>标签之后直接放置它。

把它放在正确的地方后,“不安全的JavaScript …”错误停止。

在我的情况下,这个问题与协议types有关:从:

 <div class="fb-like-box" data-href="https://www.facebook.com/xxxxxx" 

至:

 <div class="fb-like-box" data-href="http://www.facebook.com/xxxxxx" 

因为我的networking商店没有使用https,我从likebox的data-href属性中删除了's'。

MücahitYılmaz的解决scheme也适用于我。 我不需要访问用户的信息,所以我从示例应用程序中删除了login脚本。 还删除了欢迎消息以及任何需要存储在$basicvariables中的信息的信息。