12

使用谷歌應用程序腳本我遇到了運行傳遞參數的js函數的麻煩。當我添加參數時,它總是在頁面加載時運行代碼,而不是單擊按鈕時。onclick函數自動運行

從HtmlService例如直接,這是確定 - 這當按下按鈕運行...

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

但是當我添加一個參數來調用(和功能)如下,它只是運行一旦在頁面加載時(而不是當按下按鈕)...

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

任何深入瞭解這種行爲將不勝感激......抱歉如果答案是顯而易見的!

+3

函數引用後面的'()'總是調用該函數。 –

回答

24

當你說

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給出。

+0

感謝您的信息:) –

+1

+1因爲解釋 –

+1

不客氣。馬克萊納斯建議的答案是這樣做的方式 –

9

這樣做:

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

謝謝 - 這工程!知道這將是簡單的:D –

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

希望這有助於!