是否可以通过HtmlService从谷歌应用程序脚本访问谷歌闭包库功能?谷歌脚本中的html文件似乎过滤掉了与闭包库相关的任何内容 .
项目:我正在使用HtmlService从谷歌应用程序脚本中探索谷歌闭包库中的DOM操作实用程序 . 我打算将它作为一个独立的Web应用程序运行 .
闭包函数在从本地客户端环境直接加载到浏览器时起作用 - 但是当通过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>
Google Script文件
function s_getCurrentDate() {
return new Date().toString();
}
function doGet(e) {
return HtmlService.createTemplateFromFile('hello').evaluate();
}
我为客户端函数添加了前缀c_,为服务器端fns添加了s_ . 当将其作为Web应用程序运行时,
-
函数c_sayHi无效 - 我不确定它是否被调用 .
-
函数s_getCurrentDate和c_updateButton正常工作,如google文档https://developers.google.com/apps-script/html_service中所述 .
有没有办法让关闭库像上面尝试的那样从Web应用程序中运行?
2 回答
问题是Closure的依赖结构在窗口加载事件之前执行,否则它将无法工作 . 因此,在窗口加载之前,任何require和provide语句都会被处理掉 . 当您通过HTML服务注入它们时,您将强制它们在需要的不同阶段执行,这会导致一切都失败 .
如果您将使用COMPILED Closure库源,则运行Closure时不会有任何问题 . 了解如何使用Compiler和Builder使Closure正常工作 . 此外,您可以使用延迟加载来模拟HTML服务 .
有了这个, you can make javascript load dynamically onclick, onload or whatever the hell you want . 这称为延迟加载,它被用作所有大型Web应用程序的标准实践 . 浏览Gmail或Facebook时,监控Firebug的“网络”选项卡 .
Arun Nagarajan是对的,jQuery是更简单的解决方案 but 如果你正在做一些需要广度,规模和速度的东西,jQuery是一个适合孩子的玩具 .
这里有几件事 -
所有.gs文件都是在服务器端运行的JavaScript . 所以DOM在那里并不真正相关 .
您可以通过返回HtmlService中的代码来运行客户端JavaScript . 这就是我认为你想做的事情 . 但是,jQuery是这种方法中受支持最多的库 . 关闭可能最终工作,但团队没有专门测试该库 .