什么是一个好方法来尝试加载托管的jQuery在谷歌(或其他谷歌托管库),但加载我的jQuery副本,如果谷歌尝试失败?

我不是说谷歌很古怪。在某些情况下,谷歌副本会被屏蔽(例如,显然在伊朗)。

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

两份拷贝都通过的危险是什么?

并不是真的在寻找像“只用谷歌”或“只用你自己的”这样的答案。我理解这些论点。我还知道用户可能缓存了谷歌版本。我在考虑云计算的后备方案。


编辑:这部分增加了…

因为谷歌建议使用谷歌。加载加载ajax库,它执行回调时,我想知道这是否是序列化这个问题的关键。

我知道这听起来有点疯狂。我只是想弄清楚它是否能以一种可靠的方式完成。


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

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


当前回答

这似乎对我很管用:

<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块,但找不到像这样干净的组合。我很有兴趣看到这个想法的其他实现,纯粹作为一个练习。

其他回答

if (typeof jQuery == 'undefined') {
// or if ( ! window.jQuery)
// or if ( ! 'jQuery' in window)
// or if ( ! window.hasOwnProperty('jQuery'))    

  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = '/libs/jquery.js';

  var scriptHook = document.getElementsByTagName('script')[0];
  scriptHook.parentNode.insertBefore(script, scriptHook);

}

在您尝试从CDN中包含谷歌的副本之后。

在HTML5中,不需要设置type属性。

你也可以用…

window.jQuery || document.write('<script src="/libs/jquery.js"><\/script>');

对于那些使用ASP的人。在你的BundleConfig.cs中添加以下代码来启用jquery的CDN:

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

在ASP中使用Razor语法。NET,这段代码提供了回退支持,并使用虚拟根:

@{var jQueryPath = Url.Content("~/Scripts/jquery-1.7.1.min.js");}
<script type="text/javascript">
    if (typeof jQuery == 'undefined')
        document.write(unescape("%3Cscript src='@jQueryPath' type='text/javascript'%3E%3C/script%3E"));
</script>

或者制作一个helper (helper概述):

@helper CdnScript(string script, string cdnPath, string test) {
    @Html.Raw("<script src=\"http://ajax.aspnetcdn.com/" + cdnPath + "/" + script + "\" type=\"text/javascript\"></script>" +
        "<script type=\"text/javascript\">" + test + " || document.write(unescape(\"%3Cscript src='" + Url.Content("~/Scripts/" + script) + "' type='text/javascript'%3E%3C/script%3E\"));</script>")
}

像这样使用它:

@CdnScript("jquery-1.7.1.min.js", "ajax/jQuery", "window.jQuery")
@CdnScript("jquery.validate.min.js", "ajax/jquery.validate/1.9", "jQuery.fn.validate")

这里有一些很好的解决方案,但我想在本地文件方面更进一步。

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

我这样做的原因是,当涉及到跟踪我从谷歌加载的内容与我在本地服务器上的内容时,我想有一些想法。如果我想要更改版本,我将希望保持我的本地副本与我试图从谷歌加载的内容同步。在有许多开发人员的环境中,我认为最好的方法是自动化这个过程,这样所有人所要做的就是更改配置文件中的版本号。

以下是我提出的理论上可行的解决方案:

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库的一种优雅方法。

橡子

到目前为止,最简单、最干净的方法是:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="path/to/your/jquery"><\/script>')</script>