Zdarzenie zmiany kodu JavaScript w elemencie wejściowym jest uruchamiane tylko po utracie aktywności


84

Mam element wejściowy i chcę nadal sprawdzać długość treści i za każdym razem, gdy długość będzie równa określonemu rozmiarowi, chcę włączyć przycisk przesyłania, ale mam problem ze zdarzeniem zmiany JavaScript jako zdarzeniem uruchamia się tylko wtedy, gdy element wejściowy wykracza poza zakres, a nie w przypadku zmiany zawartości.

<input type="text" id="name" onchange="checkLength(this.value)" />

---- onchange nie uruchamia się przy zmianie treści nazwy, ale uruchamia się tylko wtedy, gdy nazwa traci ostrość.

Czy jest coś, co mogę zrobić, aby to wydarzenie działało przy zmianie treści? lub jakieś inne wydarzenie, które mogę wykorzystać do tego? Znalazłem obejście problemu, używając funkcji onkeyup, ale to nie uruchamia się, gdy wybieramy jakąś zawartość z automatycznego uzupełniania przeglądarki.

Chcę czegoś, co zadziała, gdy zawartość pola zmieni się za pomocą klawiatury lub myszy ... jakieś pomysły?


Możesz użyć onkeyupi onchange?
James Allardice,

1
Jedynym problemem, jaki mam, jest to, że wybór autouzupełniania przeglądarki nie spowodowałby wystąpienia żadnego z tych zdarzeń.
Sachin Midha

Co to za pole wejściowe?
powtac

och ... zapomniałem dodać go do przykładowego kodu, to pole tekstowe.
Sachin Midha

1
Myślałem, że to byłby bardzo częstym problemem i wiele osób byłoby w obliczu tego, ale teraz wydaje się w drugą stronę ... :)
sachin Midha

Odpowiedzi:


120
(function () {
    var oldVal;

    $('#name').on('change textInput input', function () {
        var val = this.value;
        if (val !== oldVal) {
            oldVal = val;
            checkLength(val);
        }
    });
}());

Będzie to złapać change, klawiszy, paste, textInput, input(jeśli jest dostępny). I nie strzelaj więcej niż to konieczne.

http://jsfiddle.net/katspaugh/xqeDj/


Bibliografia:

textInput- typ wydarzenia W3C DOM Level 3. http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

Agent użytkownika musi wywołać to zdarzenie po wprowadzeniu co najmniej jednego znaku. Znaki te mogą pochodzić z różnych źródeł, np. Znaki wynikające z naciśnięcia lub zwolnienia klawisza na urządzeniu z klawiaturą, z przetwarzania w edytorze metod wprowadzania lub wynikające z polecenia głosowego. Tam, gdzie operacja „wklej” generuje prostą sekwencję znaków, tj. Fragment tekstu bez żadnych informacji o strukturze lub stylu, należy również wygenerować ten typ zdarzenia.

input- typ zdarzenia HTML5 .

Uruchamiane w kontrolkach, gdy użytkownik zmienia wartość

Obsługują go Firefox, Chrome, IE9 i inne nowoczesne przeglądarki.

To zdarzenie występuje natychmiast po modyfikacji, w przeciwieństwie do zdarzenia onchange, które występuje, gdy element traci fokus.


1
to nie działa ... czy sprawdziłeś kod na końcu? czy to działało na wybór z autouzupełniania ...?
Sachin Midha

Sprawdziłem textInputw Chrome 15 i działa. Sprawdziłem inputwydarzenie w IE9 i też działa. Firefox powinien obsługiwać DOMAttrModified, ale nie mam go zainstalowanego. Te dwa wydarzenia są najlepsze, na jakie możesz mieć nadzieję, ponieważ uruchamiają się przy każdym rodzaju wprowadzania tekstu.
katspaugh

1
Niesamowite rozwiązanie… wkład działał dla mnie jak błogosławieństwo… nic poza wkładem nie jest potrzebne, to samo działa wystarczająco. to działa na FF4, ale nie na 3.x, i miałem 3.6 na pulpicie i to nigdy nie działało ...
Sachin Midha

