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?
źródło
onkeyup
ionchange
?Odpowiedzi:
(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-texteventsinput
- typ zdarzenia HTML5 .Obsługują go Firefox, Chrome, IE9 i inne nowoczesne przeglądarki.
źródło
textInput
w Chrome 15 i działa. Sprawdziłeminput
wydarzenie 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.change
,keyup
iinput
była najlepsza kombinacja na pokrycie IE9 i Firefox (36.0.4).keypress
Zdarzenie nie wydają się działać w IE9 ponieważ nie uchwycić rzeczy jak Delete i Backspace iinput
zdarzeń okładkach wklejając z klawiatury iz menu kontekstowego.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()); } });
źródło
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 => {})
źródło
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); });
źródło
Możesz użyć onkeyup
<input id="name" onkeyup="checkLength(this.value)" />
źródło
Musiałbyś użyć kombinacji
onkeyup
ionclick
(lubonmouseup
), jeśli chcesz złapać każdą możliwość.<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />
źródło
setTimeout
okresowe sprawdzanie wartości pola ... Co dokładnie chcesz zrobić?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ść.
źródło