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

pon*_*cho 3 javascript google-chrome oauth soundcloud

我已经按照连接到他们的开发站点上的SC API的简单示例.我已经设法让一切都在我的本地服务器上运行,但现在我已将它推送到我的网站,它似乎没有工作.

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

<body onload="window.opener.setTimeout(window.opener.SC.connectCallback, 1)">
Run Code Online (Sandbox Code Playgroud)

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

我从2年前发现了一个关于这个的问题:Javascript SDK connect()函数在chrome中不起作用

最佳答案是,如果您拥有SC Chrome应用程序并尝试收听"存储事件"作为解决方法,则尝试执行此操作时会出现问题.

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

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

提前感谢您的帮助.

Jos*_*hua 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>
Run Code Online (Sandbox Code Playgroud)

这有点奇怪,因为函数期望被调用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
Run Code Online (Sandbox Code Playgroud)

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

function (){r.notifyDialog(this.location)}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

<body onload="setTimeout(window.opener.SC.connectCallback)">
Run Code Online (Sandbox Code Playgroud)