Najlepszy sposób na korzystanie z hostowanego jQuery Google, ale wróć do mojej hostowanej biblioteki na Google fail

Jaki byłby dobry sposób na próbę załadowania hostowanego jQuery w Google (lub innych hostowanych bibliotek Google), ale załadowanie mojej kopii jQuery, jeśli próba Google się nie powiedzie?

Nie mówię, że Google jest flaky. Istnieją przypadki, w których kopia Google jest blokowana(najwyraźniej w Iranie, na przykład).

Czy skonfigurowałbym timer i sprawdziłbym obiekt jQuery?

Jakie byłoby niebezpieczeństwo, że obie kopie dotrą?

Nie szukam odpowiedzi jak "po prostu użyj Google one" lub " po prostu użyj własnego."Rozumiem te argumenty. Rozumiem również, że użytkownik może mieć buforowaną wersję Google. Zastanawiam się nad alternatywą dla chmury w ogóle.


Edit: ta część dodana...

Ponieważ Google sugeruje korzystanie z google.load aby załadować biblioteki ajax, i wykonuje callback po zakończeniu, zastanawiam się, czy to jest klucz do serializacji tego problemu.

Wiem, że to brzmi trochę szalenie. Staram się tylko dowiedz się, czy można to zrobić w sposób wiarygodny, czy nie.


Aktualizacja: jQuery teraz hostowane na CDN Microsoftu.

Http://www.asp.net/ajax/cdn/

Author: Chris Morgan, 2009-06-18

23 answers

Możesz to osiągnąć w następujący sposób:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>

<script>
       window.jQuery || document.write('<script src="/path/to/your/jquery"><\/script>');
</script>

To powinno być w <head> Twojej strony, a wszelkie procedury obsługi zdarzeń jQuery ready powinny być w <body>, aby uniknąć błędów (chociaż nie jest to niezawodne!).

Jeszcze jeden powód, aby Nie używać hostowanego przez Google jQuery jest to, że w niektórych krajach nazwa domeny Google jest zakazana.

 818
Author: Rony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-16 18:15:40

Najprostszy i najczystszy sposób, aby to zrobić zdecydowanie:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="path/to/your/jquery"><\/script>')</script>
 336
Author: BenjaminRH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-28 08:49:40

To chyba działa dla mnie:

<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
// has the google object loaded?
if (window.google && window.google.load) {
    google.load("jquery", "1.3.2");
} else {
    document.write('<script type="text/javascript" src="http://joecrawford.com/jquery-1.3.2.min.js"><\/script>');
}
window.onload = function() {
    $('#test').css({'border':'2px solid #f00'});
};
</script>
</head>
<body>
    <p id="test">hello jQuery</p>
</body>
</html>

Sposób działania polega na użyciu google obiektu, który wywołuje http://www.google.com/jsapi ładuje na obiekt window. Jeśli tego obiektu nie ma, Zakładamy, że dostęp do Google zawodzi. W takim przypadku wczytujemy lokalną kopię za pomocą document.write. (używam własnego serwera w tym przypadku, użyj swojego własnego do testowania tego).

Testuję również na obecność window.google.load - mogę też zrobić typeof sprawdzenie, czy rzeczy są przedmiotami lub funkcjami odpowiednio. Ale myślę, że to wystarczy.

Oto tylko logika ładowania, ponieważ podświetlanie kodu wydaje się nie działać, odkąd opublikowałem całą stronę HTML, którą testowałem:

if (window.google && window.google.load) {
    google.load("jquery", "1.3.2");
} else {
    document.write('<script type="text/javascript" src="http://joecrawford.com/jquery-1.3.2.min.js"><\/script>');
}

Chociaż muszę powiedzieć, nie jestem pewien, czy jest to problem dla odwiedzających witrynę, powinieneś w ogóle bawić się z Google AJAX Libraries API.

Ciekawostka: początkowo próbowałem spróbować..catch block do tego w różnych wersje, ale nie mógł znaleźć kombinacji, która była tak czysta jak ta. Chciałbym zobaczyć inne implementacje tego pomysłu, czysto jako ćwiczenie.

 76
Author: artlung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-15 12:21:10

Jeśli masz modernizr.js osadzone na swojej stronie, można użyć wbudowanego yepnope.js do wczytywania skryptów asynchronicznie - m.in. jQuery (z fallback).

Modernizr.load([{
    load : '//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'
},{
    test : window.jQuery,
    nope : 'path/to/local/jquery-1.7.2.min.js',
    both : ['myscript.js', 'another-script.js'],
    complete : function () {
        MyApp.init();
    }
}]);

