javascript - Soundcloud Javascript API - 连接 window.opener.setTimeout() 不工作

标签 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()?

预先感谢您的帮助。

最佳答案

在经历了数小时无望的调试之后才弄明白了这一点。

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

<!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/

相关文章:

c# - 如何在 Selenium 中自动接受 Chrome 的 "Always open these types of links in the associated app"对话框

Delphi OAuth 身份验证

node.js - 尝试在 Electron 桌面应用程序中使用 oauth 流(使用 Spotify API)?

javascript - 使用 python Crypto.Cipher 进行 AES 解密

javascript - 未捕获的类型错误 : undefined is not a function

google-chrome - Google Chrome的盔甲在哪里?

java - 如何在 Android OKHTTPClient 请求上设置(OAuth token )授权 header

javascript - 生成 qooxdoo api 并忽略错误

javascript - 如何使用 jQuery 显示数据库中的图像而不是图像路径

javascript - 正则表达式没有捕获值(value)