JQuery ile <input type = “text”> değişimini nasıl uygularım?


Yanıtlar:


219

Kullanabilirsiniz .change()

$('input[name=myInput]').change(function() { ... });

Ancak, bu etkinlik yalnızca seçici odak kaybolduğunda tetiklenir, bu nedenle bu işi yapmak için başka bir yeri tıklamanız gerekir.

Bu sizin için doğru değilse , tam olarak istediğiniz etkiye bağlı olarak keyup , keydown veya keypress gibi diğer jQuery etkinliklerinden bazılarını kullanabilirsiniz .


Ne yazık ki, bu gizli bir giriş için çalışmaz. Gizli bir girişte değişiklik yapılması gerektiğinde olası bir çözüm şudur: <input type = 'text' style = 'display: none' /> (css ile) ..
NickGreen

304
Not changegiriş elemanı kayıp odak olduğunda sadece patlayacaktır. Ayrıca, inputmetin kutusu odağı kaybetmeye gerek kalmadan güncellendiğinde tetiklenen olay da vardır . Önemli olayların aksine, metni yapıştırmak / sürüklemek için de çalışır.
pimvdb

4
Harika yorum @pimvdb. Bunu kullandım ve bu sorunun cevabına çevirdim.
iPadDeveloper2011

1
Ben bunu denemek ve sadece iki koşul karşılandığında olayın başladığını öğrendim gibi: 1) değer değişimi; ve 2) bulanıklık, birçok insanın değişimden () keyup () daha iyi ele alınıp alınmadığını merak ediyorum.
TARKUS

As changeIE9 tarafından desteklenmeyen, kullanabileceğiniz focusoutaynı comportment sahip olmak
Soma

247

@Pimvdb'nin yorumunda söylediği gibi,

Değişikliğin yalnızca giriş öğesi odağı kaybettiğinde tetikleneceğini unutmayın. Ayrıca, metin kutusu odağı kaybetmeye gerek kalmadan güncellendiğinde tetiklenen input olayı da vardır. Önemli olayların aksine, metni yapıştırmak / sürüklemek için de çalışır.

( Belgelere bakın .)

Bu çok faydalı, bir cevaba koymaya değer. Şu anda (v1.8 *?) Jquery'de .input () kolaylığı yok, bu yüzden bunu yapmanın yolu

$('input.myTextInput').on('input',function(e){
 alert('Changed!')
});

6
Özellikle, IE <9 hiç desteklemez.
dlo

13
Birden fazla etkinliğe bağlanabildiğiniz için $('form').on('change input', function);hile yaptım. Teşekkürler.
justnorris

9
@Norris. Bu, bir öğe değiştirildiğinde (1) muhtemelen iki kez patlar ve odağı (2) kaybeder. Bu birçok amaç için bir sorun değildir, ancak yine de dikkat çekmeye değer.
iPadDeveloper2011


Bunun, yapılan her giriş değişikliği için tetikleneceğini unutmayın (aradığınız şey bu olabilir). Ancak, "Değişiklik bittiğinde" gibi bir etkinlik arıyorsanız, harika bir örnek .
Trevor Nestman

79

Keyup olayı aşağıdaki gibi bir şey kullanarak öneririz:

$('elementName').keyup(function() {
 alert("Key up detected");
});

Aynı sonucu elde etmenin birkaç yolu vardır, bu yüzden tercihinize bağlıdır ve tam olarak nasıl çalışmasını istediğinize bağlıdır.

Güncelleme: Bu sadece manuel giriş için çalışır ve kopyalayıp yapıştırmaz.

Kopyala ve yapıştır için aşağıdakileri tavsiye ederim:

$('elementName').on('input',function(e){
 // Code here
});

Kesinlikle bunu metin girişleri için tavsiye ederim!
Vercas

20
Giriş elemanının içeriği, tuşlar ateşlenmeden değiştirilebilir. Örneğin, fareyi kullanarak metin yapıştırabilirsiniz.
celicni

Ayrıca, onay kutularını yakalamak için değişiklik hala gerekli görünüyor
turbo2oh

30

İşte kullandığım kod:

$("#tbSearch").on('change keyup paste', function () {
    ApplyFilter();
});

function ApplyFilter() {
    var searchString = $("#tbSearch").val();
    //  ... etc...
}

<input type="text" id="tbSearch" name="tbSearch" />

Bu, özellikle bir jqGridkontrolle eşleştirildiğinde oldukça iyi çalışıyor . Sadece bir metin kutusuna yazabilir ve sonuçları hemenjqGrid .


22

Bunu yapmanın tek ve güvenilir bir yolu vardır ve bu değeri bir aralıkta çekerek ve önbelleğe alınmış bir değerle karşılaştırarak olur.

Bunun tek yolu olmasının nedeni, çeşitli girişleri (klavye, fare, yapıştırma, tarayıcı geçmişi, sesli giriş vb.) Kullanarak bir giriş alanını değiştirmenin birden fazla yolu olması ve bunların tümünü bir haçtaki standart olayları kullanarak asla algılayamamanızdır. tarayıcı ortamı.

