Soundcloud Javascript API - Connect window.opener.setTimeout

Soundcloud Javascript API - Connect window.opener.setTimeout() not working

本文关键字:window opener setTimeout Connect Javascript API Soundcloud      更新时间:2023-09-26

我遵循了连接到其开发站点上的SC API的简单示例。我已经设法让所有内容在我的本地服务器上正常工作,但现在我已将其推送到我的网站,它似乎无法正常工作。

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

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

但似乎从未被解雇过。

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

顶部答案是,如果您有SC Chrome应用程序并尝试侦听"存储事件"作为解决方法,则尝试执行此操作存在问题。

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

谁能想到如何将代码移动到我的虚拟主机会杀死它?一些托管公司是否出于某种原因阻止window.opener.setTimeout((?

提前感谢您的帮助。

经过几个小时的无望调试后,想通了这一点。

将回调拉取到脚本标记中,如下所示:

<!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集的对象。网址如下所示:

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查询参数(身份验证令牌(。

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

另外,如果您坚持使用 body onload 属性,您可以将其更改为以下内容:

<body onload="setTimeout(window.opener.SC.connectCallback)">
相关文章: