【发布时间】:2015-07-15 03:10:44
【问题描述】:
我一直在对 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的内容已准备就绪,但头像和“关注@用户名”按钮尚未完成下载。iframe的height属性设置为 0,这样您就看不到没有图像的内容。头像图片已下载,但“关注@username”按钮仍在下载中。内容仍然不可见。
“关注@username”按钮已完成下载。
iframe的height属性设置为匹配iframe内容的高度。时间线现在可见。
现在,我已经尝试了所有我能想到的方法来确定时间线何时可见(没有使用 settimeout/interval)。目标是有一个非轮询事件/函数/回调。这是我迄今为止尝试过的但没有成功的方法:
- 在
iframe上设置事件监听器(例如onload、DOMContentLoaded、DOMFrameContentLoaded等)以了解内容何时完成加载。这不起作用,因为iframe没有src属性。在查看了 uglified 代码后(我找不到未压缩的版本),我的猜测是它正在使用 writes 将内容添加到iframe的正文中。 - 设置事件侦听器以了解
height属性何时更改iframe。从理论上讲,该事件应该触发三次:第一次是在内容加载时,第二次是在height设置为 0 时,第三次是在height设置为显示完全加载的时间线时。但是,我只能在前两种情况下触发事件,而在第三种情况下(我真正想要的情况)永远不会触发。我使用了DOMSubtreeModified、onreadystatechange和onpropertychange,但只有DOMSubtreeModified用于触发事件。 - 在
iframe的内容上设置事件侦听器。因为 JavaScript 可以从 Twitter 到达iframe内部,所以可以抓取iframe内的任何元素(例如document或window)。但是,在iframe的window或document上添加onload、DOMContentLoaded或DOMFrameContentLoaded事件侦听器仍然不会触发这些事件。 - 在“关注@username”按钮上设置事件监听器。该按钮实际上是一个
iframe,它确实有一个src属性。通过设置onload事件,它会在加载时被触发。但是,onload事件总是会触发两次。第一次完成下载,第二次完成处理。在第二次触发之后,将立即显示时间线。但是,要实现这一点很麻烦(我想一切都是如此),因为您必须等待iframe的内容加载,进入内部并获取'follow @username'iframe,设置onload事件然后等待第二个事件触发。 - 使用
twttr.widgets.createTimeline()函数,该函数具有用于回调的可选参数。但是,当内容准备好(第 2 步)时调用回调,而不是当 iframe 可见时(第 4 步)。
此时我可能忘记了更多组合。我知道有一个 github gist 使用 Twitter widget.js,但添加了回调。我无法让它工作。
对不起,日志问题,但我希望有人能够提供帮助。谢谢。
【问题讨论】:
标签: javascript twitter