使用Google托管jQuery的最佳方法,但在Google上使用我的托管库失败

谁说我不能喝 提交于 2019-12-13 17:46:48

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

什么是尝试在Google (或其他Google托管库)上加载托管jQuery ,但如果Google尝试失败则加载我的jQuery副本的好方法?

我并不是说Google很脆弱。 在某些情况下,Google副本被阻止(例如,显然在伊朗)。

我会设置一个计时器并检查jQuery对象吗?

两份复印件通过的危险是什么?

并非真正在寻找诸如“仅使用Google一个”或“仅使用您自己的一个”之类的答案。 我理解那些论点。 我也了解用户很可能已经缓存了Google版本。 我通常在考虑云的回退。


编辑:这部分添加...

由于Google建议使用google.load加载ajax库,并且完成后会执行回调,所以我想知道这是否是序列化此问题的关键。

我知道这听起来有点疯狂。 我只是想弄清楚它是否可以可靠地完成。


更新:jQuery现在托管在Microsoft的CDN上。

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


#1楼

您可以这样实现:

<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>

这应该在页面的<head>并且所有jQuery ready事件处理程序都应该在<body>以避免发生错误(尽管它不是万无一失的!)。

使用Google托管的jQuery的另一个原因是,在某些国家/地区,Google的域名被禁止。


#2楼

这似乎为我工作:

<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>

它的工作方式是使用调用http://www.google.com/jsapigoogle对象加载到window对象上。 如果该对象不存在,则我们假设对Google的访问失败。 在这种情况下,我们使用document.write加载本地副本。 (在这种情况下,我使用自己的服务器,请使用您自己的服务器进行测试)。

我还测试了window.google.load的存在-我也可以进行typeof检查,以查看事物是适当的对象或函数。 但是我认为这可以解决问题。

这只是加载逻辑,因为自从我发布了要测试的整个HTML页面以来,代码突出显示似乎失败了:

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>');
}

尽管我必须说,但我不确定如果这对您的站点访问者来说是个问题,那么您应该完全不介意使用Google AJAX库API

有趣的事实我最初尝试在各种版本中使用try..catch块,但找不到像这样干净的组合。 我很想看看这个想法的其他实现,纯粹是作为练习。


#3楼

这里有一些很棒的解决方案,但是我想对本地文件更进一步。

在Google确实失败的情况下,它应该加载本地源,但是服务器上的物理文件不一定是最佳选择。 之所以提出这一点,是因为我当前正在实现相同的解决方案,只是我想回退到由数据源生成的本地文件。

我这样做的原因是,在跟踪从Google加载的内容与在本地服务器上获取的内容时,我想有所了解。 如果要更改版本,我希望将本地副本与我尝试从Google加载的内容保持同步。 在有许多开发人员的环境中,我认为最好的方法是使这一过程自动化,以便所有人要做的就是更改配置文件中的版本号。

这是我建议的在理论上可行的解决方案:

  • 在应用程序配置文件中,我将存储3件事:库的绝对URL,JavaScript API的URL和版本号
  • 写一个类,获取库本身的文件内容(从应用程序配置中获取URL),并将其与名称和版本号一起存储在我的数据源中
  • 编写一个处理程序,将我的本地文件从数据库中拉出并缓存该文件,直到版本号更改为止。
  • 如果确实发生更改(在我的应用程序配置中),则我的类将根据版本号提取文件内容,将其另存为我的数据源中的新记录,然后处理程序将启动并提供新版本。

从理论上讲,如果我的代码编写正确,那么我要做的就是更改应用程序配置中的版本号,然后更改中提琴! 您有一个自动化的后备解决方案,无需维护服务器上的物理文件。

大家怎么想 也许这是矫kill过正,但它可能是维护AJAX库的一种优雅方法。

橡子


#4楼

如果您的网站上嵌入了modernizr.js,则可以使用内置的yepnope.js异步加载脚本-包括jQuery(具有后备功能)。

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();
    }
}]);

这将从Google-cdn加载jQuery。 之后,检查是否成功加载了jQuery。 否则(“否”),将加载本地版本。 同样,您的个人脚本也已加载-“两者”都表示加载过程独立于测试结果启动。

完成所有加载过程后,在“ MyApp.init”的情况下,将执行一个函数。

我个人更喜欢这种异步脚本加载方式。 而且,由于我在构建网站时依赖modernizr提供的功能测试,因此无论如何我都会将其嵌入到网站中。 因此,实际上没有开销。


#5楼

更新:
这个答案原来是错误的。 请查看评论以获取真正的解释。


你们大多数人的问题已经回答,但至于最后一部分:

两份复印件通过的危险是什么?

真的没有。 您会浪费带宽,可能会花上几毫秒的时间来下载第二个无用的副本,但是如果它们都通过了,那并没有实际的危害。 当然,您应该使用上述技术避免这种情况。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!