2012-06-11 17 views
7

Tôi đang tạo hộp kiểm kiểu "mã thông báo đầu vào" với tự động điền (loại người dùng trong mục nào đó, chọn câu trả lời, thêm "mã thông báo" vào chế độ xem DOM).Thêm giá trị vào thời gian thực tự động hoàn thành jQuery

Sử dụng tính năng tự động hoàn thành jQuery, có cách nào để thêm các giá trị không có trong danh sách source sau khi người dùng nhập chúng không? Ví dụ, một nguồn trông giống như ["Apples", "Oranges", "Bananas"]. Người dùng nhập vào "plums," khi sử dụng trường văn bản. Có cách nào để thêm "Mận" vào danh sách các nguồn nếu người dùng mong muốn không? Tôi biết có selectchange sự kiện mà tôi có thể kiểm tra, nhưng select chỉ hoạt động nếu có gì đó để chọn (không có trong trường hợp này) và change sẽ yêu cầu một số loại kiểm tra thời gian chờ để xác minh rằng người dùng đã ngừng nhập.

Ngược lại, có plugin nào khác mà tôi có thể sử dụng để thực hiện hành vi này không?

+0

Bạn không thể sử dụng sự kiện keyup? – j08691

+0

'thay đổi' sẽ hoạt động ở đây. Nó bao gồm một thời gian chờ sau khi người đó đã ngừng nhập và đã điều hướng khỏi trường. Bạn gặp phải vấn đề gì khi cố sử dụng? –

Trả lời

10

Điều này sẽ hoạt động tốt với sự kiện thay đổi của autocomplete. Mã này giả sử có một nút có id add xuất hiện khi bạn muốn thêm một mục mới vào danh sách. Nó sẽ không xuất hiện nếu người dùng chọn một mục từ danh sách. Có một số tinh chỉnh có thể được thực hiện, nhưng bằng chứng này của khái niệm nên làm cho nó có thể:

var source = ["Apples", "Oranges", "Bananas"]; 

$(function() { 
    $("#auto").autocomplete({ 
     source: function (request, response) { 
      response($.ui.autocomplete.filter(source, request.term)); 
     }, 
     change: function (event, ui) { 
      $("#add").toggle(!ui.item); 
     } 
    }); 

    $("#add").on("click", function() { 
     source.push($("#auto").val()); 
     $(this).hide(); 
    }); 
}); 

Dưới đây là một ví dụ: http://jsfiddle.net/rmGqB/


Cập nhật: Âm thanh như tôi hơi hiểu lầm yêu cầu. Bạn cũng có thể khai thác vào kết quả mà autocomplete sẽ đưa vào danh sách ứng cử viên với và lái xe khả năng hiển thị của nút dựa trên hay không kết quả tìm kiếm mang lại bất kỳ kết hợp chính xác:

var source = ["Apples", "Oranges", "Bananas"]; 

$(function() { 
    $("#auto").autocomplete({ 
     source: function (request, response) { 
      var result = $.ui.autocomplete.filter(source, request.term); 

      $("#add").toggle($.inArray(request.term, result) < 0); 

      response(result); 
     } 
    }); 

    $("#add").on("click", function() { 
     source.push($("#auto").val()); 
     $(this).hide(); 
    }); 
}); 

Ví dụ:http://jsfiddle.net/VLLuJ/

+0

Không sử dụng sự kiện 'thay đổi' yêu cầu trường bị mờ? Mối quan tâm của tôi là nếu người dùng nhập một giá trị mới, sẽ không có kết quả tìm kiếm nào được trả lại (hoạt động như một trường văn bản bình thường). Làm thế nào họ có thể biết "thêm" giá trị mới nếu không có gì chỉ ra rằng nó mới? Có cách nào để móc vào những gì được trả về bằng phương pháp tìm kiếm không? –

+0

Vì vậy, bạn muốn thêm một mục vào danh sách phút mà mảng nguồn không bao gồm nó? Điều đó sẽ không gây ra mọi nhân vật duy nhất mà người đó gõ vào trong mảng nguồn? Hay tôi hiểu lầm? –

+0

Xin lỗi, tôi không nghĩ rằng tôi đang truyền đạt ý tưởng đúng đắn. Yêu cầu là người dùng nhập vào một thuật ngữ, điều này kích hoạt tính năng tự động hoàn thành. Nếu họ không nhìn thấy những gì họ muốn trong danh sách các tùy chọn có sẵn, họ có thể thêm thuật ngữ bằng cách nào đó (nút, nhấn enter, vv), mà đặt nó trong danh sách và cũng chọn nó. Đây là lý do tại sao tôi không biết nếu "thay đổi" sẽ làm việc. Nếu tôi đang sử dụng JSON từ xa như một nguồn, tôi nghĩ rằng tôi có thể đặt trong một cuộc gọi lại, nhưng đó không phải là trường hợp ở đây. Nguồn được hiển thị nội tuyến với trang trong trường hợp này. –

1

Câu trả lời do Andrew cung cấp khiến nút ADD MỚI vẫn còn, ngay cả khi người dùng sau đó chọn một mục hiện có từ mảng thay vì thêm "mới" !!!

Thay vì bao gồm nút bật lên trên nút 'thêm', có chức năng .change được tích hợp trong tự động điền có thể được sử dụng.

Mặc dù "Thay đổi" chờ cho đến khi hộp văn bản bị mất tiêu điểm, đây có thể là giao diện tốt hơn để hiển thị nút THÊM nếu không khớp với mảng. (hoặc có thể tạo "xác nhận" để thêm).

Xem mã thay thế thực sự ẩn "Thêm nút" một lần nữa nếu người dùng chọn từ mảng đó. Một cái gì đó mà giải pháp Andrew Whitaker của không làm:

$(function() { 

    var source = ["Apples", "Oranges", "Bananas"]; 

    $("#auto").autocomplete({ 
    source: function (request, response) { 
     var result = $.ui.autocomplete.filter(source, request.term); 


     response(result); 
    }, 
    change: function(event, ui) { 
     var $label = $(this); 
     // figure out the id of hidden input box from label id 
     var $id = $('#'+this.id.replace('label_','id_')); 
     if (ui.item === null && $label.val() != ''){ 
     $("#add").show();    
     } 
     if(ui.item != null && $label.val() != ''){ 
     $("#add").hide();    
     } 
    } 
    }); 

    $("#add").on("click", function() { 
    source.push($("#auto").val()); 
    $(this).hide(); 
    }); 

}); 

Xem Fiddle sửa đổi của tôi trong hành động - http://jsfiddle.net/VLLuJ/25/

0

Cũ câu hỏi, nhưng câu trả lời hữu ích:

Để cập nhật nguồn autocomplete, sử dụng setter:

$ ("# tự động").tự động hoàn thành ("tùy chọn", "nguồn", ["Táo", "Cam", "Chuối", "Mận"]);

Xem http://api.jqueryui.com/autocomplete/#option-source