Twitter嵌入式时间线回调
Twitter Embedded Timeline Callback
我对Twitter的嵌入式时间线做了很多研究。我一直在想是否有可能知道时间线何时加载完毕,在页面上显示。这一问题已被要求解决,但尚未得到落实。我已经走到了死胡同,我希望有人能帮我找到解决方案。以下是我迄今为止的发现:
添加嵌入式时间线的代码:
<a class="twitter-timeline" href="https://twitter.com/twitterapi" data-widget-id="YOUR- WIDGET-ID-HERE">Tweets by @twitterapi</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
运行脚本时会发生什么:
该脚本将
<a>
标记替换为<iframe>
元素。iframe
的内容已经准备好了,但头像和"关注@用户名"按钮尚未下载完成。iframe
的height
属性设置为0,这样您就看不到没有图像的内容。头像图像已下载,但"关注用户名"按钮仍在下载中。内容仍然不可见。
"关注用户名"按钮已完成下载。
iframe
的height
属性设置为与iframe
内容的高度相匹配。时间线现在可见。
现在,我已经尝试了我能想到的一切来弄清楚时间线何时可见(使用settimeout/interval在没有的情况下)。目标是拥有一个非轮询事件/函数/回调。以下是我迄今为止没有成功的尝试:
- 在
iframe
上设置事件侦听器(如onload
、DOMContentLoaded
、DOMFrameContentLoaded
等),以了解内容何时完成加载。这不起作用,因为iframe
没有src
属性。在浏览了放大的代码(我找不到未压缩的版本)之后,我猜测它正在使用写入将内容添加到iframe
的主体中 - 将事件侦听器设置为知道
iframe
上的height
属性何时更改。理论上,此事件应激发三次:第一次是在内容加载时,第二次是在height
设置为0时,第三次是在将height
设置为显示完全加载的时间线时。然而,我只能在前两个案例中启动该活动,而在第三个案例中(我真正想要的案例)从未启动。我使用了DOMSubtreeModified
、onreadystatechange
和onpropertychange
,但只有DOMSubtreeModified
可以触发事件 - 在
iframe
的小区上设置事件侦听器。因为JavaScript可以从Twitter访问iframe
内部,所以可以获取iframe
内部的任何元素(例如document
或window
)。然而,在iframe
的window
或document
上添加onload
、DOMContentLoaded
或DOMFrameContentLoaded
事件侦听器仍然不会激发这些事件 - 在"follow@username"按钮上设置事件侦听器。该按钮实际上是一个具有
src
属性的iframe
。通过设置onload
事件,它将在加载时被激发。但是,onload
事件将始终激发两次。第一次当它完成下载时,第二次当它已经完成处理时。在第二次触发之后,将立即显示时间线。不过,要实现这一点非常困难(我想一切都是这样),因为你必须等待iframe
的内容加载,进入内部并获得"follow@username"iframe
,在上面设置一个onload
事件,然后等待第二个事件启动 - 使用
twttr.widgets.createTimeline()
函数,该函数具有用于回调的可选参数。但是,当内容准备好时(步骤2)调用回调,但当iframe可见时(步骤4)不调用回调
在这一点上,我可能还忘记了一些组合。我知道有一个github要旨使用了Twitter widget.js
,但添加了回调。我无法让它发挥作用。
很抱歉出现日志问题,但我希望有人能帮忙。谢谢
即使已经1个月了,我也会在这里发布我的解决方案,以防有人再次发现这篇文章,我所要做的就是轮询,直到iframe的宽度>1作为回调的指标
if ($('.twitter-timeline').length) {
//Timeline exists is it rendered ?
interval_timeline = false;
interval_timeline = setInterval(function(){
console.log($('.twitter-timeline').width());
if ($('.twitter-timeline').hasClass('twitter-timeline-rendered')) {
if ($('.twitter-timeline').width() > 10) {
//Callback
clearInterval(interval_timeline);
DoWhatEverYouNeedHere();
}
}
},200);
}
当您复制并粘贴从Twitter获得的代码时,您必须替换此代码:
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
有了这个:
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";js.setAttribute('onload', "twttr.events.bind('rendered',function(e) {doSomething()});");fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
当然,上面调用的doSomething函数是在加载和渲染嵌入的时间线时运行的回调。
此外,我想这个解决方案在InternetExplorer中不起作用,因为它不支持脚本元素的onLoad事件。然而,这是有解决方案的。
最后,你可以在我写的嵌入推特的时间线刮刀中看到我处理这个问题的方法。
您可以尝试使用Javascript工厂而不是属性绑定。createTimeline方法返回一个promise,这样您就可以在那里链接加载后的活动。请参阅twitter文档:https://dev.twitter.com/web/embedded-timelines/parameters
twttr.widgets.createTimeline(
"YOUR-WIDGET-ID-HERE",
document.getElementById("container"),
{
height: 400,
chrome: "nofooter",
linkColor: "#820bbb",
borderColor: "#a80000"
}
)
.then(function(){
DoSomething();
});
- 回调函数在python代码中离线
- jasmine 2-在jasmine指定的超时时间内未调用异步回调.DEFAULT_TIMEOUT_INTERVAL
- 从多线程C++插件回调NodeJS Javascript函数
- 独立线程上的Javascript回调函数
- setTimeout()在其设置时间之前连续调用回调函数
- JavaScript 回调 - 多线程
- Twitter嵌入式时间线回调
- 使用Twitter回调时,从推文中拆分时间戳
- 使用.confrm()条件调用带有持续时间的jquery.fadeOutput()会打乱回调的时间
- 确定时间范围的回调函数彼此之间不冲突
- ActiveX多线程调用javascript回调例程出现问题
- 摩卡,超过2000ms的超时时间.确保在这个测试中调用了done()回调
- JavaScript:线程安全与异步事件回调?(我需要'挥发物'还是什么?)
- 如何回调OSX上的Safari 5.1插件线程
- 如何回调在线/离线状态
- 动画回调架构和时间测量时,使用html5画布
- 添加到时间轴插件的回调
- 动画回调在错误的时间调用
- node.js事件循环如何记住它需要在长时间运行的操作完成后回调?
- 将JavaScript回调传递给在另一个线程中调用它的FFI函数是否安全?