Ich habe viel über Twitter's Embedded Timelines geforscht. Ich habe versucht herauszufinden, ob es möglich ist zu wissen, wann die Timeline fertig geladen ist und auf der Seite anzeigt. Diese issue has been requested ist aber noch nicht implementiert worden. Ich bin in eine Sackgasse geraten und hoffe, dass jemand mir helfen kann, die Lösung zu finden. Hier ist, was ich bisher gefunden:Twitter Embedded Timeline Callback
Der Code ein Embedded Timeline hinzuzufügen:
<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>
Was passiert, wenn das Skript ausgeführt wird:
Das Skript ersetzt den
<a>
-Tag mit ein Element.Der Inhalt der
iframe
sind bereit, aber das Avatar-Bild und die "Follow @Benutzername" -Schaltfläche werden nicht heruntergeladen. Dasiframe
height
Attribut wird auf 0 festgelegt, damit Sie den Inhalt ohne die Bilder nicht anzeigen.Das Avatar-Bild wird heruntergeladen, aber der Button "follow @username" wird noch heruntergeladen. Der Inhalt ist immer noch nicht sichtbar.
Der Knopf 'follow @username' ist fertig mit dem Herunterladen. Das
iframe
height
Attribut wird festgelegt, um die Höhe des Inhalts desiframe
übereinzustimmen. Die Zeitleiste ist jetzt sichtbar.
Nun, ich habe versucht, alles, was ich mir vorstellen kann, um herauszufinden, wenn die Timeline zu sehen ist (ohne mit setTimeout/Intervall). Das Ziel ist ein nicht abfragendes Ereignis/Funktion/Rückruf. Hier ist, was ich bisher ohne Erfolg versucht:
- Einstellung Ereignis-Listener auf den
iframe
(wieonload
,DOMContentLoaded
,DOMFrameContentLoaded
, usw.) zu wissen, wann der Inhalt fertig geladen ist. Dies funktioniert nicht, da dasiframe
keinsrc
Attribut hat. Nachdem ich den Uglified-Code durchsucht habe (ich konnte keine unkomprimierte Version finden), schätze ich, dass er den Inhalt durch Schreiben in den Body deriframe
einfügt. - Einstellen von Ereignis-Listener, wenn das
height
-Attribut sich aufiframe
ändert. Theoretisch sollte dieses Ereignis dreimal ausgelöst werden: erstens, wenn der Inhalt geladen wird, zweitens, wennheight
auf 0 gesetzt wird, und drittens, wennheight
auf die vollständig geladene Zeitleiste eingestellt ist. Ich konnte das Ereignis jedoch nur für die ersten beiden Fälle und nie für das dritte (das, was ich eigentlich wollte) schießen lassen. Ich verwendeteDOMSubtreeModified
,onreadystatechange
undonpropertychange
, aber nurDOMSubtreeModified
arbeitete für das Auslösen des Ereignisses. - Ereignis-Listener auf den Cotents der
iframe
setzen. Da JavaScript innerhalb deriframe
von Twitter erreichen kann, ist es möglich, jedes Element innerhalb deriframe
(wiedocument
oderwindow
) zu greifen. Durch das Hinzufügen vononload
,DOMContentLoaded
oderDOMFrameContentLoaded
Ereignis-Listener auf derwindow
oderdocument
deriframe
werden diese Ereignisse jedoch noch nicht ausgelöst. - Einstellen von Ereignis-Listenern auf der Schaltfläche "follow @username". Die Schaltfläche ist eigentlich eine
iframe
, die einsrc
Attribut hat. Durch das Setzen einesonload
Ereignisses wird es ausgelöst, wenn es geladen wird. Das Ereignisonload
wird jedoch immer zweimal ausgelöst. Das erste Mal, wenn das Herunterladen abgeschlossen ist, und das zweite, wenn die Verarbeitung abgeschlossen ist. Unmittelbar nach dem zweiten Trigger wird die Timeline angezeigt. Um dies zu implementieren, ist das ziemlich Hack (obwohl ich denke, alles ist), da Sie auf den Inhalt deriframe
warten müssen, zu erreichen, erreichen Sie innerhalb und erhalten Sie die 'folgen @Benutzername'iframe
, setzen Sie eineonload
Veranstaltung darauf, dann warten auf die zweites Ereignis zu feuern. - Verwenden der
twttr.widgets.createTimeline()
-Funktion, die einen optionalen Parameter für einen Rückruf hat. Der Rückruf wird jedoch aufgerufen, wenn der Inhalt bereit ist (Schritt 2), aber nicht, wenn der Iframe sichtbar ist (Schritt 4).
Es gibt wahrscheinlich ein paar mehr Kombinationen, die ich an dieser Stelle vergessen habe. Ich weiß, dass es eine github gist gibt, die das Twitter widget.js
verwendet, aber Rückrufe hinzufügt. Ich konnte das nicht zur Arbeit bringen.
Sorry für die Log-Frage, aber ich hoffe, dass jemand helfen kann. Vielen Dank.
Wie funktioniert dieser Schaber? Ich habe es mir angesehen, und Sie greifen über ein Skript von einer anderen Domäne auf den Inhalt eines IFrame zu, was Sicherheitsfehler verursacht. Es ist eine coole Idee, ich habe mich nur gefragt, ob du etwas extra getan hast, um das zu umgehen. – Andy
@Andy versucht der Scraper nicht auf einen IFrame von einer anderen Domäne zuzugreifen. Das Twitter-Widget enthält ein Skript, das ein IFrame dynamisch erstellt, es jedoch nicht direkt aus einer anderen Domäne lädt, sodass beim Versuch, es zu scrappen, keine Sicherheitsfehler auftreten. – joom
Ich wusste nicht über die 'twttr.events.bind'. Es scheint auch zur richtigen Zeit zu schießen. Für alle anderen, die sich darüber wundern, welche Ereignisse bindbar sind, finden Sie hier Informationen zu allen Veranstaltungen: https://dev.twitter.com/docs/tfw/events. Auch IE8 und darunter unterstützt keine Onload-Ereignisse für Skripts. IE9 + tut (siehe http://peissgood.org/test/script-link-events/). –