22

使用谷歌应用程序脚本我在运行传递参数的 js 函数时遇到问题。当我添加参数时,它将始终在页面加载而不是单击按钮时运行代码。

直接来自 HtmlService 示例,没关系 - 它在按下按钮时运行......

document.getElementById('button1').onclick = doSomething;

但是当我如下向调用(和函数)添加参数时,它在页面加载时只运行一次(而不是在按下按钮时)......

document.getElementById('button1').onclick = doSomething('with_this_parameter');

任何对此行为的见解将不胜感激......如果答案很明显,对不起!

4

4 回答 4

45

当你说

document.getElementById('button1').onclick = doSomething('with_this_parameter');

这意味着调用doSomething('with_this_parameter')然后将返回的值分配给document.getElementById('button1').onclick. 因此,这就是为什么当代码到达该行时它会被调用。该值是否可分配给该属性是另一个问题,但这就是它被调用的原因。

像这样使用它

document.getElementById('button1').onclick = function(){
    doSomething('with_this_parameter');
}

参考:此解决方案由Mark Linus给出。

于 2013-01-20T14:20:52.530 回答
12

这样做:

document.getElementById('button1').onclick = function(){
    doSomething('with_this_parameter');
}
于 2013-01-20T14:21:01.640 回答
1

我通常这样做 clickHandlers 像这样:

 // create button here or get button...
 var button1 = document.getElementById('button1').setName('button1');
 var clickHandler = app.createServerClickHandler('doSomething');
 button.addClickHandler(clickHandler);

 function doSomething(e){
   var button1 = e.parameter.button1;
   <do something with var button>
 }

我不确定您要添加什么参数,但是如果按钮本身没有通过 .setId/getId 或 .setTag/getTag 传递它,则需要添加一个回调元素来传递它。如果它来自文本框:

 var textbox = app.createTextBox(); 
 var button1 =
 app.createButton.setName('button1'); 
 var clickHandler =        
 app.createServerClickHandler('doSomething').addCallbackElement(textBox);
 button1.addClickHandler(clickHandler);

希望这可以帮助!

于 2013-01-21T14:37:05.500 回答
1

要将函数引用分配给某个变量,请执行以下操作:

var a = doSomething;

其中 doSomething 是一个函数。

但是当您必须传递参数并分配该函数时

var a = doSomething(b);

这将导致麻烦,因为在将函数分配给变量时,它会被调用,而不是在它打算被调用的时候。

为了克服这个问题,您可以使用箭头函数或简单函数来调用您自己的带有参数的函数。

var c = () => doSomething(d);

这实际上被理解为 var c = anonymous_function;

或者

var c = function() {
    doSomething(d);
}

因此你可以这样做:

document.getElementById('button1').onclick = () => doSomething('with_this_parameter');
于 2019-03-04T10:28:06.770 回答