Jaki byłby dobry sposób próby załadowania hostowanego jQuery w Google (lub innych bibliotekach hostowanych przez Google), ale załadowania mojej kopii jQuery, jeśli próba Google się nie powiedzie?
Nie twierdzę, że Google jest niestabilny. Są przypadki, w których kopia Google jest zablokowana (na przykład w Iranie).
Czy ustawiłbym licznik czasu i sprawdzał obiekt jQuery?
Jakie byłoby niebezpieczeństwo, że obie kopie przejdą?
Naprawdę nie szukam odpowiedzi typu „po prostu użyj Google” lub „po prostu użyj własnego”. Rozumiem te argumenty. Rozumiem również, że użytkownik prawdopodobnie buforuje wersję Google. Myślę ogólnie o awariach w chmurze.
Edycja: Dodano tę część ...
Ponieważ Google sugeruje użycie google.load do załadowania bibliotek ajax, a po zakończeniu wykonuje wywołanie zwrotne, zastanawiam się, czy to jest klucz do serializacji tego problemu.
Wiem, że to trochę szalone. Próbuję tylko dowiedzieć się, czy można to zrobić w wiarygodny sposób, czy nie.
Aktualizacja: jQuery jest teraz hostowany na CDN Microsoftu.
źródło
Odpowiedzi:
Możesz to osiągnąć w następujący sposób:
Powinno to znajdować się na twojej stronie,
<head>
a wszelkie procedury obsługi zdarzeń gotowe do jQuery powinny być w<body>
celu uniknięcia błędów (chociaż nie jest to głupie!).Kolejnym powodem, dla którego nie należy używać jQuery obsługiwanego przez Google, jest to, że w niektórych krajach nazwa domeny Google jest zbanowana.
źródło
Jak dotąd najłatwiejszy i najczystszy sposób:
źródło
XHTML 1.0
iHTML 4.01
type="text/javascript"
części, więc osobom piszącym HTML dla starszych przeglądarek pamiętaj, że teraz musisz to dodać.type="text/javascript"
było również konieczne w starszych przeglądarkach, ponieważ wszystkie domyślnie używały Javascript. Naprawdę starsze przeglądarki przeglądały tenlanguage
atrybut; ale nawet wtedy JavaScript był domyślny, jeśli brakowało atrybutu.<script src="//cdn1.com/jquery.js"></script> <script>window.jQuery || document.write('<script src="//cdn2.com/jquery.js"><\/script>')</script> <script>window.jQuery || document.write('<script src="local/jquery.js"><\/script>')</script>
Wydaje mi się, że to działa:
Działa to w ten sposób, że używa
google
obiektu, który wywołuje http://www.google.com/jsapi ładowany dowindow
obiektu. Jeśli ten obiekt nie jest obecny, zakładamy, że dostęp do Google nie działa. W takim przypadku ładujemy lokalną kopię za pomocądocument.write
. (W tym przypadku korzystam z własnego serwera, proszę użyć własnego do przetestowania tego).Testuję również obecność
window.google.load
- Mógłbym równieżtypeof
sprawdzić, czy rzeczy są odpowiednio obiektami lub funkcjami. Ale myślę, że to wystarczy.Oto logika ładowania, ponieważ podświetlenie kodu wydaje się nie działać, ponieważ opublikowałem całą stronę HTML, którą testowałem:
Chociaż muszę powiedzieć, nie jestem pewien, że jeśli jest to problem dla odwiedzających twoją witrynę, powinieneś w ogóle bawić się interfejsem API bibliotek Google AJAX .
Ciekawostka : na początku próbowałem użyć do tego bloku try..catch w różnych wersjach, ale nie mogłem znaleźć tak czystej kombinacji. Chciałbym zobaczyć inne implementacje tego pomysłu, wyłącznie jako ćwiczenie.
źródło
Jeśli masz w witrynie modernizr.js, możesz użyć wbudowanego yepnope.js do asynchronicznego ładowania skryptów - między innymi jQuery (z rezerwą).
To ładuje jQuery z Google-cdn. Następnie jest sprawdzane, czy jQuery zostało pomyślnie załadowane. Jeśli nie („nie”), ładowana jest wersja lokalna. Załadowane są również twoje osobiste skrypty - „oba” oznaczają, że proces ładowania jest inicjowany niezależnie od wyniku testu.
Po zakończeniu wszystkich procesów ładowania wykonywana jest funkcja, w przypadku „MyApp.init”.
Osobiście wolę ten sposób asynchronicznego ładowania skryptów. I ponieważ polegam na testach funkcji dostarczonych przez moderatora podczas tworzenia strony, i tak mam to osadzone na stronie. Więc tak naprawdę nie ma narzutów.
źródło
yepnope.js
jest przestarzała. patrz stackoverflow.com/questions/33986561/…Jest tu kilka świetnych rozwiązań, ale chciałbym pójść o krok dalej w kwestii pliku lokalnego.
W scenariuszu, gdy Google zawiedzie, powinien załadować lokalne źródło, ale może fizyczny plik na serwerze niekoniecznie jest najlepszą opcją. Mówię o tym, ponieważ obecnie wdrażam to samo rozwiązanie, tylko chcę wrócić do lokalnego pliku, który jest generowany przez źródło danych.
Moim powodem jest to, że chcę mieć trochę spokoju, jeśli chodzi o śledzenie tego, co ładuję z Google, a co mam na lokalnym serwerze. Jeśli chcę zmienić wersje, chcę zsynchronizować moją kopię lokalną z tym, co próbuję załadować z Google. Myślę, że w środowisku, w którym jest wielu programistów, najlepszym rozwiązaniem byłoby zautomatyzowanie tego procesu, tak aby wystarczyło tylko zmienić numer wersji w pliku konfiguracyjnym.
Oto moje proponowane rozwiązanie, które powinno działać w teorii:
Teoretycznie, jeśli mój kod jest napisany poprawnie, wszystko, co musiałbym zrobić, to zmienić numer wersji w konfiguracji aplikacji, a następnie viola! Masz zautomatyzowane rozwiązanie awaryjne i nie musisz utrzymywać fizycznych plików na serwerze.
Co wszyscy myślą? Może to przesada, ale może to być elegancka metoda zarządzania bibliotekami AJAX.
Żołądź
źródło
Po próbie dołączenia kopii Google z CDN.
W HTML5 nie musisz ustawiać
type
atrybutu.Możesz także użyć...
źródło
[Violation] Avoid using document.write().
Możesz użyć lokalnego pliku jako ostateczności.
Wydaje się, że obecnie własny CDN jQuery nie obsługuje https. Jeśli tak, możesz najpierw załadować stamtąd.
Oto sekwencja: Google CDN => Microsoft CDN => Twoja lokalna kopia.
źródło
Warunkowo załaduj najnowszą / starszą wersję jQuery i powrót do poprzedniej wersji:
źródło
jQuery
zmienną)Jak sprawdzić niezdefiniowaną zmienną w JavaScript
Jak dołączyć plik JavaScript do innego pliku JavaScript?
źródło
Z powodu problemu z banowaniem Google wolę korzystać z cdn Microsoftu http://www.asp.net/ajaxlibrary/cdn.ashx
źródło
Oto świetne wyjaśnienie na ten temat!
Wprowadza również opóźnienia ładowania i limity czasu!
http://happyworm.com/blog/2010/01/28/a-simple-and-robust-cdn-failover-for-jquery-14-in-one-line/
źródło
Dla osób korzystających z ASP.NET MVC 5 dodaj ten kod do pliku BundleConfig.cs, aby włączyć CDN dla jquery:
źródło
AKTUALIZACJA:
Ta odpowiedź okazała się błędna. Zobacz komentarze do prawdziwego wyjaśnienia.
Odpowiedzi na większość z was udzielono odpowiedzi, ale co do ostatniej części:
Tak naprawdę nie ma. Marnowałbyś przepustowość, może dodać kilka milisekund, pobierając drugą bezużyteczną kopię, ale nie ma rzeczywistej szkody, jeśli obie przejdą. Oczywiście należy tego unikać, stosując techniki wymienione powyżej.
źródło
Zrobiłem Gist, który powinien dynamicznie ładować jQuery, jeśli nie jest już załadowany, a jeśli źródło zawiedzie, przejdzie do awarii (zszyte z wielu odpowiedzi): https://gist.github.com/tigerhawkvok/9673154
Pamiętaj, że planuję aktualizować Gist, ale nie tę odpowiedź, ponieważ jest tego warta!
źródło
Google Hosted jQuery
Plan awaryjny / awaryjny!
Odniesienie: http://websitespeedoptimizations.com/ContentDeliveryNetworkPost.aspx
źródło
Uważam, że powinien uciec od ostatniego <do \ x3C w ciągu. Gdy przeglądarka widzi, uważa to za koniec bloku skryptu (ponieważ parser HTML nie ma pojęcia o JavaScript, nie może rozróżnić między czymś, co pojawia się w ciągu znaków, a czymś, co w rzeczywistości ma zakończyć skrypt element). Tak więc pojawienie się dosłownie w JavaScript, który znajduje się na stronie HTML, spowoduje (w najlepszym przypadku) błędy i (w najgorszym przypadku) ogromną lukę w zabezpieczeniach.
źródło
Lub
Nie działa, jeśli wersja cdn nie jest załadowana, ponieważ przeglądarka przejdzie przez ten warunek i podczas pobierania nadal pobierze resztę skryptów JavaScript, które wymagają jQuery i zwróci błąd. Rozwiązaniem było załadowanie skryptów przez ten warunek.
źródło
Prawie wszystkie publiczne sieci CDN są dość niezawodne. Jeśli jednak martwisz się zablokowaną domeną google, możesz po prostu wrócić do alternatywnego CDN jQuery . W takim przypadku możesz jednak zrobić to odwrotnie i użyć innej CDN jako preferowanej opcji i wrócić do Google CDN, aby uniknąć nieudanych żądań i czasu oczekiwania:
źródło
Korzystając ze składni Razor w ASP.NET, ten kod zapewnia obsługę rezerwową i działa z wirtualnym katalogiem głównym:
Lub stwórz pomocnika ( przegląd pomocnika ):
i użyj tego w ten sposób:
źródło
CdnScript
pomocnikiem potrzebujesz tylko jednego wiersza kodu na skrypt . Im więcej masz skryptów, tym większa wypłata.try { for (Script s : ...) cdnLoad(s); } catch (...) { for (Script s : ...) ownLoad(s); }
. Przełożenie tego na kilkaif
s może być koszmarem.Chociaż pisanie
document.write("<script></script>")
wydaje się łatwiejsze do wycofania jQuery, Chrome daje błąd sprawdzania poprawności w tym przypadku. Wolę więc łamać słowo „skrypt”. Staje się więc bezpieczniejszy jak wyżej.W przypadku problemów długoterminowych lepiej byłoby zarejestrować awarie JQuery. W powyższym kodzie, jeśli pierwszy CDN nie jest dostępny, JQuery jest ładowany z innego CDN. Ale możesz chcieć poznać ten błędny CDN i usunąć go na stałe. (ten przypadek jest bardzo wyjątkowy). Lepiej jest także rejestrować problemy zastępcze. Dzięki temu możesz wysyłać błędne skrzynki za pomocą AJAX. Ponieważ JQuery nie jest zdefiniowany, powinieneś używać waniliowego javascript do żądania AJAX.
źródło
Brak możliwości załadowania zasobu z zewnętrznego magazynu danych poza Twoją kontrolą jest trudny. Poszukiwanie brakujących funkcji jest całkowicie błędne, ponieważ pozwala uniknąć przekroczenia limitu czasu, jak opisano tutaj: http://www.tech-101.com/support/topic/4499-issues-using-a-cdn/
źródło
Jeszcze jedna awaria zastępująca ajax.googleapis.com przez cdnjs.cloudflare.com :
źródło
Możesz użyć kodu takiego jak:
Ale są też biblioteki, których można użyć do skonfigurowania kilku możliwych błędów w skryptach i zoptymalizowania procesu ładowania:
Przykłady:
basket.js Myślę, że na razie najlepszy wariant. Zapisuje twój skrypt w localStorage, co przyspieszy kolejne ładowanie. Najprostsze połączenie:
To zwróci obietnicę i możesz wykonać następne wywołanie w przypadku błędu lub załadować zależności od sukcesu:
Wymagaj JS
yepnope
źródło