2011-06-23 12 views

Trả lời

6

Ryan's example đưa việc hủy bỏ trong trường hợp keypress không làm việc cho tôi, nhưng chúng ta có thể đặt nó trong select tùy chọn autocomplete:

select: function(e, ui) { 
    if(e.keyCode === 9) return false; 
    // other code... 
} 
1

Tab không thực sự chọn mục hiện tại, nó sẽ di chuyển con trỏ đến mục có thể tab tiếp theo. Vì vậy, những gì bạn cần làm là vô hiệu hóa tab cho autocomplete:

Lock tab key with javascript?

Something như thế này đang làm việc cho tôi, bạn có thể cần phải sửa đổi nó một số chi tiết.

http://jsfiddle.net/Uubn6/

Về cơ bản, bạn nắm bắt sự kiện KeyDown trước khi đi qua nó để xử lý tự động hoàn KeyDown. Khi bạn nắm bắt nó, bạn có thể làm bất cứ điều gì bạn muốn (vượt qua nó hay không).

+0

Điều này không âm thanh đúng. Nếu đó là sự kiện mờ đang kích hoạt sự kiện được chọn (tập trung phần tử tiếp theo qua tab), thì nó cũng sẽ kích hoạt khi tôi * nhấp * phần tử khác, nhưng điều đó không xảy ra. Ngoài ra, trong fiddle của bạn, bạn đang ngăn cản tôi từ tabbing để các yếu tố tiếp theo, đó là đối diện chính xác của những gì tôi muốn. Tôi muốn có thể chuyển sang mục nhập tiếp theo * mà không * kích hoạt lựa chọn. – mpen

+0

Mặc dù ví dụ của bạn * không * ngăn tự động hoàn thành ... – mpen

4

Khi bạn sử dụng công cụ sửa đổi .autocomplete() trong jquery-ui, nó sẽ đặt trình xử lý nhấn phím cho hộp văn bản đầu vào của bạn như sau. Menu self.menu.select đặt hộp văn bản thành giá trị hiện được đánh dấu trong danh sách tự động hoàn thành

.bind("keydown.autocomplete", function(event) { 
... 
switch(event.keyCode) { 
... 
case keyCode.TAB: 
    if (!self.menu.active) { 
     return; 
    } 
    self.menu.select(event); 
    break; 
... 
    } 
} 

Vì vậy, những gì bạn cần làm là đảm bảo rằng trình xử lý này không được gọi. Tôi đã có thể làm điều này bằng cách thêm một trình xử lý để nhấn phím trả về false từ trình xử lý nếu nhấn phím là TAB.

$("#tags").autocomplete({ 
     source: availableTags 
    }); 
$("#tags").keypress(function(e){ 
    if(e.keyCode == keyCode.TAB) { 
     e.stopImmediatePropagation(); 
    } 
}); 

You can see the result here.

+0

quên bao gồm jquery ui trong jsfiddle. Tôi đã làm và nó không hiệu quả với tôi. – zsalzbank

+0

Tôi vừa cập nhật liên kết. Bây giờ nó sẽ trỏ đến một jsfissle bao gồm thư viện jquery-ui. –

+0

Nó hoạt động khi chúng tôi thêm thư viện (http://jsfiddle.net/mnbayazit/TmZVw/3/) nhưng cửa sổ vẫn mở (xấu!). Ngoài ra, fiddle của bạn là hoàn toàn trái ngược với những gì bạn đã viết trong câu trả lời của bạn (bạn unbound blur). – mpen