什么是一个好方法来尝试加载托管的jQuery在谷歌(或其他谷歌托管库),但加载我的jQuery副本,如果谷歌尝试失败?
我不是说谷歌很古怪。在某些情况下,谷歌副本会被屏蔽(例如,显然在伊朗)。
我是否会设置一个计时器并检查jQuery对象?
两份拷贝都通过的危险是什么?
并不是真的在寻找像“只用谷歌”或“只用你自己的”这样的答案。我理解这些论点。我还知道用户可能缓存了谷歌版本。我在考虑云计算的后备方案。
编辑:这部分增加了…
因为谷歌建议使用谷歌。加载加载ajax库,它执行回调时,我想知道这是否是序列化这个问题的关键。
我知道这听起来有点疯狂。我只是想弄清楚它是否能以一种可靠的方式完成。
更新:jQuery现在托管在微软的CDN上。
http://www.asp.net/ajax/cdn/
if (typeof jQuery == 'undefined')) { ...
Or
if(!window.jQuery){
将不工作,如果cdn版本没有加载,因为浏览器将通过这个条件运行,在它仍然下载剩下的javascript需要jQuery和它返回错误。解决方案是通过该条件加载脚本。
<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>
虽然编写document.write("<script></script>")对于jQuery来说似乎更容易退出,但Chrome在这种情况下给出了验证错误。所以我更喜欢打破“剧本”这个词。所以它变得像上面一样安全。
<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>
对于长期的问题,最好记录JQuery的回退。在上面的代码中,如果第一个CDN不可用,则从另一个CDN加载JQuery。但是你可能想要知道错误的CDN并永久删除它。(这种情况是非常特殊的情况)此外,最好记录回退问题。所以你可以用AJAX发送错误案例。因为JQuery没有定义,所以对于AJAX请求应该使用普通的javascript。
<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>
这里有一些很好的解决方案,但我想在本地文件方面更进一步。
在谷歌确实失败的情况下,它应该加载一个本地源,但服务器上的物理文件不一定是最佳选择。之所以提出这一点,是因为我目前正在实现相同的解决方案,只是希望返回到由数据源生成的本地文件。
我这样做的原因是,当涉及到跟踪我从谷歌加载的内容与我在本地服务器上的内容时,我想有一些想法。如果我想要更改版本,我将希望保持我的本地副本与我试图从谷歌加载的内容同步。在有许多开发人员的环境中,我认为最好的方法是自动化这个过程,这样所有人所要做的就是更改配置文件中的版本号。
以下是我提出的理论上可行的解决方案:
In an application configuration file, I'll store 3 things: absolute URL for the library, the URL for the JavaScript API, and the version number
Write a class which gets the file contents of the library itself (gets the URL from app config), stores it in my datasource with the name and version number
Write a handler which pulls my local file out of the db and caches the file until the version number changes.
If it does change (in my app config), my class will pull the file contents based on the version number, save it as a new record in my datasource, then the handler will kick in and serve up the new version.
理论上,如果我的代码写得正确,我所需要做的就是改变我的应用程序配置中的版本号,然后viola!你有一个自动的备用解决方案,你不必在服务器上维护物理文件。
大家怎么想?也许这有点过分了,但这可能是维护AJAX库的一种优雅方法。
橡子
这似乎对我很管用:
<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加载到窗口对象的谷歌对象。如果该对象不存在,则假设对谷歌的访问失败。如果是这种情况,我们使用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>');
}
虽然我必须说,我不确定如果这是您的网站访问者的担忧,您应该摆弄谷歌AJAX Libraries API在所有。
有趣的事实:我最初尝试在各种版本中使用try. catch块,但找不到像这样干净的组合。我很有兴趣看到这个想法的其他实现,纯粹作为一个练习。