Bir metin kutusunun içeriği nasıl algılanır


417

Bir metin kutusunun içeriği her değiştiğinde algılamak istiyorum. Keyup yöntemini kullanabilirim, ancak bu aynı zamanda ok tuşları gibi harf üretmeyen tuş vuruşlarını da algılar. Keyup olayını kullanarak bunu yapmanın iki yöntemini düşündüm:

  1. Basılan tuşun ascii kodunun \ backspace \ delete harfi olup olmadığını açıkça kontrol edin
  2. Tuş vuruşundan önce metin kutusundaki metnin ne olduğunu hatırlamak için kapaklarını kullanın ve bunun değişip değişmediğini kontrol edin.

Her ikisi de biraz hantal görünüyor.


7
Evet, bunun için keyup yakalamak kötü. Herhangi bir tuşa basmadan bir şeyler yapıştırabilirsiniz.
harcı

2
Son çözümünüzü paylaşma şansınız var mı? Ben de bu sorunu çözmek gerekiyor :)
Matt Dotson

1
or .keyup()event ... daha fazla bilgi burada: stackoverflow.com/questions/3003879/…
Victor S

1
Bkz. $ ("# Some-input"). ChangePolling () ; geçerli değeri kontrol eden ve .change()değiştiyse tetikleyen bir sarıcı için .
Joel Purra

Yanıtlar:


714

'Değiştir' yerine 'giriş' olayını izlemeye başlayın.

jQuery('#some_text_box').on('input', function() {
    // do your stuff
});

... güzel ve temiz, ancak aşağıdakilere daha da genişletilebilir:

jQuery('#some_text_box').on('input propertychange paste', function() {
    // do your stuff
});

12
'canlı' kullanımdan kaldırıldı. bu yüzden 'on' stackoverflow.com/a/15111970/1724777
NavaRajan

21
'Girdi'nin tek çöküşü IE <9 ile uyumlu olmamasıdır.
Catfish

5
input, tüm tarayıcılarda desteklenmeyen html5 olayıdır. developer.mozilla.org/tr-TR/docs/Web/API/window.oninput
commonpike

