Łączę użycie interfejsu API iFrame YouTube i jQuery załadowanego za pomocą znacznika skryptu z ustawioną flagą defer
. Flaga odroczenia musi być ustawiona, ponieważ klient ma doskonały wynik wglądu w stronę Google i chce utrzymać ten wynik.Zdarzenie wyzwalające po załadowaniu jQuery
Interfejs API YouTube po pełnym obciążeniu i gotowości do użycia natychmiastowo wywołuje funkcję, którą definiuję jako onYouTubeIframeAPIReady
. Później zadzwoni pod numer onPlayerReady
, gdy odtwarzacz zostanie w pełni załadowany i wyrenderowany.
Chcę używać jQuery w tej funkcji, ale użycie jQuery wewnątrz funkcji onPlayerReady spowoduje stworzenie warunku wyścigu (mając nadzieję, że biblioteka jQuery zakończyła ładowanie do czasu, gdy zostanie wywołana funkcja onPlayerReady).
Okazało się, że dobrym rozwiązaniem byłoby użycie funkcji onPlayerReady w celu ustawienia zmiennej przed wywołaniem funkcji testującej zarówno odtwarzacz, jak i jQuery. Inna funkcja ustawia zmienną po przygotowaniu jQuery i wywołuje tę samą funkcję testową.
Mam trochę kodu, który działa, ale część, która sprawdza jQuery wydaje się być niechlujny dla mnie, a także wprowadza niewielką ilość dodatkowego niepotrzebnego opóźnienia. Zastanawiam się, czy ktoś wie o lepszym sposobie uruchamiania czegoś, co natychmiast stanie się dostępne. Zasadniczo, czy są dostępne wywołania zwrotne dla jQuery wbudowane w samej bibliotece?
Mój bieżący kod wygląda następująco:
var ready = {
'jquery': false,
'youtube' false
},
testJQueryLoaded;
testJQueryLoaded = function() {
if(typeof jQuery == 'undefined') {
window.setTimeout(function() {
testJQueryLoaded();
}, 25);
return;
}
ready.jquery = true;
postLibraryLoad();
};
testJQueryLoaded();
function onYouTubeIframeAPIReady() {
// Stuff
};
function onPlayerReady() {
ready.youtube = true;
postLibraryLoad();
};
function postLibraryLoad() {
if(!ready.jquery || !ready.youtube) {
return;
}
// More stuff
};
Nie, nie ma takiego zdarzenia. możesz jednak dołączyć tag skryptu za pomocą javascript i słuchać jego zdarzeń. –