Laden der Youtube Iframe API mit RequireJS

7

Ich versuche, die Youtube Iframe API in einem Modul mit Require JS zu verwenden. Da diese API async geladen ist und eine Funktion aufruft, sobald sie geladen ist, habe ich ein requireJS-Plugin namens "async" verwendet, das zuvor mit google maps api gearbeitet hat.

Allerdings funktioniert diesmal etwas nicht. Mein Modul beginnt folgendermaßen: define(['text!fmwk/widgets/video/video.html','fmwk/utils/browser','async!http://www.youtube.com/iframe_api'], function (videoTpl,root) { ... });

und die Chrome-Konsole löst diesen Fehler aus: Uncaught Error: Load timeout for modules: async!http://www.youtube.com/iframe_api_unnormalized3,async!http://www.youtube.com/iframe_api http://requirejs.org/docs/errors.html#timeout

Wenn ich kein asynchrones Plugin verwende, sind das Objekt YT oder seine Funktionen nicht definiert, und dasselbe passiert, wenn ich den API-Code herunterlade. Die API wird manchmal geladen, wenn ich ein Skript-Tag in das head-Tag der HTML-Datei lege. All das wird erwartet, aber ich verstehe das nicht, weil das asynchrone Plugin fehlschlägt.

Danke für Ihre Aufmerksamkeit und Hilfe:)

    
davidgnin 11.10.2012, 15:59
quelle

5 Antworten

14

Ich kenne das Plugin async requireJS nicht, aber hier ist ein Beispielcode (aus YouTube Direct Lite ), das die iframe-API asynchron aus einem requireJS-Modul namens player lädt. Es wird jQuery verwendet, um das Laden der Bibliothek durchzuführen.

%Vor%     
Jeff Posnick 13.10.2012, 03:32
quelle
6

Nach einigen Nachforschungen und unzufrieden mit den anderen Antworten, habe ich das für diesen genauen Fall plus mögliche andere ohne den zusätzlichen Flaum gelöst, indem ich den async-Request erweitert habe! Plugin, um einen benannten Callback zu unterstützen, der dann sicherstellt, dass der Modulcode nur ausgeführt wird, sobald die API vollständig geladen ist.

Das Kernproblem scheint zu sein, dass die YouTube Iframe-API es nicht erlaubt, den Callback-Namen zu konfigurieren, sondern diktiert, dass es "onYouTubeIframeAPIReady" ist, was unser kleines Upgrade auf das asynchrone Plugin löst. Diese Lösung verwendet weiterhin das globale window.YT, funktioniert aber ohne jQuery.

%Vor%

Funktioniert auch mit Inline-Requests:

%Vor%

Der Code ist meiner Meinung nach viel sauberer als je zuvor. Außerdem waren die Leistungsverbesserungen durch das Laden der API im letzten Moment enorm, besonders wenn sie mit Dutzenden von Spielern verwendet wurden. Die API wird natürlich nur einmal geladen und wie gewohnt zwischengespeichert.

Aktualisiert! asynchrones Plugin: Ссылка

Pull-Anfrage für das Upgrade! async-Plugin: Ссылка

Das Upgrade sollte vollständig abwärtskompatibel sein Warum gibt es diesen hässlichen undefinierten als ersten Plugin-Parameter. Irgendwelche Ideen, wie man das schöner und einfacher machen kann, sind sehr willkommen.

    
xexe 29.10.2013 20:32
quelle
5

Schritt 1: Erfordern Sie YouTube ohne einen Extension

%Vor%

Schritt 2: Hängen Sie die Funktion onYouTubeIframeAPIReady an das Fensterobjekt an

%Vor%

Schritt 3: Laden Sie asynchron das Skript

%Vor%

Dies wird Ihre onYouTubeIframeAPIReady -Funktion auslösen und Sie sind im Geschäft

    
Varun Arora 08.07.2015 21:34
quelle
3

Eine andere Option, die verwendet, erfordert das Laden des externen Javascript und die Ausgabe eines jQuery-Versprechen-Callbacks mit Kontext für das Laden des Javascript.

%Vor%     
k0nG 15.07.2013 16:09
quelle
3

Konfigurieren Sie requirejs

%Vor%

Verwendung

%Vor%     
zhopon 14.10.2013 08:21
quelle