2012-09-12 100 views
0

使用UiApp從窗體收集數據,但我有用戶雙擊提交按鈕。這運行兩次doPost。當然,他們必須快速點擊才能讓它實際發佈兩次,但發生了。如何停止雙擊/雙張表單?

我的問題是:有沒有人有禁用提交按鈕的經驗,用onMouseUp說?有一個更好的方法嗎?我被告知要謹慎地爲按鈕添加多個onClick處理程序,因爲它可能不穩定。任何穩定的解決方案?

我必須使用提交按鈕,因爲表單中有文件上傳。

回答

0

我遇到過這個問題,自從Google推出ClientHandlers以來,就有了出路。 只需添加一個客戶端處理您提交按鈕禁用它(記住使它能夠當你與服務器的處理函數或doPost完成)

var plswait = app.createClientHandler().forEventSource().setEnabled(false).setText('Please wait...'); 
var btnSubmit = app.createSubmit().addMouseDownHandler(plswait); 

是我的最愛。

+0

它看起來好像submitButton需要運行一個完整的點擊週期,上下調用doPost。嘗試使用MouseDown(doPost),MouseUp(plswait)分割事件,但似乎doPost無法找到文件上傳。處理程序似乎打破了doPost和SubmitButtons之間的特殊關係 – MartinK

+0

我給了答案一張支票,因爲我認爲它可以解決許多問題,但是如果有人找到一種方法可以讓它與真正的submitButton一起工作,並且文件上傳,請讓我知道。 – MartinK

0

我有同樣的問題,但要解決它,我創建了第二個「false」按鈕,當點擊提交按鈕時變得可見,同時「真實」提交按鈕可見性設置爲false。以下是基本代碼:

var button = app.createSubmitButton('Submit').setId("button") 
    .setEnabled(false) 

var falseButton = app.createButton('Submit').setId("falseButton") 
    .setEnabled(false) 
    .setVisible(false); 

var handler = app.createClientHandler() 
    .forTargets(button).setVisible(false) 
    .forTargets(falseButton).setVisible(true); 

button.addClickHandler(handler); 

panel.add(app.createHorizontalPanel().add(button).add(falseButton); 
0

第一個答案對我來說不起作用,因爲MouseDown處理程序沒有讓ServerHandler運行。但它給了我正確的方向。我剛剛添加了客戶端處理程序以在添加服務器處理程序之前禁用該按鈕......並且似乎可以防止雙擊。像這樣:

var submitButton = myapp.createButton("Submit"); 
    var myServerHandler = myapp.createServerClickHandler("myServerHandler"); 
    var pleaseWait = myapp.createClientHandler().forEventSource().setEnabled(false).setText('submitting...'); 
    submitButton.addClickHandler(pleaseWait); 
    submitButton.addClickHandler(myServerHandler);