2012-11-16 6 views
9

Załadowałem trzy skrypty na mojej stronie internetowej i chciałbym uruchomić funkcję, gdy dwa z nich zakończy ładowanie.Czy jest możliwe, aby funkcja Head (JS) ready() oczekiwała na dwa skrypty?

head.js(
    { webfont: 'http://ajax.googleapis.com/ajax/libs/webfont/1.0.31/webfont.js' }, 
    { jquery: 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js' }, 
    { analytics: 'http://www.google-analytics.com/ga.js' } 
); 

Idealnie chciałbym być w stanie wykonać następujące czynności, ale nie wydaje się możliwe, aby head.ready() czekać na załadowanie dwóch skryptów, zgodnie z documentation (patrz Organizację Script).

head.ready('jquery', function() { 
    // Code that requires jQuery. 
}); 

// This is not supported. :-(
head.ready('jquery', 'analytics', function() { 
    // Code that requires both jQuery and Google Analytics. 
    // ... 
}); 

Jak zatem rozwiązać ten problem? Jeśli zagnieżdżę gotowe metody, czy mogę mieć pewność, że mój kod zostanie wyzwolony, czy będzie on wyzwalany tylko wtedy, gdy jquery zakończy ładowanie przed analizą?

head.ready('jquery', function() { 
    // Code that requires jQuery. 
    // ... 
    head.ready('analytics', function() { 
     // Code that requires both jQuery and Google Analytics. 
     // ... 
    }); 
}); 

Innym rozwiązaniem może być rozbicie instrukcji ładowania na dwie części, takie jak ta. Ale czy nadal będę w pełni korzystać z asynchronicznego ładowania skryptów, czy też skończy się ładowanie webfontu przed jquery i analityką?

head.js(
    { webfont: 'http://ajax.googleapis.com/ajax/libs/webfont/1.0.31/webfont.js' } 
); 

head.js(
    { jquery: 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js' }, 
    { analytics: 'http://www.google-analytics.com/ga.js' }, 
    function() { 
     // Code that requires both jQuery and Google Analytics. 
     // ... 
    } 
); 

head.ready('jquery', function() { 
    // Code that requires jQuery. 
    // ... 
}); 
+0

nie wiem o HeadJS, ale oczekuję, że takie techniki będą obsługiwać połączenia zagnieżdżone doskonale. Podobnie w Javie 'Process.join()' na wielu procesach jest po prostu nazywane jedno po drugim, ponieważ nawet jeśli kolejność realizacji procesu różni się od kolejności wywołań 'join()', to wcześniej zakończone procesy będą po prostu spowodować, że 'join' natychmiast powróci. Oczekuję wywołania 'ready()' dla już załadowanej biblioteki, aby natychmiast wywołać wywołanie zwrotne (lub przy następnym teście). –

+1

Dokumentacja i strona główna zawierają kilka wyraźnych przykładów oczekiwania na załadowanie wielu skryptów. Co widzisz? –

Odpowiedz

10

Ponieważ skrypty są wykonywane w kolejności (choć załadowany równolegle), można czekać na skrypcie, który był "last-in-line"

head.js(
    { webfont : 'http://ajax.googleapis.com/ajax/libs/webfont/1.0.31/webfont.js' }, 
    { jquery : 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js' }, 
    { analytics: 'http://www.google-analytics.com/ga.js' } 
); 

head.ready('analytics', function() { 
    // when this triggers, webfont & jquery will have finished loading too 
}); 
+0

Złapałeś słowa bardzo poprawne: "Ładują się równolegle, ale wykonują po kolei". +1 dla ciebie. – iMatoria

Powiązane problemy