2013-11-26 17 views
1

我有一個帶文本框的web應用程序在下拉列表中進行搜索。 我使用這個文本框的搜索未使用最新輸入值的Keydown事件

@Html.TextBox("Search", 
       "", 
       new { id = "Search" + @Model.ID + "", 
        @class = "Search" }) 

在此下拉

@Html.DropDownListFor(
     m => m.MainSynonymId, 
     new SelectList(ViewBag.SynonymList, 
         "ID", 
         "Name", 
         Model.MainSynonymId), 
     new { id = "MainSynonymList" + @Model.ID + "", 
       @class = "SynonymList TableClass" }) 

如果我的東西在搜索輸入填充,下拉應該自動唯一內容元素,包含搜索到的字母。所以我在keydown上實現了一個jquery方法來觸發所有輸入,將它們發送到服務器並使用json發送回客戶端。 這裏是jQuery:

$('.Search').bind("keydown", function (event) { 
      var fieldId = $(this).attr('id'); 
      var field = "Search"; 
      var id = fieldId.replace(field, ''); 
      $.getJSON('@Url.Action("GetSpecific", "Models")', { Name: $('#' + fieldId + '').val() }, function (data) { 
       var items; 
       $.each(data, function (i, g) { 
        items += "<option value='" + g.Value + "'>" + g.Text + "</option>"; 
        $.ajaxSetup({ cache: false }); 
       }); 
       $('#MainSynonymList' + id + '').html(items); 
      }); 
       }); 

通信工作幾乎沒有問題。唯一的問題是,keydown上的方法不會使用已使用的鍵,而是輸入字段中的所有其他方法。

例如:我在輸入字段「example」中寫道,在我按下最後一個「e」觸發的事件後,將單詞「exampl」發送到服務器。 我做錯了什麼?

+0

爲什麼不使用'$(本).VAL()',而不是使用這種費解的代碼? – Achrome

+0

好主意,但它只代替代碼中的一個點。我仍然需要從文本字段獲取id,因爲它在每行中都有這樣一個方法的表中,並且每個方法只應觸發行中的下拉列表。 –

+0

只有觸發此事件的文本框纔會被'$(this)'引用。 – Achrome

回答

4

這是因爲在將值添加到字段之前​​事件正在觸發。改爲使用keyupkeypress

+0

謝謝你這就是我錯過:) –

+0

沒問題,很樂意提供幫助。 –

1

只需將keydown替換爲代碼中的keyup即可。

這應該成爲

$('.Search').bind("keydown", function (event) {} 

$('.Search').bind("keyup", function (event) {} 

這裏是一個example