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的这个问题的方法.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...