我有一个Google Apps脚本,可以为每个ClickHandler动态生成按钮和分配,而ClickHandler又会调用一个函数。 我的问题是,因为每个按钮调用相同的功能,我无法找到一种方法来识别它们中的哪一个实际进行了调用。这是一个代码示例:
var handler = app.createServerHandler("buttonAction");
for (i=1,...) {
app.createButton(...).setId(i).addClickHandler(handler);
}
function buttonAction() {
//How do I know what button made the call?
}
答案 0 :(得分:5)
另一种选择是使用e.parameter.source值来确定触发要调用的serverHandler的元素的ID。
以下是一个例子:
function doGet(e) {
var app = UiApp.createApplication();
var handler = app.createServerHandler("buttonAction");
for (var i = 0; i < 4; i++) {
app.add(app.createButton('button'+i).setId(i).addClickHandler(handler));
}
return app;
}
function buttonAction(e) {
var app = UiApp.getActiveApplication();
Logger.log(e.parameter.source);
}
e.parameter.source将包含元素的ID,然后您可以使用它来调用app.getElementById(e.parameter.source)...
答案 1 :(得分:0)
您可以为一个按钮创建多个处理程序:
for (i=1,...) {
var handler = app.createServerHandler("buttonAction" + i);
app.createButton(...).setId(i).addClickHandler(handler);
}
function buttonAction1() {
// code to handle button 1
}
function buttonAction2() {
// code to handle button 2
}
function buttonAction...
我不建议使用这种“匿名”动作处理程序,因为您可能会在以后记住哪个actionX做什么时遇到麻烦。
(例如,有一个不同的方法,没有循环,或者在循环之前准备一个有意义的处理程序名称的字典/数组对象。)
OTOH,您可以使用提供给回调函数的事件对象参数:
function buttonAction(event) {
// use event object here to identify where this event came from
}
关键是上面的event
对象属性取决于调用回调的位置。例如,如果它是您有表单的提交按钮,那么您可以访问由此提交的参数:event.parameter.myParamName
。请参阅code sample here。
因此,如果您有可变数量的按钮,则可以使用隐藏元素+按钮:
for (i=1,...) {
var hiddenAction = app.createHidden("action", "action"+i);
var handler = app.createServerHandler("buttonAction");
handler.addCallbackElement(hiddenAction);
var btn = app.createButton("Button text", handler);
// you'll need to add both btn and hidden field
// to the UI
app.add(hiddenAction);
app.add(btn);
}
然后,您的buttonAction
可能如下所示:
function buttonAction(e) {
var action = e.parameter.action;
// do something based on action value here
// which will be one of "action1", "action2", ...
}
以上是副本&amp;从Hidden class样本粘贴。
上面的内容可能无法开箱即用,但您明白了这一点:创建一个隐藏元素,用于保存回调中所需的信息,并将隐藏的内容附加到服务器处理程序中。您甚至可以创建多个隐藏元素或表单面板。
答案 2 :(得分:0)
我有同样的问题。它使用Tag。
EG
var button = addButton(app
,panel
,"buttonActiveTrelloProjects_" + i.toString()
,appVars.buttonWidth() + "px"
,appVars.level2ButtonHeight().toString() + "px"
,false
,false
,"Trello"
,"buttonActiveTrelloProjectsHandler"
,(appVars.buttonLhsGap() * buttonCntr) + (appVars.buttonWidth() * (buttonCntr - 1 ) + 9)
,(appVars.level2ButtonTopGap() * 34)
,3
,"button");
button.setTag(projectName );
function buttonActiveProjectsChartHandler_1(button){
...
buttonTag = getButtonTag(button);
chartType = buttonTag.split(";")[1];
activeProject = buttonTag.split(";")[0];
...
}
function getButtonTag(button){
var jsonButton = JSON.stringify(button);
var source = button.parameter.source;
var tagPtr = source + "_tag";
return button.parameter[tagPtr];
}