Soundcloud Javascript API - 连接window.opener.setTimeout()不起作用

时间:2014-12-10 18:51:37

标签: javascript google-chrome oauth soundcloud

我已经按照连接到其开发站点上的SC API的简单示例。我已经设法让所有东西都在我的本地服务器上运行但是现在我把它推到了我的网站上它似乎没有用。

弹出“连接到应用程序”窗口。我点击连接。它显示了我的'redirect_url'页面,其中包含:

<body onload="window.opener.setTimeout(window.opener.SC.connectCallback, 1)">

但似乎它永远不会被解雇。

我在2年前发现了一个关于此的问题:Javascript SDK connect() function not working in chrome

最重要的答案是,如果你有SC Chrome应用程序并尝试收听“存储事件”作为解决方法,那么尝试执行此操作会出现问题。

我的问题是我没有在Chrome上安装SC应用程序而且从来没有。此外,这在我的本地服务器上完美运行似乎很奇怪。

任何人都可以想到如何将代码移动到我的网络托管中可能已经杀了这个?有些托管公司出于某种原因阻止了window.opener.setTimeout()吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:6)

在经历了数小时的无望调试之后想出来了。

将回调拉入脚本标记,如下所示:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Connect with SoundCloud</title>
  </head>
  <body>
    <b style="text-align: center;">This popup should automatically close in a few seconds</b>
    <script type="text/javascript">
        window.opener.SC.connectCallback.call(this);
    </script>
  </body>
</html>

这有点奇怪,因为该函数希望在window而不是SC上调用,因此调用call()

另一部分是this需要引用弹出窗口的window对象,因为那是window.location.search设置的对象。 URL如下所示:

http://localhost:8080/callback.html?code=<CODE>&state=SoundCloud_Dialog_ca4d6#access_token=<ACCESS TOKEN>&scope=non-expiring

如果你看window.opener.SC.connectCallback,它看起来像这样:

function (){r.notifyDialog(this.location)}

因此,this需要是弹出窗口,而不是原始的父窗口。

如果将connectCallback函数传递给父窗口的setTimeout,则会调用this设置为父窗口的window对象,而该窗口没有window.location.search查询参数(auth令牌)。

希望这是有道理的。至少,它应该解决你的问题。

此外,如果您坚持使用body onload属性,则可以将其更改为:

<body onload="setTimeout(window.opener.SC.connectCallback)">