javascript – Twitter嵌入式时间线回调

前端之家收集整理的这篇文章主要介绍了javascript – Twitter嵌入式时间线回调前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在对Twitter的嵌入式时间表进行大量的研究.我一直在试图弄清楚是否可以知道时间线何时完成加载并显示页面上.这个 issue has been requested,但还没有实施.我来到一个死胡同,希望有人能够帮助我找到解决方案.这是我到目前为止发现的

添加嵌入式时间轴的代码

<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的内容已经准备好了,但头像图片和’follow @username’按钮没有完成下载. iframe的height属性设置为0,以便您没有看到没有图像的内容.
>头像图像被下载,但’follow @username’按钮仍在下载.内容仍然不可见.
>“follow @username”按钮完成下载. iframe的height属性设置为与iframe的内容的高度相匹配.时间线现在可见.

现在,我已经尝试了所有可以想到的时间线可见(不使用settimeout / interval).目标是进行非轮询事件/函数/回调.这是我迄今为止没有成功的尝试:

>在iframe上设置事件监听器(如onload,DOMContentLoaded,DOMFrameContentLoaded等),以知道内容何时完成加载.这不行,因为iframe没有src属性.经过uglified代码(我无法找到未压缩的版本),我的猜测是它正在使用写入来将内容添加到iframe的主体.
>设置事件侦听器,以了解iframe的height属性更改的时间.理论上,这个事件应该三次启动:第一次当内容加载时,第二个高度设置为0,第三个高度设置为显示完全加载的时间轴.然而,我只能够在前两个案件中触发事件,而不是第三个(我实际想要的那个).我使用DOMSubtreeModified,onreadystatechange和onpropertychange,但只有DOMSubtreeModified用于触发事件.
>在iframe的一部分设置事件侦听器.因为JavaScript可以从Twitter到达iframe内部,所以可以抓取iframe中的任何元素(如文档或窗口).但是,在iframe的窗口或文档上添加onload,DOMContentLoaded或DOMFrameContentLoaded事件监听器仍然不会触发这些事件.
>在“follow @username”按钮上设置事件侦听器.该按钮实际上是一个具有src属性的iframe.通过设置一个onload事件,它将被加载时被触发.但是,onload事件将始终启动两次.第一次完成下载,第二次完成处理.在第二次触发后立即显示时间轴.要实现这个是相当的黑客(我猜所有的东西),因为你必须等待iframe的内容加载,到达内部并获取’follow @username’iframe,设置一个onload事件,然后等待第二件事发生.
>使用twttr.widgets.createTimeline()函数,它具有回调的可选参数.但是,当内容准备就绪(步骤2)时,调用回调函数,但iframe可见时调用(步骤4).

在这一点上我可能还有更多的组合.我知道有一个github gist使用Twitter的widget.js,但添加回调.我无法让这个工作.

对不起日志问题,但我希望有人能够帮助.谢谢.

解决方法

当您复制并粘贴从Twitter获得的代码时,您必须更换:
<script>!function(d,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,"twitter-wjs");</script>

有了这个:

<script>!function(d,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,"twitter-wjs");</script>

当然,上面提到的doSomething函数是当你的嵌入式时间线加载和呈现时运行的回调函数.

此外,我猜这个解决方案在Internet Explorer中不起作用,因为它不支持脚本元素的onLoad事件. Yet there are solutions for that.

最后,你可以看到我在the Twitter embedded timeline scraper I wrote的这个问题的方法.

猜你在找的JavaScript相关文章