12

Sử dụng tập lệnh google apps Tôi đang gặp sự cố khi chạy hàm js để chuyển tham số. Khi tôi thêm các tham số, nó sẽ luôn chạy mã khi trang tải thay vì khi nút được nhấp.chức năng onclick chạy tự động

trực tiếp từ ví dụ HtmlService, nó là OK - nó chạy khi nút được nhấn ...

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

Nhưng khi tôi thêm một tham số để gọi (và chức năng) như dưới đây, nó chỉ chạy một lần khi trang tải (và không phải khi nhấn nút) ...

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

Bất kỳ thông tin chi tiết nào về hành vi này sẽ được đánh giá cao ... xin lỗi nếu câu trả lời là hiển nhiên!

+3

'()' đằng sau tham chiếu hàm luôn gọi hàm. –

Trả lời

24

Khi bạn nói

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

Điều này có nghĩa gọi doSomething ('with_this_parameter') và sau đó gán giá trị trả về để document.getElementById('button1').onclick. Do đó đó là lý do tại sao nó được gọi khi mã đạt đến dòng đó. Liệu giá trị có thể gán cho thuộc tính đó hay không là một câu hỏi khác, nhưng đó là lý do tại sao nó được gọi.

Sử dụng nó như

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

tham khảo này: Giải pháp này được đưa ra bởi Mark Linus.

+0

Cảm ơn thông tin :) –

+1

+1 vì lời giải thích –

+1

Bạn được hoan nghênh. Câu trả lời được đề xuất bởi Mark Linus là cách để làm điều đó –

9

Làm như thế này:

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

Cảm ơn - công trình này! biết nó sẽ đơn giản: D –

1

Tôi thường làm clickHandlers như vậy:

// 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> 
} 

Tôi không chắc chắn những gì tham số bạn đang thêm, nhưng bạn cần phải thêm một yếu tố gọi lại để vượt qua nếu nó không được thông qua bởi chính nút thông qua .setId/getId hoặc .setTag/getTag. Nếu nó đến từ một hộp văn bản:

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

Hy vọng điều này sẽ hữu ích!

Các vấn đề liên quan