JQuery UI Autocomplete'i seçtikten sonra form alanını temizleyin


97

Bir form geliştiriyorum ve jQuery UI Autocomplete kullanıyorum. Kullanıcı bir seçenek belirlediğinde, seçimin üst <p>etikete eklenen bir aralıkta açılmasını istiyorum . Ardından, seçimle doldurulmak yerine alanın temizlenmesini istiyorum.

Açıklık gayet iyi görünüyor ama alanı temizleyemiyorum.

JQuery UI Autocomplete'in varsayılan seçme eylemini nasıl iptal edersiniz?

İşte kodum:

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>");
    }
});

Basitçe yapmak $(this).val("");işe yaramıyor. Çıldırtıcı olan, otomatik tamamlamayı göz ardı edersem ve kullanıcı virgül yazdığında hemen harekete geçersem neredeyse tam işlevin düzgün çalışması:

$('[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>");
    }
});

Gerçek sonuç, otomatik tamamlamanın birden çok seçimle çalışmasıdır. Herhangi birinin bunun için herhangi bir önerisi varsa, memnuniyetle karşılanacaktır.

Yanıtlar:


182

Alanı temizlemek ve etkinliği iptal etmek $(this).val(''); return false; için selectişlevinizin sonuna ekleyin :)

Bu, değerin güncellenmesini engelleyecektir. 109. satırda nasıl çalıştığını burada görebilirsiniz .

Buradaki kod özellikle yanlış olup olmadığını kontrol eder:

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

Fantastik! Yine de aptal hissediyorum. Artık biliyorum ve bilmek savaşın yarısıdır.
Jon F Hancock 01.10

Düzeltdi. Kabul etmeye çalıştım ama bana 7 dakika daha yapamayacağımı söyledi. Kabul edilmiş. Teşekkürler.
Jon F Hancock 01.10

1
Bir kez yanlış döndürdüğünüzde artık değeri kendiniz ayarlamanıza gerek olmadığını eklememe izin verin (yani gerek yok $(this).val('');)
Uri

9
Girdi alanının herhangi bir değerden arındırılmış olması istenirse, .val('')yine de bir çağrının olması gerektiğine inanıyorum . return false;Sadece giriş alanına görünmesini seçilen öğenin metnini önleyecektir.
Ryan

1
Uri yanlış ve Ryan haklı. Seçiminizle güncellenmesini önlemek için false döndürmeniz gerekir ve bunu temizlemek istiyorsanız ek olarak $ (this) .val ('') gerekir.
mynameistechno

19

False döndürmek yerine event.preventDefault () öğesini de kullanabilirsiniz.

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

Bu yöntemin kabul edilen cevaptan daha verimli olduğundan şüpheleniyorum.
dlsso

6

alanı boşaltmak için seçili geri aramada yanlış döndürmek gerekir. ancak alanı yeniden kontrol etmek, yani değeri ayarlamak istiyorsanız, kullanıcı arayüzünden çıkmak için yeni bir işlev çağırmanız gerekir.

Belki de aşağıdaki gibi bir anlık değeriniz vardır:

var promptText = "Enter a grocery item here."

Bunu elementin değeri olarak ayarlayın. (odakta '' olarak ayarladık).

$("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
}

Merhaba, istemi kaydetmeyle ilgili farklı bir sorum vardı, yer tutucuları teknik nedenlerle kullanamıyorum. Bu mükemmeldi, TEŞEKKÜRLER!
hgolov

5

Benim için iyi çalışıyor.

Olay seçtikten sonra olay değişikliği kullandım.

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

Acemiyim!


0

Bunu dene

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

0

Odağı kaybetmeye zorlayarak çözdüm.

$('#select_id').blur();
printResult();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.