Cóż, wygląda to dziwnie, ale nie jestem w stanie znaleźć rozwiązania.
Dlaczego na świecie takie skrzypce http://jsfiddle.net/carlesso/PKkFf/ pokazują zawartość strony, a kiedy pojawia się google.load, strona staje się pusta?
Działa dobrze, jeśli plik google.load jest wykonywany natychmiast, ale opóźnienie go w ogóle nie działa.
Oto źródło strony dla bardziej leniwych (lub mądrzejszych) z was:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Ciao</title>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
</head>
<body>
<h1>Test</h1>
<div id="quicivanno">
<p>ciao</p>
</div>
</body>
<script type="text/javascript">
setTimeout(function() {google.load('visualization', '1.0', {'packages':['corechart']});}, 2000);
</script>
</html>
javascript
google-visualization
google-loader
Enrico Carlesso
źródło
źródło
Odpowiedzi:
Wygląda na to, że google.load dodaje skrypt do strony za pomocą funkcji document.write (), która w przypadku użycia po załadowaniu strony usuwa kod HTML.
To wyjaśnia bardziej szczegółowo: http://groups.google.com/group/google-ajax-search-api/browse_thread/thread/e07c2606498094e6
Korzystając z jednego z pomysłów, możesz użyć wywołania zwrotnego dla obciążenia, aby wymusić użycie dołączania zamiast doc.write:
Pokazuje to 2-sekundowe oczekiwanie z oknem opóźnionego alertu
źródło
Musisz tylko zdefiniować callback, a nie wyczyści strony (być może starsze wersje google.load () tak, ale najwyraźniej nowe nie są używane z callbackiem). Oto uproszczony przykład, kiedy ładuję bibliotekę „google.charts”:
Gdy robię to bez wywołania zwrotnego (), nadal otrzymuję pustą stronę - ale z wywołaniem zwrotnym jest to dla mnie naprawione.
źródło
Uwaga: Poniższe wskazówki są przydatne, aby uniknąć opóźnień czasowych - są w samą porę. Przykład może być używany ogólnie przez wszystkie skrypty (które go potrzebują), ale był szczególnie używany z Greasemonkey. Jako przykład wykorzystuje również interfejs API wykresów Google, ale to rozwiązanie wykracza poza inne interfejsy API Google i może być używane w dowolnym miejscu, w którym trzeba czekać na załadowanie skryptu.
Używanie google.load z wywołaniem zwrotnym nie rozwiązało problemu podczas używania Greasemonkey do dodawania wykresu Google. W trakcie procesu (Greasemonkey wstrzyknięty na stronę), dodawany jest węzeł skryptowy www.google.com/jsapi. Po dodaniu tego elementu dla javascript jsapi Google, wstrzykiwany (lub stronicowy) skrypt jest gotowy do użycia polecenia google.load (które należy załadować w dodanym węźle), ale ten skrypt jsapi jeszcze się nie załadował. Ustawienie limitu czasu zadziałało, ale limit czasu był jedynie obejściem wyścigu czasowego ładowania skryptu Google jsapi ze skryptem injected / page. Poruszanie się po miejscu, w którym skrypt wykonuje plik google.load (i prawdopodobnie google.setOnLoadCallback), może wpłynąć na sytuację wyścigu czasowego. Poniższe oferuje rozwiązanie, które czeka na załadowanie elementu skryptu Google przed wywołaniem google.load. Oto przykład:
źródło
Nie musisz ustawiać limitu czasu. Jest inny sposób:
Wyjaśnienie:
zostanie wykonany po pomyślnym załadowaniu skryptu JSAPI, a następnie alert () zostanie wykonany po pomyślnym załadowaniu google.load ()
źródło
Napotkałem ten problem podczas próby przeniesienia
google.load(…)
wewnątrz$(document).ready(…)
opakowania jQuery . Przeniesieniegoogle.load(…)
tyłu poza gotową funkcję tak, aby wykonywała się natychmiast, rozwiązało problem.Na przykład to nie działa:
Ale to robi:
źródło