13

在我的网站上,我有:

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

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

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

因此,我的网站只是抛出了一个 JavaScript 错误。

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

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

换句话说,如果您嵌入了 3rd 方 JavaScript,您如何最好地处理他们的 JS 不可用?

注意:非常重要

您不能在本地或 Intranet 上托管图表代码。

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

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

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

4

10 回答 10

10

没有真正的选择。由于 Google 的服务条款,您不能在没有访问 google.com 的情况下使用 Google API。

  • 检查与 Google 的连接并告知用户该功能不可用
  • 开发自己的或使用非 google api。如果可用,您仍然可以使用 Google
于 2012-11-08T07:35:36.920 回答
9

解决方案是您客户的公司审查他们的内容过滤策略。谷歌在他们之前关于离线访问的回答中非常清楚:

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

您正在根据他们的条款和条件使用第三方解决方案,这自然会限制您的客户如何使用该解决方案。您需要站稳脚跟或找到更自由许可的解决方案。(无论如何,说服客户的 IT 部门比请求 Google 更改他们的 TOS更有可能成功。)


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

于 2012-11-13T16:04:37.980 回答
7

你可以这样尝试:

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

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

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

这意味着您无需在本地或服务器上的任何地方安装 API,而是始终直接从 Google 获得最实际的版本。人们也不需要访问谷歌(如您提到的公司),因此可以使用您的服务。

于 2012-11-08T06:06:16.363 回答
3

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

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

于 2012-10-29T11:33:25.027 回答
3

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

于 2012-10-29T12:13:33.253 回答
3

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

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

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

于 2012-11-07T10:31:55.510 回答
3

你是在逐步增强还是优雅地降低页面?如果是这样,对于这个图表,你会向没有 JavaScript 的用户显示什么?一张桌子?一个列表?这是您应该留在页面中的内容,并且只有在 google 的 JS 可用时才开始更改它。要么,要么找到一个替代库,比如 raphaeljs,它可以让您将所有代码保留在项目中。

于 2012-11-12T11:33:45.230 回答
3

如果(BIG IF)您不担心 Google Charts 的交互性并且希望将它们显示给用户只是为了查看 - 可能会添加您自己的 javascript 但根本不依赖 Google Javascript,这可以打开 google 图表成您可以向用户显示的图像。

这也需要访问在服务器上安装命令行工具。

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

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

于 2012-11-13T02:11:39.633 回答
2

您可以尝试直接访问 google,如果失败(如果 google 受到限制),您可以将请求从您的服务器退回,该服务器使用 CURL 将请求转发到 google。如果这不起作用,那么谷歌很可能会失败。这应该涵盖您在问题中描述的问题,但是如果 google 本身确实出现故障,并没有真正的解决方法。但是,它应该让您的应用程序访问域限制,因为请求将被路由到您的服务器,而不是直接到谷歌。我对所有请求都使用这种架构,这样我就不会将 ajax 请求路由到随机服务器。它允许我使用我的后端控制与我的前端交互的内容。这还有其他好处,尤其是如果您将 AngularJS 与 NodeJS 一起使用,因为您可以解耦很多第三方库。但是,这超出了您的问题范围!

基本上,它是这样工作的(伪代码):

If(!Browser->Google->Browser){
    return Browser->MyServer->Google->MyServer->Browser;
}  
于 2012-11-13T21:31:45.553 回答
1

已经接受了一个答案,但我仍然想留下一个额外的方面来详细说明我在上面所做的评论......

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

鉴于用户浏览器和 Google API 之间的路径上的所有组件都不是 100% 可用的,用户迟早遇到错误情况;统计上这是不可避免的。

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

这将向用户证明

  1. 我们知道发生了什么
  2. 我们现在无能为力
  3. 但这并非完全出乎意料,并且仍然在某种程度上受到控制
于 2012-11-20T14:10:56.220 回答