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?

Sachin Midha
źródło
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.

katspaugh
źródło
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());
        }
    });
SSZero
źródło
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 => {})
franmcod
źródło
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);
});
powtac
źródło
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)" />
Dogbert
źródło
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)" />
DaveRandom
źródło
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ść.

efirat
źródło