Best way to use Google's hosted jQuery, but fall back to my hosted library on Google fail

前端 未结 23 1454
太阳男子
太阳男子 2020-11-21 07:19

What would be a good way to attempt to load the hosted jQuery at Google (or other Google hosted libs), but load my copy of jQuery if the Google attempt fails?

I\'m n

相关标签:
23条回答
  • 2020-11-21 08:02

    Conditionally load latest/legacy jQuery version and 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]-->
    
    0 讨论(0)
  • 2020-11-21 08:03

    For those people using ASP.NET MVC 5, add this code in your BundleConfig.cs to enable the CDN for 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);
    
    0 讨论(0)
  • 2020-11-21 08:04

    I made a Gist that should dynamically load jQuery if it isn't already loaded, and if the source fails, it proceeds onto fallbacks (stitched together from many answers): https://gist.github.com/tigerhawkvok/9673154

    Please note I plan to keep the Gist updated but not this answer, for what it's worth!

    /* 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();
    }
    
    0 讨论(0)
  • 2020-11-21 08:05

    I consider that should escape the last < to \x3C in string. When the browser sees , it considers this to be the end of the script block (since the HTML parser has no idea about JavaScript, it can't distinguish between something that just appears in a string, and something that's actually meant to end the script element). So appearing literally in JavaScript that's inside an HTML page will (in the best case) cause errors, and (in the worst case) be a huge security hole.

    <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>
    
    0 讨论(0)
  • 2020-11-21 08:08

    Almost all public CDNs are pretty reliably. However, if you are worried about blocked google domain, then you can simply fallback to an alternative jQuery CDN. However, in such a case, you may prefer to do it opposite way and use some other CDN as your preferred option and fallback to Google CDN to avoid failed requests and waiting time:

    <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>
    
    0 讨论(0)
提交回复
热议问题