To ładuje jQuery z Google-cdn. Następnie jest sprawdzane, czy jQuery został załadowany pomyślnie. Jeśli nie ("nie"), zostanie załadowana Wersja lokalna. Również twoje osobiste skrypty są ładowane - "both" oznacza, że proces ładowania jest uruchamiany niezależnie od wyniku testu.

Gdy wszystkie load-process are complete, a function is executed, in the case ' MyApp.init".

Osobiście wolę ten sposób asynchronicznego ładowania skryptów. A ponieważ polegam na testach funkcjonalnych dostarczonych przez modernizr przy budowie strony, i tak mam ją osadzoną na stronie. Więc właściwie nie ma żadnych kosztów.

 30
Author: Emanuel Kluge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 21:37:45

Jest tu kilka świetnych rozwiązań, ale chciałbym pójść o krok dalej w odniesieniu do pliku lokalnego.

W scenariuszu, gdy Google nie powiedzie się, powinno załadować lokalne źródło, ale może plik fizyczny na serwerze niekoniecznie jest najlepszą opcją. Poruszam to, ponieważ obecnie wdrażam to samo rozwiązanie, tylko chcę wrócić do lokalnego pliku, który jest generowany przez źródło danych.

Powodem tego jest to, że chcę mieć trochę umysłu, gdy to chodzi o śledzenie tego, co Ładuję z Google vs. to, co mam na lokalnym serwerze. Jeśli chcę zmienić wersje, chcę, aby moja lokalna kopia była synchronizowana z tym, co próbuję załadować z Google. W środowisku, w którym jest wielu programistów, myślę, że najlepszym podejściem byłoby zautomatyzowanie tego procesu, tak aby wszystko, co trzeba zrobić, to zmienić numer wersji w pliku konfiguracyjnym.

Oto moje proponowane rozwiązanie, które powinno działać w teorii:

  • w aplikacji plik konfiguracyjny, będę przechowywać 3 rzeczy: bezwzględny adres URL dla biblioteki, adres URL dla API JavaScript i numer wersji
  • napisz klasę, która pobiera zawartość samej biblioteki (pobiera adres URL z aplikacji config), przechowuje ją w moim datasource z nazwą i numerem wersji
  • napisz obsługę, która wyciąga mój plik lokalny z db i buforuje plik do czasu zmiany numeru wersji.
  • Jeśli to się zmieni (w mojej konfiguracji aplikacji), Moja klasa pobierze plik zawartość na podstawie numeru wersji, zapisz go jako nowy rekord w moim datasource, a następnie handler uruchomi i poda nową wersję.

W teorii, jeśli mój kod jest napisany poprawnie, wszystko, co muszę zrobić, to zmienić numer wersji w mojej aplikacji config następnie viola! Masz rozwiązanie awaryjne, które jest zautomatyzowane i nie musisz utrzymywać fizycznych plików na swoim serwerze.

Co wszyscy myślą? Może to przesada, ale to może być elegancka metoda utrzymanie bibliotek AJAX.

Żołądź

 21
Author: Acorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 21:38:04
if (typeof jQuery == 'undefined') {
// or if ( ! window.jQuery)
// or if ( ! 'jQuery' in window)
// or if ( ! window.hasOwnProperty('jQuery'))    

  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = '/libs/jquery.js';

  var scriptHook = document.getElementsByTagName('script')[0];
  scriptHook.parentNode.insertBefore(script, scriptHook);

}

Po próbie włączenia kopii Google z CDN.

W HTML5 nie musisz ustawiać atrybutu type.

Możesz również użyć...
window.jQuery || document.write('<script src="/libs/jquery.js"><\/script>');
 20
Author: alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-04 22:21:10

Możesz użyć lokalnego pliku jako ostateczności.

Wydaje się, że od teraz 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.

<!-- load jQuery from Google's CDN -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
<!-- fallback to Microsoft's Ajax CDN -->
<script> window.jQuery || document.write('<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.min.js">\x3C/script>')</script> 
<!-- fallback to local file -->
<script> window.jQuery || document.write('<script src="Assets/jquery-1.8.3.min.js">\x3C/script>')</script> 
 10
Author: Edward Olamisan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-12 16:42:45

Warunkowo załaduj najnowszą / starszą wersję jQuery i fallback:

<!--[if lt IE 9]>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="/public/vendor/jquery-legacy/dist/jquery.min.js">\x3C/script>')</script>
<![endif]-->
<!--[if gte IE 9]><!-->
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="/public/vendor/jquery/dist/jquery.min.js">\x3C/script>')</script>
<!--<![endif]-->
 6
