152

我正在为以下 javascript 使用 CDN:

对于每一个,我如何在可能被阻止/不可用的情况下恢复使用本地副本?

4

10 回答 10

249

要确认已加载 cdn 脚本,您可以检查此脚本定义的任何变量/函数是否存在,如果未定义 - 那么 cdn 失败,您需要加载本地脚本副本。

基于此原则的解决方案如下:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.5.1.min.js">\x3C/script>')</script>

(如果没有window.jQuery 属性定义的cdn 脚本没有加载)。

您可以使用此方法构建自己的解决方案。例如,jquery tooltip 插件创建$.tooltip()函数,因此我们可以使用如下代码检查它:

<script>
    if (typeof $.tooltip === 'undefined') {
        document.write('<script src="js/libs/jquery.tooltip.min.js">\x3C/script>');
    }
</script>
于 2011-04-03T19:14:40.883 回答
16

我会研究像yepnopejs这样的插件

yepnope([{
  load: 'http:/­/ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js',
  complete: function () {
    if (!window.jQuery) {
      yepnope('local/jquery.min.js');
    }
  }
}]);

需要一个对象数组来检查,检查网站上的文档

于 2011-04-02T09:32:23.320 回答
6
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
<script>!window.jQuery && document.write(unescape('%3Cscript src="js/libs/jquery-1.4.2.js"%3E%3C/script%3E'))</script>

取自 HTML5 Boilerplate

于 2011-04-06T06:29:44.140 回答
5

我使用http://fallback.io/

  fallback.load({
        // Include your stylesheets, this can be an array of stylesheets or a string!
        page_css: 'index.css',

        // JavaScript library. THE KEY MUST BE THE LIBARIES WINDOW VARIABLE!
        JSON: '//cdnjs.cloudflare.com/ajax/libs/json2/20121008/json2.min.js',

        // Here goes a failover example. The first will fail, therefore Fallback JS will load the second!
        jQuery: [
            '//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.FAIL_ON_PURPOSE.min.js',
            '//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js',
            '//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.0/jquery.min.js'
        ],   .......
于 2014-03-31T09:29:09.143 回答
4

第一件事 - 你不应该以不同的顺序包括它们吗?

像这样的东西应该工作:

<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/jquery.validate.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.min.js"></script>
<script>jQuery.fn.validate || document.write('<script src="js/jquery.validate.min.js">\x3C/script><script src="js/jquery.validate.unobtrusive.min.js">\x3C/script>'</script>

我在这里所做的只是检查第一个插件(jQ validate)是否已加载。通过检查validatejQuery.fn 对象上的静态函数。我不能以同样的方式检查第二个脚本,因为它没有在任何地方添加任何东西,只是代理现有方法,所以更容易假设如果第一个有效,第二个也会有效 - 毕竟,它们是由同一个 CDN。

于 2011-03-27T21:57:36.197 回答
2

以下解决方案通过了 HTML5、XHTML 1.0 过渡和其他 HTML 风格的验证。在每个外部 JQuery 调用之后放置以下内容。请务必将 jquery.min.js 替换为 JQuery 脚本的本地副本的路径。

<script type="application/javascript">window.jQuery || 
document.write(unescape('%3Cscript src="jquery.min.js"%3E%3C/script%3E'))</script>

如果不使用 unescape,则在使用http://validator.w3.org进行验证时会出错,因为属性规范列表中不允许使用“%”。

HTML5 Boilerplate 示例在与旧 HTML 一起使用时也会出现验证错误:

  1. 未指定必需的属性“类型”
  2. 字符“&”是分隔符的第一个字符,但作为数据出现

如果您只为 HTML5 和未来的 HTML 风格进行开发,那么您可以使用 HTML5 Boilerplate 解决方案,但是由于您可能会发现自己将部分代码插入到旧版 HTML 中,因此请使用这种万能的方法来确保安全.

您需要为每个外部托管脚本指定不同的函数。例如,JQuery Tooltip 插件创建了 $.tooltip() 函数,因此您可以通过以下方式对其进行检查:

<script type="application/javascript">typeof ($.tooltip()) !== 'undefined' || 
document.write(unescape('%3Cscript src="jquery.tooltip.min.js"%3E%3C/script%3E'))</script>
于 2012-07-12T20:18:15.200 回答
2

您需要知道如何确保成功加载库。例如:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"></script>
<script>window.jQuery || document.write('<script src="js/jquery.min.js">\x3C/script>'</script>

所以这会尝试从谷歌 CDN 加载 jQuery (1.5.1)。由于<script>标签确实阻塞了整个渲染和执行过程(如果没有明确告知不同),我们可以在之后立即检查jQuery对象是否在window. 如果没有,只需通过在文档中写入另一个标签来回退<script>,引用本地副本。

于 2011-03-10T09:59:13.463 回答
1

我在 jquery ui 上回答了一个类似的问题——如何使用谷歌 CDN

您可以使用拨打电话

<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/base/jquery-ui.css" type="text/css" media="all" /> 
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.min.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js" type="text/javascript"></script>

您还可以通过更改主题名称链接到其他 UI 主题。在这种情况下,将名称基础更改为任何其他主题名称/base/jquery-ui.css到任何其他主题。

<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/base/jquery-ui.css" type="text/css" media="all" />

查看 jQuery UI 博客以获取所有 CDN 链接的链接http://blog.jqueryui.com/

如果你想在谷歌失败的情况下恢复到你的主机,你可以这样做

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined')
{
    document.write(unescape("%3Cscript src='/jquery.js' type='text/javascript'%3E%3C/script%3E"));
}
</script>
于 2011-04-08T06:51:29.253 回答
0
<script src="http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/jquery.validate.min.js" type="text/javascript"></script>   
<script type="text/javascript">
if(typeof jQval == 'undefined')
{
    document.write(unescape("%3Cscript src='/Scripts/jquery.validate.unobtrusive.min.js' type='text/javascript'%3E%3C/script%3E"));
    document.write(unescape("%3Cscript src='/Scripts/jquery.validate.min.js' type='text/javascript'%3E%3C/script%3E"));
}
</script>

取自这篇文章

于 2011-03-27T21:42:01.150 回答
0

最好使用您自己的 Javascript 代码加载所有这些脚本。

首先尝试通过将新的 SCRIPT 元素插入 DOM 来加载 CDN 文件。然后通过查找它定义的对象来检查它是否已加载。如果对象没有出现,则插入另一个 SCRIPT 元素以加载本地副本。可能最好清理 DOM 并删除也无法加载的 SCRIPT。

不要忘记考虑时间问题,即加载不是即时的。

于 2011-04-09T20:51:26.467 回答