如果Google Ajax API不可用,那么最好的后备是什么(因为Google不允许在本地安装它)?

时间:2012-10-29 11:26:49

标签: javascript ajax

在我的网站上,我有:

...
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
...

上面的脚本是用于动态加载其他资源的Google脚本。 (例如Google图表API)

99.99%的时间都有效。 但是,我刚收到一个客户,由于某些原因让他的公司限制访问google.com。

由于这个原因,我的网站只是犯了一个JavaScript错误。

现在我知道如何处理,我可以检查window.Google是否存在。 但我的问题是

“处理这个问题的标准方法是什么?”

换句话说,如果你嵌入第三方JavaScript,你如何最好地处理他们的JS不可用?

注意:非常重要

您无法在本地或在Intranet上托管图表代码。

从Google查看常见问题解答:https://developers.google.com/chart/interactive/faq#localdownload

  

我可以在本地或在Intranet上下载和托管图表代码吗?

     

抱歉;我们的服务条款不允许您下载和保存或   托管Google.load或Google.visualization代码。

10 个答案:

答案 0 :(得分:9)

没有真正的选择。由于Google的服务条款,如果不访问google.com,您将无法使用Google API。

  • 检查与Google和iform用户的连接,该功能不可用
  • 开发自己的或使用非谷歌API。如果可以的话,你还可以使用谷歌

答案 1 :(得分:9)

解决方案是您的客户的公司审核其内容过滤政策。谷歌在之前的回答中concerning offline access非常清楚:

  

...您的计算机必须能够实时访问http://www.google.com/jsapi才能使用图表。

您根据条款和条件使用第三方解决方案,这自然会限制您的客户如何使用该解决方案。您需要坚定立场或找到更加自由许可的解决方案。 (无论如何,您更有可能成功说服客户的IT部门而不是petitioning Google to change their TOS。)


对于可能无法加载但您 允许在服务器上保留本地副本的第三方JS API的更一般情况,请参阅this question

答案 2 :(得分:7)

你可以这样试试:

使用指向您服务器的链接,而不是使用指向您要使用的Google库的直接链接:

<script type="text/javascript" src="https://www.myserver.com/jsapi"></script>

当您的服务器收到此网址的传入请求时,您的服务器现在向Google发出请求以获取API并将响应发送给客户端。

这意味着您不能在本地或服务器上的任何位置安装API,并始终直接从Google获取最实际的版本。人们也不需要访问谷歌(就像你提到的那样),因此可以使用你的服务。

答案 3 :(得分:3)

加载图表脚本后,使用Firebug或Chrome开发工具检查HTML源代码。访问浏览器中的脚本并将其保存在本地,然后从您自己的服务器提供。当然不建议这样做,但如果您没有其他选择......

例如,检查我使用的其中一个页面的代码,Google Charts库的核心脚本位于:     https://www.google.com/uds/api/visualization/1.0/3d781368978b51b3ca00a01566dccf40/format+en,default,corechart.I.js

答案 4 :(得分:3)

使用javascript window.onload检查api是否已加载,如果没有则从服务器加载。

答案 5 :(得分:3)

您已经知道如何检查您的库是否已加载(检查对象),如果它已失败,而不是在给出约束时可以执行的操作:

继续使用计时器检查对象并尝试下载库,为用户显示消息

如果第一个失败,你又有两种方法: 停止您的应用程序并显示错误:“应用程序错误...稍后再试” 或者下载不同的库作为后备

答案 6 :(得分:3)

您是在逐步增强还是优雅地降级页面?如果是这样,那么对于没有此图表的JavaScript的用户,您会显示什么?一张桌子?一个列表?这是你应该留在页面中的东西,只有谷歌的JS可用后才开始更改它。要么是这样,要么找到像raphaeljs这样的替代库,让你将所有代码保存在项目中。

答案 7 :(得分:3)

IF(BIG IF)你不担心谷歌图表的交互性,并希望将它们显示给用户只是为了看 - 可能会添加你自己的javascript而不依赖于谷歌的Javascript,这可以转向将谷歌图表转换为可以向用户显示的图像。

此外,还需要访问服务器上的命令行工具。

http://code.google.com/p/wkhtmltopdf/是一个命令行工具,可以从html页面生成图像。如果您构建一个仅显示所需图表的简单页面,并将wkhtmltoimage工具指向本地html文件,则会加载Google Charts javascript并生成图表,然后从结果中生成图像。

是的,我知道这非常糟糕,并且正在为一个小问题添加一个很大的工具,但是通过浏览器限制和Google服务条款,这将解决大部分问题。

答案 8 :(得分:2)

您可以尝试直接使用谷歌,如果失败(如果谷歌受限制),您可以退出服务器请求,使用CURL转发请求到谷歌。如果这不起作用,谷歌很可能会失败。这应该涵盖您在问题中描述的问题,但实际上并没有解决谷歌本身是否真的失败的问题。但是,它应该允许您的应用程序访问域限制,因为请求将路由到您的服务器而不是直接谷歌。我将此架构用于所有请求,以便我没有将Ajax请求路由到随机服务器。它允许我使用我的后端控制与我的前端交互的内容。还有其他好处,特别是如果你使用AngularJS和NodeJS这样的东西,因为你可以解耦很多你的第三方库。但是,这超出了你的问题的范围!

基本上,它的工作原理如下(伪代码):

If(!Browser->Google->Browser){
    return Browser->MyServer->Google->MyServer->Browser;
}  

答案 9 :(得分:1)

已经接受了一个答案,但我仍然希望在上面的评论中详细说明其他方面......

人们已经接受了Google服务器是唯一可以加载API的地方。我们不知道客户的IT经理是否会重新考虑他们的内容政策,他们可能有充分的理由。

鉴于用户浏览器与Google API之间路径上的所有组件的非100%可用性,用户迟早会结束错误情况;在统计上,这是不可避免的。

对于用户来说,不可接受(并且可以避免)的是接收“非特定”的JS错误,使他/她相信页面上存在错误。因此,我的解决方案是捕获加载Google API的失败并显示消息“第三方组件暂时不可用 - 请稍后再试”

这将向用户证明

  1. 我们知道发生了什么
  2. 我们现在无能为力
  3. 但这并非完全出乎意料,仍然在某种程度上受到控制