Author: neiker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 14:56:09
  • Krok 1: czy jQuery nie załadował się? (sprawdź jQuery zmienna)

Jak sprawdzić nie zdefiniowaną zmienną w JavaScript

  • Krok 2: Dynamiczny import (kopia zapasowa) pliku javascript

Jak dołączyć plik JavaScript do innego pliku JavaScript?

 5
Author: ninjagecko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:26

Z powodu problemu z banowaniem Google wolę korzystać z cdn Microsoftu http://www.asp.net/ajaxlibrary/cdn.ashx

 5
Author: Serdar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 21:38:41

Tutaj jest wielkie Wyjaśnienie na ten temat!

Implementuje również opóźnienia ładowania i timeouty!

Http://happyworm.com/blog/2010/01/28/a-simple-and-robust-cdn-failover-for-jquery-14-in-one-line/

 4
Author: Stuart.Sklinar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-07 10:06:36

Dla osób używających ASP.NET MVC 5, Dodaj ten kod do swojego BundleConfig.cs aby włączyć CDN dla jquery:

bundles.UseCdn = true;
Bundle jqueryBundle = new ScriptBundle("~/bundles/jquery", "//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js").Include("~/Scripts/jquery-{version}.js");
jqueryBundle.CdnFallbackExpression = "window.jQuery";
bundles.Add(jqueryBundle);
 4
Author: Muhammad Rehan Saeed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-20 09:36:31

UPDATE:
Ta odpowiedź okazała się błędna. Proszę zobaczyć komentarze dla prawdziwego wyjaśnienia.


Większość z was odpowiedziała, ale co do końcowej części:

Jakie byłoby niebezpieczeństwo, że obie kopie dotrą?

Żadnych naprawdę. Marnujesz przepustowość, możesz dodać milisekundy pobierając drugą bezużyteczną kopię, ale nie ma rzeczywistej szkody, jeśli obie się przejdą. Należy oczywiście unikać tego za pomocą techniki wymienione powyżej.

 4
Author: WhyNotHugo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 12:04:31

Zrobiłem Gist, który powinien dynamicznie ładować jQuery, jeśli nie jest już załadowany, a jeśli źródło zawiedzie, przechodzi na fallbacks (zszyte z wielu odpowiedzi): https://gist.github.com/tigerhawkvok/9673154

Proszę zauważyć, że planuję aktualizować Gist, ale nie tę odpowiedź, jeśli to coś warte!

/* See https://gist.github.com/tigerhawkvok/9673154 for the latest version */
function cascadeJQLoad(i) { // Use alternate CDNs where appropriate to load jQuery
    if (typeof(i) != "number") i = 0;
    // the actual paths to your jQuery CDNs
    var jq_paths = [
        "ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js",
        "ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.0.min.js"
    ];
    // Paths to your libraries that require jQuery
    var dependent_libraries = [
        "js/c.js"
    ];
    if (window.jQuery === undefined && i < jq_paths.length) {
        i++;
        loadJQ(jq_paths[i], i, dependent_libraries);
    }
    if (window.jQuery === undefined && i == jq_paths.length) {
        // jQuery failed to load
        // Insert your handler here
    }
}

/***
 * You shouldn't have to modify anything below here
 ***/

function loadJQ(jq_path, i, libs) { //load jQuery if it isn't already
    if (typeof(jq_path) == "undefined") return false;
    if (typeof(i) != "number") i = 1;
    var loadNextJQ = function() {
        var src = 'https:' == location.protocol ? 'https' : 'http';
        var script_url = src + '://' + jq_path;
        loadJS(script_url, function() {
            if (window.jQuery === undefined) cascadeJQLoad(i);
        });
    }
    window.onload = function() {
        if (window.jQuery === undefined) loadNextJQ();
        else {
            // Load libraries that rely on jQuery
            if (typeof(libs) == "object") {
                $.each(libs, function() {
                    loadJS(this.toString());
                });
            }
        }
    }
    if (i > 0) loadNextJQ();
}

function loadJS(src, callback) {
    var s = document.createElement('script');
    s.src = src;
    s.async = true;
    s.onreadystatechange = s.onload = function() {
        var state = s.readyState;
        try {
            if (!callback.done && (!state || /loaded|complete/.test(state))) {
                callback.done = true;
                callback();
            }
        } catch (e) {
            // do nothing, no callback function passed
        }
    };
    s.onerror = function() {
        try {
            if (!callback.done) {
                callback.done = true;
                callback();
            }
        } catch (e) {
            // do nothing, no callback function passed
        }
    }
    document.getElementsByTagName('head')[0].appendChild(s);
}

