Xóa trường biểu mẫu sau khi chọn cho jQuery UI Autocomplete


97

Tôi đang phát triển một biểu mẫu và sử dụng jQuery UI Autocomplete. Khi người dùng chọn một tùy chọn, tôi muốn lựa chọn đó xuất hiện trong khoảng được nối vào <p>thẻ mẹ . Sau đó, tôi muốn trường xóa thay vì được điền vào vùng chọn.

Tôi có khoảng thời gian xuất hiện tốt, nhưng tôi không thể làm cho sân rõ ràng.

Làm cách nào để bạn hủy hành động chọn mặc định của jQuery UI Autocomplete?

Đây là mã của tôi:

var availableTags = ["cheese", "milk", "dairy", "meat", "vegetables", "fruit", "grains"];
$("[id^=item-tag-]").autocomplete({
    source: availableTags,

    select: function(){
        var newTag = $(this).val();
        $(this).val("");
        $(this).parent().append("<span>" + newTag + "<a href=\"#\">[x]</a> </span>");
    }
});

Đơn giản là làm $(this).val("");không hiệu quả. Điều đáng buồn là gần như chức năng chính xác hoạt động tốt nếu tôi bỏ qua tính năng tự động hoàn thành và chỉ thực hiện hành động khi người dùng nhập dấu phẩy như sau:

$('[id^=item-tag-]').keyup(function(e) {
    if(e.keyCode == 188) {
        var newTag = $(this).val().slice(0,-1);
        $(this).val('');
        $(this).parent().append("<span>" + newTag + "<a href=\"#\">[x]</a> </span>");
    }
});

Kết quả cuối cùng thực sự là làm cho tính năng tự động hoàn thành hoạt động với nhiều lựa chọn. Nếu ai đó có bất kỳ đề xuất nào cho điều đó, họ sẽ được hoan nghênh.

Câu trả lời:


182

Thêm $(this).val(''); return false; vào cuối selectchức năng của bạn để xóa trường và hủy sự kiện :)

Điều này sẽ ngăn không cho giá trị được cập nhật. Bạn có thể xem cách nó hoạt động xung quanh dòng 109 tại đây .

Mã trong đó kiểm tra sai cụ thể:

if ( false !== self._trigger( "select", event, { item: item } ) ) {
  self.element.val( item.value );
}

Tuyệt diệu! Tôi cảm thấy thật ngớ ngẩn. Bây giờ tôi biết, và biết là một nửa trận chiến.
Jon F Hancock

Nó đã sửa nó. Tôi cố gắng chấp nhận, nhưng nó nói với tôi rằng tôi không thể trong 7 phút nữa. Đã được chấp nhận. Cảm ơn.
Jon F Hancock

1
Hãy để tôi chỉ thêm rằng một khi bạn trả về false, bạn không cần phải tự đặt giá trị nữa (tức là không cần $(this).val('');)
Uri

9
Nếu ai đó muốn trường đầu vào không có bất kỳ giá trị nào, tôi tin rằng lệnh gọi đến .val('')vẫn phải xảy ra. Các return false;chỉ ngăn ngừa được văn bản của mục được chọn xuất hiện trong lĩnh vực đầu vào.
Ryan

1
Uri sai và Ryan đúng. Bạn cần trả về false để ngăn nó cập nhật với lựa chọn của bạn và bạn cũng cần có $ (this) .val ('') nếu bạn muốn xóa nó.
mynameistechno

19

Thay vì trả về false, bạn cũng có thể sử dụng event.preventDefault ().

select: function(event, ui){
    var newTag = $(this).val();
    $(this).val("");
    $(this).parent().append("<span>" + newTag + "<a href=\"#\">[x]</a> </span>");
    event.preventDefault();
}

Tôi nghi ngờ phương pháp này hiệu quả hơn câu trả lời được chấp nhận.
dlsso

6

Trả về false là cần thiết trong lệnh gọi lại đã chọn, để làm trống trường. nhưng nếu bạn muốn kiểm soát lại trường, tức là đặt giá trị, bạn phải gọi một hàm mới để thoát ra khỏi ui.

Có lẽ bạn có một giá trị nhanh chóng chẳng hạn như:

var promptText = "Enter a grocery item here."

Đặt nó làm val của phần tử. (về tiêu điểm, chúng tôi đặt thành '').

$("selector").val(promptText).focus(function() { $(this).val(''); }).autocomplete({
    source: availableTags,
    select: function(){
        $(this).parent().append("<span>" + ui.item.value + "<a href=\"#\">[x]</a> </span>");
     foo.resetter(); // break out //
    return false;  //gives an empty input field // 
    }
});

foo.resetter = function() {
  $("selector").val(promptText);  //returns to original val
}

Xin chào, tôi có một câu hỏi khác, về việc lưu lời nhắc, tôi không thể sử dụng trình giữ chỗ vì lý do kỹ thuật. Điều này thật hoàn hảo, CẢM ƠN BẠN!
hgolov

5

Nó hoạt động tốt cho tôi.

Sau khi chọn sự kiện, tôi đã sử dụng thay đổi sự kiện.

 change:function(event){
   $("#selector").val("");  
   return false;
 }

Tôi là người mới bắt đầu!


0

Thử cái này

select: function (event, ui) {
    $(this).val('');
    return false;       
}

0

Tôi vừa giải quyết nó buộc phải mất tập trung:

$('#select_id').blur();
printResult();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.