5
W celu utrzymania aktualności, obecnie to rozwiązanie uruchamiało się wiele razy przy jednej zmianie wejścia w FF22, nie musisz używać naciśnięcia klawisza ani zdarzeń wprowadzania tekstu, wejścia i zmiany właściwości powinny wystarczyć
ochrona cybernetyczna

1
Okazało się, że change, keyupi inputbyła najlepsza kombinacja na pokrycie IE9 i Firefox (36.0.4). keypressZdarzenie nie wydają się działać w IE9 ponieważ nie uchwycić rzeczy jak Delete i Backspace i inputzdarzeń okładkach wklejając z klawiatury iz menu kontekstowego.
TLS

9

Jako rozszerzenie odpowiedzi katspaugh, oto sposób zrobienia tego dla wielu elementów przy użyciu klasy css.

   $('.myclass').each(function(){
        $(this).attr('oldval',$(this).val());
   });

   $('.myclass').on('change keypress paste focus textInput input',function(){
       var val = $(this).val();
       if(val != $(this).attr('oldval') ){
           $(this).attr('oldval',val); 
           checkLength($(this).val());
        }
    });

4

Znalezienie go zajęło mi 30 minut, ale to działa w czerwcu 2019 r.

<input type="text" id="myInput" oninput="myFunction()">

a jeśli chcesz programowo dodać detektor zdarzeń w js

inputElement.addEventListener("input", event => {})

3

Zrób to w sposób jQuery:

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


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});

1
To również zostanie wystrzelone tylko wtedy, gdy pole straci ognisko.
Felix Kling

@Felix Kling, prawda, zmienił to na keyup ();)
powtac

znowu ten sam problem z keyup ... Użyłem go i miałem z tym problem. przeczytaj moje pełne pytanie.
Sachin Midha

0

Możesz użyć onkeyup

<input id="name" onkeyup="checkLength(this.value)" />

Użyłem onkeyup ... ale mój problem polega na tym, że gdy użytkownik wybierze z autouzupełniania przeglądarki, to zdarzenie nie jest wyzwalane ... Napisałem już to w moim pytaniu w
obejściu, którego

0

Musiałbyś użyć kombinacji onkeyupi onclick(lub onmouseup), jeśli chcesz złapać każdą możliwość.

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />

niezła próba, ale problem polega na tym, że nie naciskam myszy na element wejściowy, ale na autouzupełnianie, które nie wyzwoli tego zdarzenia ...
Sachin Midha

Jedyną inną rzeczą, o której mogę pomyśleć, i jest to okropne, jest setTimeoutokresowe sprawdzanie wartości pola ... Co dokładnie chcesz zrobić?
DaveRandom

To bardzo nieprzyjemne ...: D jest to coś podobnego do tego, co robi wskaźnik siły hasła, informuje cię o sile hasła, gdy je wprowadzasz. Chcę włączyć przycisk tylko wtedy, gdy wprowadzony ciąg ma długość 10, w przeciwnym razie wyłącz go. Mam nadzieję, że dostałeś to ...
Sachin Midha

0

Oto inne rozwiązanie, które opracowuję dla tego samego problemu. Jednak używam wielu pól wejściowych, więc zachowuję starą wartość jako atrybut zdefiniowany przez użytkownika samych elementów: „data-value”. Korzystanie z jQuery jest bardzo łatwe w zarządzaniu.

        $(document).delegate('.filterBox', 'keyup', { self: this }, function (e) {
            var self = e.data.self;

            if (e.keyCode == 13) {
                e.preventDefault();
                $(this).attr('data-value', $(this).val());
                self.filterBy(this, true)
            }
            else if (e.keyCode == 27) {
                $(this).val('');
                $(this).attr('data-value', '');
                self.filterBy(this, true)
            }
            else {
                if ($(this).attr('data-value') != $(this).val()) {
                    $(this).attr('data-value', $(this).val());
                    self.filterBy(this);
                }
            }
        });

tutaj jest, użyłem 5-6 pól wejściowych z klasą „filterBox”, sprawiam, że metoda filterBy działa tylko wtedy, gdy data-value jest inna niż jej własna wartość.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.