18
Ayrıca: .on ('input propertychange paste', function () {
Graeck

23
IE <9'un tek düşüşü, hiç kimsenin kullanmamasıdır!
sohaiby

67

HTML / standart JavaScript'te onchange olayını kullanın.

JQuery de change () olayıdır. Örneğin:

$('element').change(function() { // do something } );

DÜZENLE

Bazı yorumları okuduktan sonra ne olacak?

$(function() {
    var content = $('#myContent').val();

    $('#myContent').keyup(function() { 
        if ($('#myContent').val() != content) {
            content = $('#myContent').val();
            alert('Content has been changed');
        }
    });
});

3
Evet, bu benim sorum 2. seçenekte önerdiğim şeye benziyor. Genel bir işlev kullanmanın bu işlevi yalnızca bir metin kutusu için çalıştıracağından kapanışları tercih ederim. Her neyse, garip jquery'nin bunu yapmanın daha basit bir yolu yok gibi görünüyor.
olamundo

1
Gerçekten tuhaf, ama bunu yapmanın daha iyi bir yolu olduğundan şüpheliyim. SetInterval'ı kullanabilir ve içeriğin her 0.1 saniyede bir değiştirilip değiştirilmediğini kontrol edebilir ve ardından bir şeyler yapabilirsiniz. Bu, fare macunlarını ve benzerlerini de içerecektir. Ama kulağa çok zarif gelmiyor.
Waleed Amjad

4
İçeriğin tuş vuruşu olmadan, örneğin fare ile yapıştırılarak değiştirilmesi hala mümkündür. Bunu önemsiyorsanız, teorik olarak fare olaylarını da yakalayabilirsiniz, ancak bu kurulum daha çirkin. Öte yandan, fareye dayalı değişiklikleri göz ardı etmek istiyorsanız, bunu yaparsınız.
Adam Bellaire

45

'Change' olayı düzgün çalışmıyor, ancak 'input' mükemmel.

$('#your_textbox').bind('input', function() {
    /* This will be fired every time, when textbox's value changes. */
} );

7
Bu durum benim durumum için mükemmel çalışıyor, ancak kullanımı .on1,7'den (ziyade .bind) önerilir .
Nick

8
OP, tarayıcılar arası uyumluluk ihtiyacı belirtmedi. @schwarzkopfb bir çözüm sundu. Oy vermek için bir sebep yok çünkü bunu yapacak temsilciniz var.
David East

3
@David ayrıca hangi tarayıcıyı belirtmedi
ozz

9
@ jmo21 Bir tarayıcı belirli olmadığında web geliştirme için çözümün çapraz fonksiyonel olması gerektiğini varsayabiliriz. Norm tüm tarayıcıları destekliyor.
Chris

3
@Chris "Norm tüm tarayıcıları destekliyor" - yalnızca sadistseniz. IE 8 / 9'da global kullanıcıların% 2'si için HTML5 iyiliğinden kaçınmanın iyi bir nedeni yoktur. caniuse.com/#feat=input-event
Yarin

39

Buna ne dersin:

<jQuery 1.7

$("#input").bind("propertychange change keyup paste input", function(){
    // do stuff;
});

> jQuery 1.7

$("#input").on("propertychange change keyup paste input", function(){
    // do stuff;
});

Bu IE8 / IE9, FF, Chrome'da çalışır


1
Bu cevapla ilgili sorun, değer değişmemiş olsa bile, metin kutusunu bulanıklaştırdığınızda tetiklenmesidir. Suçlu "değişim" dir.
Justin

Chrome mu kullanıyorsunuz? Krom ile ilgili bir hata gibi görünüyor ve jQuery'nin
Catfish

çalışır, ancak console.logbir karakter girdiğinizde iki kez günlüğe kaydedilen alanın değerini yaparsanız küçük bir hata vardır .
Samuel

21

Tuş vuruşundan önce onay kutusundaki metnin ne olduğunu hatırlamak için kapaklarını kullanın ve bunun değişip değişmediğini kontrol edin.

Evet. Kapakları mutlaka kullanmak zorunda değilsiniz, ancak eski değeri hatırlamanız ve yenisiyle karşılaştırmanız gerekir.

Ancak! Bu, her değişikliği yakalamayacaktır, çünkü herhangi bir tuşa basma içermeyen metin kutusu içeriğini düzenlemenin bir yolu vardır. Örneğin, bir metin aralığı seçip sağ tıklatarak kesin. Veya sürükleyerek. Veya metni başka bir uygulamadan metin kutusuna bırakmak. Veya tarayıcının yazım denetimi yoluyla bir kelimeyi değiştirme. Veya...

Bu yüzden her değişikliği tespit etmeniz gerekiyorsa, bunun için anket yapmak zorundasınız. window.setIntervalAlanı her saniye (önceki) önceki değerine göre kontrol edebilirsiniz . Ayrıca tel olabilir onkeyupo değişiklikler nedenle aynı fonksiyona olan basılmasını neden çabuk yansır.

Hantal? Evet. Ancak bu ya da normal HTML değişim yolunu yapın ve anında güncellemeye çalışmayın.


1
inputGünümüzde HTML5 etkinliği uygulanabilir ve tüm büyük tarayıcıların geçerli sürümlerinde çalışır.
Tim Down

13
$(document).on('input','#mytxtBox',function () { 
 console.log($('#mytxtBox').val());
});

Metin kutusundaki içerik değişikliğini algılamak için 'giriş' olayını kullanabilirsiniz. Jquery-1.7'de kullanımdan kaldırıldığı için olayı bağlamak için 'canlı' kullanmayın, bu yüzden 'açık'ı kullanın.


@NavaRajan IE9'da tekrar test ettim. gerçekten backspace üzerinde çalışmıyor.
Flores

Ben yaşamak istemiyorum, ama yaşadığım sorun bir şekilde "geleceğe geri" ve takım kurşun "kutunun dışında" ile sopa istediği bir mvc3 proje üzerinde gitmiş olmasıdır sadece EF 4.0, ancak jquery 1.5.1 kullanılıyor THUS .on
Tom Stickel

5

Metin kutusu değiştiğinde etkileşimli bir şey yapmak istediğinizi varsayalım (yani bazı verileri ajax aracılığıyla alın). Aynı işlevselliği arıyordum. Küresel kullanımı en sağlam ya da zarif bir çözüm değil, biliyorum. İşte bir örnek:

var searchValue = $('#Search').val();
$(function () {
    setTimeout(checkSearchChanged, 0.1);
});

function checkSearchChanged() {
    var currentValue = $('#Search').val();
    if ((currentValue) && currentValue != searchValue && currentValue != '') {
        searchValue = $('#Search').val();
        $('#submit').click();
    }
    else {
        setTimeout(checkSearchChanged, 0.1);
    }
}

Burada dikkat edilmesi gereken önemli bir şey, aynı anda birden fazla istek göndermek istemediğim için setTimeout ve setInterval kullanmıyorum. Bu, form gönderildiğinde zamanlayıcının "durmasını" ve istek tamamlandığında "başlatılmasını" sağlar. Bunu ajax çağrım tamamlandığında checkSearchChanged arayarak yapıyorum. Açıkçası, minimum uzunluğu vb. Kontrol etmek için bunu genişletebilirsiniz.

Benim durumumda, ben ASP.Net MVC kullanıyorum böylece MVC Ajax ile de aşağıdaki yazı nasıl bağlamak görebilirsiniz:

http://geekswithblogs.net/DougLampe/archive/2010/12/21/simple-interactive-search-with-jquery-and-asp.net-mvc.aspx


4

JQuery UI otomatik tamamlama widget'ına bir göz atmanızı tavsiye ederim. Kod tabanları orada olanlardan daha olgun olduğu için, vakaların çoğunu ele aldılar.

Aşağıda bir demo sayfasının bağlantısı bulunmaktadır, böylece çalıştığını doğrulayabilirsiniz. http://jqueryui.com/demos/autocomplete/#default

Kaynağı okumaktan ve nasıl çözdüklerini görmekten en iyi şekilde faydalanırsınız. Burada bulabilirsiniz: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .

Temelde her şeyi yapıyorlar, bağlanıyorlar input, keydown, keyup, keypress, focus and blur. Sonra her türlü anahtar için özel kullanım var page up, page down, up arrow key and down arrow key. Metin kutusunun içeriğini almadan önce bir zamanlayıcı kullanılır. Bir kullanıcı bir komuta karşılık gelmeyen bir anahtar yazdığında (yukarı tuşu, aşağı tuşu vb.) Yaklaşık 300 milisaniyeden sonra içeriği araştıran bir zamanlayıcı vardır. Kodda şöyle görünüyor:

// switch statement in the 
switch( event.keyCode ) {
            //...
            case keyCode.ENTER:
            case keyCode.NUMPAD_ENTER:
                // when menu is open and has focus
                if ( this.menu.active ) {
                    // #6055 - Opera still allows the keypress to occur
                    // which causes forms to submit
                    suppressKeyPress = true;
                    event.preventDefault();
                    this.menu.select( event );
                }
                break;
            default:
                suppressKeyPressRepeat = true;
                // search timeout should be triggered before the input value is changed
                this._searchTimeout( event );
                break;
            }
// ...
// ...
_searchTimeout: function( event ) {
    clearTimeout( this.searching );
    this.searching = this._delay(function() { // * essentially a warpper for a setTimeout call *
        // only search if the value has changed
        if ( this.term !== this._value() ) { // * _value is a wrapper to get the value *
            this.selectedItem = null;
            this.search( null, event );
        }
    }, this.options.delay );
},

Bir zamanlayıcı kullanmanın nedeni, kullanıcı arayüzünün güncellenme şansı elde etmesidir. Javascript çalışırken UI güncellenemez, bu nedenle gecikme işlevine çağrı. Bu, metin kutusuna odaklanma (bu kod tarafından kullanılan) gibi diğer durumlar için iyi çalışır.

Yani jQuery kullanıcı arabirimi kullanmıyorsanız widget'ı kullanabilir veya kodu kendi widget'ınıza kopyalayabilirsiniz (veya benim durumumda özel bir widget geliştiriyorsunuz).


2

Metin kutusunun içeriğinin gerçek zamanlı olarak ne zaman değiştiğini neden saptamaya çalıştığınızı sormak istiyorum ?

Bir alternatif, bir zamanlayıcı ayarlamak (setIntval? Aracılığıyla) ve son kaydedilen değeri geçerli olanla karşılaştırmak ve daha sonra bir zamanlayıcıyı sıfırlamaktır. Bu, tuşların, farenin, dikkate almadığınız diğer bazı giriş cihazlarının veya JavaScript'in uygulamanın farklı bir bölümünden değerini değiştirmesini (kimsenin bahsetmediği başka bir olasılık) neden olduğu HERHANGİ bir değişikliği yakalamayı garanti eder.


Benim durumum (ki bu soruyu bana götürdü) bir metin kutusundaki miktar değiştiğinde bir 'Sepeti Güncelle' düğmesini göstermek gerekiyor olmasıdır. kullanıcının odağı kaybetmesi gerektiği konusunda hiçbir fikri yoktur ve aksi halde düğmeyi görmeyebilir.
Simon_Weaver

Maalesef, bunun "neden bir programda fark kontrol etmediğini" sorusuna cevap verdiğinden emin değilim. Sadece yeterince sık kontrol edin (saniyenin 1 / 4'ünde) ve kullanıcı herhangi bir fark bilmeyecektir.
DVK

1

change olayını kullanmayı düşünüyor musunuz?

$("#myTextBox").change(function() { alert("content changed"); });

5
AFAIK, yalnızca öğenin odağı kaybolduğunda tetiklenir. Kapakları bilen biri muhtemelen bunu biliyordur. :)
simon

evet, bu olmaz - change olayı yalnızca metin kutusu odağı kaybettiğinde çağrılır. Tuşa basıldıktan hemen sonra değişikliği yapmak istiyorum.
olamundo

1

textchangeTarayıcılar arası inputuyumluluk için etkinliği özelleştirilmiş jQuery shim ile kullanın . http://benalpert.com/2013/06/18/a-near-perfect-oninput-shim-for-ie-8-and-9.html (en son çatallı github: https://github.com/pandell /jquery-splendid-textchange/blob/master/jquery.splendid.textchange.js )

Bu saplar da dahil tüm giriş etiketleri <textarea>content</textarea>her zaman çalışmaz, hangi change keyupvb (!) Sadece jQuery on("input propertychange")kolları <textarea>sürekli etiketleri ve yukarıda anlamıyorum tüm tarayıcılar için bir dolgu olan inputolay.

<!DOCTYPE html>
<html>
<head>
<script class="jsbin" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="https://raw.githubusercontent.com/pandell/jquery-splendid-textchange/master/jquery.splendid.textchange.js"></script>
<meta charset=utf-8 />
<title>splendid textchange test</title>

<script> // this is all you have to do. using splendid.textchange.js

$('textarea').on("textchange",function(){ 
  yourFunctionHere($(this).val());    });  

</script>
</head>
<body>
  <textarea style="height:3em;width:90%"></textarea>
</body>
</html>

JS Bin testi

Bu aynı zamanda yapıştırma, silme işlemlerini gerçekleştirir ve tuşa basma çabalarını tekrarlamaz.

Bir dolgu kullanmıyorsanız, jQuery on("input propertychange")olaylarını kullanın .

// works with most recent browsers (use this if not using src="...splendid.textchange.js")

$('textarea').on("input propertychange",function(){ 
  yourFunctionHere($(this).val());    
});  

0

Burada tam bir çalışma örneği var .

<html>
<title>jQuery Summing</title>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"> </script>
$(document).ready(function() {
$('.calc').on('input', function() {
var t1 = document.getElementById('txt1');
var t2 = document.getElementById('txt2');
var tot=0;
if (parseInt(t1.value))
tot += parseInt(t1.value);
if (parseInt(t2.value))
tot += parseInt(t2.value);
document.getElementById('txt3').value = tot;
});
});
</script>
</head>
<body>
<input type='text' class='calc' id='txt1'>
<input type='text' class='calc' id='txt2'>
<input type='text' id='txt3' readonly>
</body>
</html>

0

Böyle bir şey çalışmalı, esas olarak, çünkü focusve focusoutiki ayrı değerlerle sona ereceğini. dataÖğeyi değerleri içinde sakladığı, ancak DOM'a dokunmadığı için burada kullanıyorum . Ayrıca, öğesine bağlı değeri saklamanın kolay bir yoludur. Daha yüksek kapsamlı bir değişkeni kolayca kullanabilirsiniz.

var changed = false;

$('textbox').on('focus', function(e) {
    $(this).data('current-val', $(this).text();
});

$('textbox').on('focusout', function(e) {
    if ($(this).data('current-val') != $(this).text())
        changed = true;
    }
    console.log('Changed Result', changed);
}

0

Bu Kod, bir metin kutusunun içeriğinin kullanıcı tarafından ve Javascript kodu ile her değiştirildiğinde değiştirilir.

var $myText = jQuery("#textbox");

$myText.data("value", $myText.val());

setInterval(function() {
    var data = $myText.data("value"),
    val = $myText.val();

    if (data !== val) {
        console.log("changed");
        $myText.data("value", val);
    }
}, 100);
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.