/*
 * The part that actually calls above
 */

if (window.readyState) { //older microsoft browsers
    window.onreadystatechange = function() {
        if (this.readyState == 'complete' || this.readyState == 'loaded') {
            cascadeJQLoad();
        }
    }
} else { //modern browsers
    cascadeJQLoad();
}
 2
Author: Philip Kahn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 21:29:03

Google Hosted jQuery

  • jeśli zależy ci na starszych przeglądarkach, przede wszystkim wersjach IE przed IE9, jest to najbardziej kompatybilna wersja jQuery
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  • Jeśli nie zależy ci na starym, ten jest mniejszy i szybszy:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>

Plan Awaryjny!

  • tak czy inaczej, powinieneś użyć awaryjnego do lokalnego na wypadek, gdyby CDN Google zawiedzie (mało prawdopodobne) lub zostanie zablokowany w miejscu, w którym użytkownicy uzyskują dostęp do twojej witryny z (nieco bardziej prawdopodobne), jak Iran, a czasem Chiny.
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>if (!window.jQuery) { document.write('<script src="/path/to/your/jquery"><\/script>'); }
</script>

Bibliografia: http://websitespeedoptimizations.com/ContentDeliveryNetworkPost.aspx

 2
Author: Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-24 12:15:31

Uważam, że powinno to zawierać Ostatnie

<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min.js"></script>
<script>window.jQuery || document.write('<script src="js/jquery-2.0.0.min.js">\x3C/script>')</script>
 2
