web-dev-qa-db-ja.com

onclick関数は自動的に実行されます

Google Apps Scriptを使用すると、パラメータを渡すjs関数の実行に問題があります。パラメータを追加すると、ボタンがクリックされたときではなく、ページが読み込まれたときに常にコードが実行されます。

HtmlServiceの例から直接、それはOKです-ボタンが押されたときに実行されます...

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

しかし、以下のように呼び出し(および関数)にパラメーターを追加すると、ページが読み込まれたときに(ボタンが押されたときではなく)1回だけ実行されます...

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

この振る舞いについての洞察は大歓迎です...答えが明白であるならば申し訳ありません!

16
T-L

あなたが言う時

_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 によって提供されました。

33
Hanky Panky

このようにしてください:

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

関数の参照を変数に割り当てるには、次のようにします。

var a = doSomething;

ここで、doSomethingは関数です。

ただし、パラメータを渡してその関数を割り当てる必要がある場合

var a = doSomething(b);

これにより、関数を変数に割り当てているときに、呼び出される予定のときにではなく呼び出されるため、問題が発生します。

これを克服するために、矢印関数または単純な関数を使用して、paramsを使用して独自の関数を呼び出すことができます。

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

これは実際にはvar c = Anonymous_functionとして理解されます;

または

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

したがって、次のことができます。

document.getElementById('button1').onclick = () => doSomething('with_this_parameter');
1
abhishek kasana

私は通常、次のようにclickHandlerを実行します。

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

お役に立てれば!

1
Trevor Iampen