onclick 函数自动运行

IT技术 javascript google-apps-script web-applications dom-events
2021-02-05 13:04:16

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

直接从 HtmlService 示例来看,没问题 - 它在按下按钮时运行......

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

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

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

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

4个回答

当你说

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给出

用解决方案完成您的问题(从我的复制/粘贴),然后它将被标记为已接受
2021-03-20 13:04:16
不客气。Mark Linus 建议的答案是这样做的方法
2021-04-04 13:04:16

这样做:

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

我通常像这样执行 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);

希望这可以帮助!

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

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');