Author: JKhuang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-11 07:13:05
if (typeof jQuery == 'undefined')) { ...

Lub

if(!window.jQuery){

Nie będzie działać, jeśli wersja cdn nie zostanie załadowana, ponieważ przeglądarka będzie działać przez ten warunek i podczas niego nadal pobiera resztę skryptów javascripts, które wymagają jQuery i zwraca błąd. Rozwiązaniem było wczytanie skryptów przez ten warunek.

    <script src="http://WRONGPATH.code.jquery.com/jquery-1.4.2.min.js" type="text/javascript"></script><!--  WRONGPATH for test-->
  <script type="text/javascript">
  function loadCDN_or_local(){
    if(!window.jQuery){//jQuery not loaded, take a local copy of jQuery and then my scripts
      var scripts=['local_copy_jquery.js','my_javascripts.js'];
      for(var i=0;i<scripts.length;i++){
      scri=document.getElementsByTagName('head')[0].appendChild(document.createElement('script'));
      scri.type='text/javascript';
      scri.src=scripts[i];
    }
  }
  else{// jQuery loaded can load my scripts
    var s=document.getElementsByTagName('head')[0].appendChild(document.createElement('script'));
    s.type='text/javascript';
    s.src='my_javascripts.js';
  }
  }
  window.onload=function(){loadCDN_or_local();};
  </script>
 2
Author: Mirek Komárek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 21:39:40

Prawie wszystkie publiczne CDN są dość niezawodne. Jeśli jednak martwisz się o zablokowaną domenę google, możesz po prostu wrócić do alternatywnego jQuery CDN . jednak w takim przypadku możesz wybrać odwrotną opcję i użyć innego CDN jako preferowanej opcji i awaryjnego do Google CDN, aby uniknąć nieudanych żądań i czasu oczekiwania:

<script src="https://pagecdn.io/lib/jquery/3.2.1/jquery.min.js"></script>
<script>
   window.jQuery || document.write('<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"><\/script>');
</script>
 2
Author: Hamid Sarfraz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-26 07:45:19

Używanie składni Razor w ASP.NET, ten kod zapewnia wsparcie awaryjne i działa z wirtualnym korzeniem:

@{var jQueryPath = Url.Content("~/Scripts/jquery-1.7.1.min.js");}
<script type="text/javascript">
    if (typeof jQuery == 'undefined')
        document.write(unescape("%3Cscript src='@jQueryPath' type='text/javascript'%3E%3C/script%3E"));
</script>

Or make a helper ( przegląd helperów):

@helper CdnScript(string script, string cdnPath, string test) {
    @Html.Raw("<script src=\"http://ajax.aspnetcdn.com/" + cdnPath + "/" + script + "\" type=\"text/javascript\"></script>" +
        "<script type=\"text/javascript\">" + test + " || document.write(unescape(\"%3Cscript src='" + Url.Content("~/Scripts/" + script) + "' type='text/javascript'%3E%3C/script%3E\"));</script>")
}

I użyj go w ten sposób:

@CdnScript("jquery-1.7.1.min.js", "ajax/jQuery", "window.jQuery")
@CdnScript("jquery.validate.min.js", "ajax/jquery.validate/1.9", "jQuery.fn.validate")
 1
Author: Edward Brey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-02 04:43:44

Chociaż pisanie document.write("<script></script>") wydaje się łatwiejsze dla jQuery backoff, Chrome podaje błąd walidacji w tej sprawie. Więc wolę łamać słowo "skrypt". Więc staje się bezpieczniejsze jak powyżej.

<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.1.min.js"></script>
<script>if (typeof jQuery === "undefined") {
   window.jqFallback = true;
   document.write("<scr"+"ipt src='http://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js'></scr"+"ipt>");
} </script>

W przypadku problemów długoterminowych, lepiej byłoby zalogować jQuery fallbacks. W powyższym kodzie, jeśli pierwszy CDN nie jest dostępny, jQuery jest ładowany z innego CDN. Ale możesz chcieć wiedzieć, że błędny CDN i usunąć go na stałe. (w tym przypadku jest to bardzo wyjątkowy przypadek) również lepiej jest logować problemy awaryjne. Więc możesz wysyłać błędne przypadki za pomocą AJAX. Ponieważ JQuery nie jest zdefiniowane, powinieneś użyć vanilla javascript dla żądania AJAX.

<script type="text/javascript">
    if (typeof jQuery === 'undefined' || window.jqFallback == true) {
        // XMLHttpRequest for IE7+, Firefox, Chrome, Opera, Safari
        // ActiveXObject for IE6, IE5
        var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
        var url = window.jqFallback == true ? "/yourUrl/" : "/yourUrl2/";
        xmlhttp.open("POST", url, true);
        xmlhttp.send();
    }
</script>
 1
Author: trante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-07 19:08:54

Niemożność załadowania zasobu z zewnętrznego magazynu danych poza Twoją kontrolą jest trudna. Szukanie brakujących funkcji jest całkowicie błędne jako sposób na uniknięcie limitu czasu, jak opisano tutaj: http://www.tech-101.com/support/topic/4499-issues-using-a-cdn/

 1
Author: jobeard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 16:27:01

Yet another fallback that replace ajax.googleapis.com z cdnjs.cloudflare.com : {]}

(function (doc, $)
{
    'use strict';

    if (typeof $ === 'undefined')
    {
        var script = doc.querySelector('script[src*="jquery.min.js"]'),
            src = script.src.replace('ajax.googleapis.com', 'cdnjs.cloudflare.com');

        script.parentNode.removeChild(script);
        doc.write('<script src="' + src + '"></script>');
    }
})(document, window.jQuery || window.Zepto);
  • możesz trzymać się wersji jQuery, określając ją w łańcuchu
  • idealny do zarządzania zasobami, które nie działa z HTML snips
  • testowane w dziczy-działa idealnie dla użytkowników z Chin
 0
Author: redaxmedia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-27 19:23:21

Możesz użyć kodu jak:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>window.jQuery || document.write('<script type="text/javascript" src="./scripts/jquery.min.js">\x3C/script>')</script>

Ale są też biblioteki, których możesz użyć do Ustawienia kilku możliwych fallbacków dla Twoich skryptów i zoptymalizowania procesu ładowania:

  • koszyk.js
  • RequireJS
  • yepnope

Przykłady:

Kosz.js Myślę, że najlepszy wariant na razie. Spowoduje buforowanie skryptu w localStorage, co przyspieszy kolejne ładunki. Najprostsze wywołanie:

basket.require({ url: '/path/to/jquery.js' });

To zwróci obietnicę, a Ty może wykonać następne wywołanie błędu lub załadować zależności od sukcesu:

basket
    .require({ url: '/path/to/jquery.js' })
    .then(function () {
        // Success
    }, function (error) {
        // There was an error fetching the script
        // Try to load jquery from the next cdn
    });

RequireJS

requirejs.config({
    enforceDefine: true,
    paths: {
        jquery: [
            '//ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min',
            //If the CDN location fails, load from this location
            'js/jquery-2.0.0.min'
        ]
    }
});

//Later
require(['jquery'], function ($) {
});

Yepnope

yepnope([{
  load: 'http://ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min.js',
  complete: function () {
    if (!window.jQuery) {
      yepnope('js/jquery-2.0.0.min.js');
    }
  }
}]);
 0
Author: Роман Коптев,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-07 23:20:59