<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,但添加回调.我无法让这个工作.
对不起日志问题,但我希望有人能够帮助.谢谢.
解决方法
<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的这个问题的方法.