Neyse ki, jQuery'deki etkinlik altyapısı sayesinde kendi inputchange etkinliğinizi eklemek oldukça kolaydır. Burada yaptım:

$.event.special.inputchange = {
    setup: function() {
        var self = this, val;
        $.data(this, 'timer', window.setInterval(function() {
            val = self.value;
            if ( $.data( self, 'cache') != val ) {
                $.data( self, 'cache', val );
                $( self ).trigger( 'inputchange' );
            }
        }, 20));
    },
    teardown: function() {
        window.clearInterval( $.data(this, 'timer') );
    },
    add: function() {
        $.data(this, 'cache', this.value);
    }
};

Gibi kullanın: $('input').on('inputchange', function() { console.log(this.value) });

Burada bir demo var: http://jsfiddle.net/LGAWY/

Birden aralıklarla korkuyor ediyorsanız, unbind / Bu etkinliği bağlayabilir focus/ ' blur.


Is bu gibi kod çalışması mümkündür: $('body').on('inputchange', 'input', function() { console.log(this.value) });? Veya burada belirtildiği gibi değil: github.com/EightMedia/hammer.js/pull/98 ?
TheFrost

13
Böyle bir kod yazmak ve başlatmak, aşırı performans etkisi olan bir deliliktir.
Danubian Sailor

@ ŁukaszLech Lütfen, anlat bana. Ancak, daha önce de belirttiğim gibi odak / bulanıklık olaylarına basarsanız, aralık yalnızca geçici olarak çalışır. Elbette, 1988'den bir intel 386 bile tek bir aralığı kaldırabilir mi?
David Hellsing

5
<input id="item123" class="firstName" type="text" value="Hello there" data-someattr="CoolExample" />

$(".firstName").on('change keyup paste', function () {
   var element = $(this);
   console.log(element);
   var dataAttribute = $(element).attr("data-someattr");
   console.log("someattr: " + dataAttribute );
});

thisBu öğeyle ihtiyacınız olan her şeyi yapabilmeniz için öğenin tamamına erişmek için anahtar kelime kullanmanızı öneririz .


4

Dinamik / Ajax çağrıları olsa bile aşağıdakiler çalışır.

Senaryo:

jQuery('body').on('keyup','input.addressCls',function(){
  console.log('working');
});

Html,

<input class="addressCls" type="text" name="address" value="" required/>

Umarım bu çalışma kodu dinamik olarak erişmeye çalışan birine yardımcı olur / Ajax çağrıları ...


3
$("input").keyup(function () {
    alert("Changed!");
});

2

Sadece id ile çalışabilirsiniz

$("#your_id").on("change",function() {
    alert(this.value);
});

Bu mevcut cevaplara fazla bir şey katmıyor.
Pang

2

Bunu farklı şekillerde yapabilirsiniz, keyup bunlardan biridir. Ama aşağıda değişimle ilgili örnek veriyorum.

$('input[name="vat_id"]').on('change', function() {
    if($(this).val().length == 0) {
        alert('Input field is empty');
    }
});

Not: [name = "vat_id"] girişini giriş kimliğiniz veya adınızla değiştirin .


2

Eğer olayı tetiklemek istiyorsanız siz yazarken şunları kullanın:

$('input[name=myInput]').on('keyup', function() { ... });

Giriş alanından ayrılırken olayı tetiklemek istiyorsanız aşağıdakileri kullanın:

$('input[name=myInput]').on('change', function() { ... });

Bir nedenden dolayı bu benim için işe yaramadı, ama bu işe yaradı:$(document).on('change', 'input[name=myInput]', function() { ... });
Stefan

1
@Stefan, örneğinizdeki koda olay yetkisi denir. Giriş alanlarınız sayfa başlatıldıktan sonra toplanıyor olmalı, bu yüzden kodum sizin için çalışmadı.
Usman Ahmed

1
$("input").change(function () {
    alert("Changed!");
});

4
Bu seçeneğin sorunu, yalnızca giriş odağını kaybettiğinizde çalışmasıdır
Yises

Bu hala bazı vakalara uyacaktır.
James Drinkard

1

Bu benim için çalıştı. Adı ile alan ise fieldA tıklandığında veya herhangi bir tuşa girilir o id ile alanını günceller Fieldb .

jQuery("input[name='fieldA']").on("input", function() {
    jQuery('#fieldB').val(jQuery(this).val());
});

0

Kullanabilirsin .keypress().

Örneğin, HTML'yi düşünün:

<form>
  <fieldset>
    <input id="target" type="text" value="Hello there" />
  </fieldset>
</form>
<div id="other">
  Trigger the handler
</div>

Olay işleyici giriş alanına bağlanabilir:

$("#target").keypress(function() {
  alert("Handler for .keypress() called.");
});

Andy ile tamamen aynı fikirdeyim; hepsi nasıl çalışmasını istediğinize bağlıdır.


1
Kopyalama / yapıştırma işlemleri için çalışmaz. Fare tıklamasıyla metin yapıştırılırsa hiçbir olay tetiklenmez.
DaveN59
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.