2012-07-18 47 views
1

我在我的控制器中有一個方法,我用ajax調用。 該方法可以經常調用(取決於用戶打字的速度)。 用戶鍵入字母,單詞。我希望在用戶停止輸入時調用該方法。如何停止執行代碼的方法

該方法的參數是用戶寫入的文本。

以我的方式,該方法在很短的時間內被調用了很多次。

有沒有辦法總是調用方法(每個字母后),但如果立即調用立即停止執行的方法?

示例:用戶將緩慢寫入10個字母 - 該方法將被調用10次。 示例:用戶將快速寫入10個字母 - 該方法將被稱爲第10次或該方法將被調用10次,但將停止執行前9次並僅完成第10次執行

+0

你使用jQuery進行ajax調用嗎? – 2012-07-18 15:42:26

+1

您是否正在手動實施「自動完成」?也許你可以看看http://jqueryui.com/demos/autocomplete/ – 2012-07-18 15:44:35

+0

即使你沒有實現一個自動完成,那個自動完成的確會實現「不做任何事情,直到用戶暫停鍵入行爲,你可能會從中學習。 – Rawling 2012-07-18 15:46:37

回答

0

你可以使用javascript定時器來完成。這是一個例子,它在用戶最後一次按鍵後半秒鐘內觸發任何邏輯。 如果用戶鍵入保持,則計時器不斷被取消:

$(function() { 
    var timer; 
    $(".typeAhead").keypress(function() { 
     if (timer != null) 
      clearTimeout(timer); 
     timer = setTimeout(function() { 
      // do ajax call 
     }, 500); 
    }); 
}); 

該段使用jQuery的,但你可以不用它。只需使用getElementById()而不是選擇器。

3

假設您是用AJAX調用它,然後我認爲你最好放置邏輯客戶端。考慮使用諸如throttle.js之類的內容,這些內容只能在輸入暫停後發佈Ajax調用。

0

您可以通過緩存結果&將它們傳遞到此方法來完成此操作。基本上,通過將這種方法封裝在聚合器方法中,可以防止它始終觸發。

//... Class Impl 

private string keys = String.Empty; 
private readonly TimeSpan bufferDelay = new TimeSpan(100000); 
private DateTime lastKeyPress = DateTime.UtcNow; 

private void DoSomething(string text) 
{ 
//do something to process text. 
    keys = String.Empty; 

} 


public void DoSomethingBuffer(string text) 
{ 
    keys =+ text; 
    var now = DateTime.UtcNow; 
    if((now-lastKeyPress) > bufferDelay) 
{ 
    DoSomething(keys); 
} 
    lastKeyPress = now; 

} 
//... More Class Impl 

你需要玩聚合時間窗口來找到感覺自然的感覺,但它應該是相對簡單的。您將直接調用DoSOmethingBuffer而不是DoSomethign。