我遵循了连接到其开发站点上的 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()?
预先感谢您的帮助。
最佳答案
在经历了数小时无望的调试之后才弄明白了这一点。
将回调拉入脚本标记,如下所示:
<!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
查询参数(身份验证 token )。
希望这是有道理的。至少,它应该可以解决您的问题。
另外,如果你坚持使用body的onload属性,也可以改成这样:
<body onload="setTimeout(window.opener.SC.connectCallback)">
关于javascript - Soundcloud Javascript API - 连接 window.opener.setTimeout() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27408644/