1

是否可以通过 HtmlService 从谷歌应用脚​​本访问谷歌闭包库函数?谷歌脚本中的 html 文件似乎过滤掉了与闭包库相关的任何内容。

项目:我正在使用 HtmlService 从 Google 应用脚本中探索 Google Closure 库中的 DOM 操作实用程序。我打算将其作为独立的网络应用程序运行。

闭包函数在从其本地客户端环境直接加载到浏览器时起作用 - 但在通过 HtmlService 实用程序从 GAS 应用程序注入时它们不起作用。

这是我在 GAS 中使用的代码。

.html 文件

<html>
  <head>
  <script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script>
  <script>
    goog.require('goog.dom');
    function c_sayHi() {
      var newHeader = goog.dom.createDom('h1', {'style': 'background-color:#EEE'},'Hello world!');
      goog.dom.appendChild(document.body, newHeader);
    }
  </script>
  </head>

  <script>
    function c_updateButton(date, button) {
      button.value = "clicked at " + date;
    }
  </script>

  <body onload="c_sayHi()">
    <input type='button' value='Never Clicked'
    onclick='google.script.run.withSuccessHandler(c_updateButton).withUserObject(this).s_getCurrentDate()'>

    <input type='button' value='Never Clicked'
    onclick='google.script.run.withSuccessHandler(c_updateButton).withUserObject(this).s_getCurrentDate()'>
  </body>
</html>

谷歌脚本文件

function s_getCurrentDate() {
  return new Date().toString();
}

function doGet(e) {
  return HtmlService.createTemplateFromFile('hello').evaluate();
}

我为客户端函数添加了前缀 c_,为服务器端 fns 添加了前缀。将其作为 Web 应用程序运行时,

  1. 函数 c_sayHi 没有效果 - 我不确定它是否被调用。

  2. 函数 s_getCurrentDate 和 c_updateButton 工作正常,如谷歌文档https://developers.google.com/apps-script/html_service中所述。

有没有办法让闭包库像上面尝试的那样从网络应用程序中工作?

4

2 回答 2

3

这里有几件事 -

  1. 所有 .gs 文件都是在服务器端运行的 JavaScript。所以 DOM 在那里并不真正相关。
  2. 您可以通过在HtmlService中返回代码来运行客户端 JavaScript 。这就是我相信你想要做的。但是,jQuery 是这种方法中最受支持的库。闭包最终可能会起作用,但团队并未专门针对该库进行测试。
于 2012-11-20T21:38:06.937 回答
2

问题是Closure的依赖结构是在window load事件之前执行的,否则就不起作用了。因此,任何 require 和 provide 语句都会在窗口加载之前得到处理。当您通过 HTML 服务注入它们时,您会强制它们在所需的不同阶段执行,这会导致一切失败。

如果您将使用编译的 Closure 库源,则运行 Closure 不会有任何问题。了解如何使用 Compiler 和 Builder 使 Closure 正常工作。此外,您可以使用延迟加载来模拟您的 HTML 服务。

有了它,你可以让 javascript 动态加载 onclick、onload 或任何你想要的东西。这称为延迟加载,它被用作所有大型 Web 应用程序的标准做法。通过 Gmail 或 Facebook 浏览时监控 Firebug 的网络选项卡。

Arun Nagarajan 是对的,jQuery 是更简单的解决方案,但是如果您正在做一些需要广度、规模和速度的适当的事情,那么 jQuery 对孩子们来说是一个玩具。

于 2012-11-24T20:25:05.217 回答