【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
什么是尝试在Google (或其他Google托管库)上加载托管jQuery ,但如果Google尝试失败则加载我的jQuery副本的好方法?
我并不是说Google很脆弱。 在某些情况下,Google副本被阻止(例如,显然在伊朗)。
我会设置一个计时器并检查jQuery对象吗?
两份复印件通过的危险是什么?
并非真正在寻找诸如“仅使用Google一个”或“仅使用您自己的一个”之类的答案。 我理解那些论点。 我也了解用户很可能已经缓存了Google版本。 我通常在考虑云的回退。
编辑:这部分添加...
由于Google建议使用google.load加载ajax库,并且完成后会执行回调,所以我想知道这是否是序列化此问题的关键。
我知道这听起来有点疯狂。 我只是想弄清楚它是否可以可靠地完成。
更新:jQuery现在托管在Microsoft的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/jsapi的google
对象加载到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楼
更新:
这个答案原来是错误的。 请查看评论以获取真正的解释。
你们大多数人的问题已经回答,但至于最后一部分:
两份复印件通过的危险是什么?
真的没有。 您会浪费带宽,可能会花上几毫秒的时间来下载第二个无用的副本,但是如果它们都通过了,那并没有实际的危害。 当然,您应该使用上述技术避免这种情况。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3142761