【问题标题】:How does twitter give me a callback for tweeting?twitter 如何给我发推文的回调?
【发布时间】:2011-11-09 02:26:48
【问题描述】:

Tweet 按钮通常是:

<a href="https://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-via="someone">Tweet</a>
<script type="text/javascript" src="//platform.twitter.com/widgets.js"></script>

在这里我可以在用户发推文时得到回调:

<script>
  twttr.events.bind('tweet', function(event) {
    console.log(event);
  });
</script>

我不明白的是:twitter 是如何给我这个回调的?推文是在另一个窗口和另一个域中完成的。这怎么可能?

【问题讨论】:

标签: javascript jquery twitter callback


【解决方案1】:

据我所知,这是 Twitter 自己实现的 Web Intents,这是一个松散地基于 Androids Intents 功能的 Web API。看起来 Twitter 正在使用 Web Intent 的 JavaScript 实现 (possibly similar to this)。

在这种情况下,Twitter JavaScript 向浏览器注册一个intentintent 是您共享 URL。当用户单击推文按钮时,intent 活动将启动并显示一个新的弹出窗口。

用户点击弹出窗口中的推文按钮,浏览器将事件数据回发到启动活动时指定的回调。回调在widget.js 中指定,您可以使用twttr.events.bind 方法连接到此事件。

有一个很好的例子来说明它是如何在 WebIntents 的 JavaScript github 实现上工作的。

用法

今天使用

目前没有浏览器原生支持此 API。使用本系统 只需将以下代码放入您的网站:

<script src="http://webintents.org/webintents.min.js"></script>

当浏览器开始原生实现这一点时,Shim 将推迟所有 其功能适用于本机界面。

声明

注册您的服务应用程序以能够处理图像 分享只是声明一个意图标签。

<intent 
  action="http://webintents.org/share"
  type="image/*" />

这将注册当前页面共享图像的能力。

调用

要构建一个可以使用共享功能的客户端应用程序,它 就像使用以下代码一样简单:

var intent = new Intent(
    "http://webintents.org/share", 
    "image/*", 
    "http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Three_jolly_kittens.png/800px-Three_jolly_kittens.png"

);
window.navigator.startActivity(intent);

服务

当通过 startActivity 调用服务时,“intent”对象 窗口将填充客户端提供的数据。

window.intent

就是这样。

要将数据发送回调用它的客户端,它很简单 在意图上调用 postResult()。

window.intent.postResult("something cool");

这个例子显然与 Twitter 的实现略有不同,但大体流程是一样的。

以下是 WebIntents API 的其他一些参考资料:

【讨论】:

    【解决方案2】:

    通过 JavaScript 打开的窗口(例如,window.open)获得对在 window.opener 中创建它们的窗口的引用,它们可以使用它与父级“对话”。

    【讨论】:

    • 您能举个例子吗?他们如何做到这一点跨域
    【解决方案3】:

    我不确定你在这里做什么,但跨域 javascript api 是用 jsonp 完成的:Cross-Origin Resource Sharing. http://en.wikipedia.org/wiki/JSONP

    编辑 1: JSONP 是一种访问跨域服务的方法。解决这个问题的一个简单方法是使用循环轮询。不幸的是,当您有很多客户时,轮询无法扩展。通过 tcp 套接字保持持久连接并让服务器 PUSH 向订阅的客户端发送新消息是传统轮询的更好替代方案。

    虽然我没有使用 WebSockets,但如果服务器没有实现循环,服务器可以将数据推送回客户端数据。

    http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

    【讨论】:

    • JSONP 和 CORS 是完全相反的。
    • @eli gray - 我们目前使用 jsonp 来允许用户托管一个调查 javascript 插件,该插件会访问我们的机架空间服务器(不是原始服务器)。引用:“允许页面从不同域中的服务器请求数据的使用模式。JSONP 是解决这个问题的方法”en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing JSONP 和 CORS 并不是“完全对立的”。
    • CORS 正在使用 Access-Control 标头从其他来源请求任何数据(例如 JSON)。 JSONP 是在您的网站上运行的 JavaScript,而不是 JSON,让其他来源完全控制您的网站。
    猜你喜欢
    • 2014-10-24
    • 2011-06-24
    • 2013-12-02
    • 2014-04-19
    • 2014-09-12
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    相关资源
    最近更新 更多