Найкращий спосіб відстежувати зміну під час введення типу type = “text”?


449

На мій досвід, input type="text" onchangeподія зазвичай відбувається лише після того, як ви залишите ( blur) контроль.

Чи є спосіб змусити браузер запускати onchangeщоразу, коли textfieldзміна вмісту? Якщо ні, то який найелегантніший спосіб відстежити це «вручну»?

Використання onkey*подій не є надійним, оскільки ви можете клацнути правою кнопкою миші поле та вибрати Вставити, і це змінить поле без будь-якого введення клавіатури.

Це setTimeoutєдиний спосіб? .. Потворно :-)


@ Чи є ймовірність, що ви можете оновити прийняту відповідь, щоб застарілий не був прикріплений доверху?
Flimm

Відповіді:


271

Оновлення:

Дивіться ще одну відповідь (2015).


Оригінальна відповідь 2009 року:

Отже, ви хочете, щоб onchangeподія запускалася при натисканні клавіш, розмитті та вставлення? Це магія.

Якщо ви хочете відстежувати зміни під час їх введення, використовуйте "onkeydown". Якщо вам потрібно зафіксувати операції вставки паст мишею, використовуйте "onpaste"( IE , FF3 ) та "oninput"( FF, Opera, Chrome, Safari 1 ).

1 Брокен <textarea>на Сафарі. Використовуйте textInputзамість цього


22
onkeypressслід використовувати замість onkeydown. onkeydownзапускається при натисканні клавіші. Якщо користувач утримує клавішу, подія запуститься лише один раз для першого символу. onkeypressзапускається щоразу, коли до текстового поля додається знак.
вівторок

61
Не зовсім магія onchangeпідпалити вогонь у всіх цих діях. <input onchange="doSomething();" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();">зробить достатньо добре для більшості.
aroth

1
Що з видаленням тексту з поля миші за допомогою миші? Я не думаю, що це спрацює.
Jeevan

47
З jquery 1.8.3, виглядає так:$().on('change keydown paste input', function() {})
Нарфанатор

4
@AriWais: ТАК, омг більшість SO має бути застарілим. Людям ця відповідь 8 років . Мені б хотілося, щоб була кнопка «застарілий» для старих відповідей, таких як ця, і громада могла вибрати кращу.
Півмісяць Свіжий

658

Ці дні слухайте oninput. Це здається, що onchangeне потрібно втрачати уваги на стихії. Це HTML5.

Його підтримують усі (навіть мобільний), крім IE8 та нижче. Для IE додати onpropertychange. Я використовую це так:

const source = document.getElementById('source');
const result = document.getElementById('result');

const inputHandler = function(e) {
  result.innerHTML = e.target.value;
}

source.addEventListener('input', inputHandler);
source.addEventListener('propertychange', inputHandler); // for IE8
// Firefox/Edge18-/IE9+ don’t fire on <select><option>
// source.addEventListener('change', inputHandler); 
<input id="source">
<div id="result"></div>


63
У світі, що постійно змінюється, як веб-стандарти, іноді прийняту відповідь можна змінити через кілька років ... Це нова прийнята відповідь для мене.
Ерік Петручеллі

1
Підтримка oninputнавіть в IE9 хоч і є частковою ( caniuse.com/#feat=input-event ).
Кенстон Чой

Можливо, варто використовувати innerTextзамість того, innerHTMLщоб не було розміщено жодної розмітки
Джеван Тахар

47

Нижче код добре працює для мене з Jquery 1.8.3

HTML: <input type="text" id="myId" />

Javascript / JQuery:

$("#myId").on('change keydown paste input', function(){
      doSomething();
});

11
Jquery бібліотека не відрізняються від непозначених в цьому питанні.
Джон Вайс

21
Jquery - це api Javascript, і мене сюди привів пошук за ключовим словом Jquery, я не думаю, що варто створювати нове запитання для кожного запитання javascript для відповіді на Jquery ...
GaelDev

12
Якби людям не дозволяли пропонувати використання бібліотек у відповідях, було б
НЕ

3
Стріляється кілька разів. Ймовірно, через зміни та натискання клавіш. Ймовірно, тут потрібен лише ввід.
ммм

1
вам це не потрібно, keydownтому що воно буде дублювати значення вводу, видаліть його.
Юссеф Аль Субайхі

43

Javascript тут непередбачуваний і смішний.

  • onchange виникає лише при розмиванні текстового поля
  • onkeyup& onkeypressне завжди відбувається при зміні тексту
  • onkeydown відбувається при зміні тексту (але не можна відстежувати вирізання та вставлення за допомогою клацання миші)
  • onpaste& oncutвідбувається при натисканні клавіші і навіть при натисканні правою кнопкою миші.

Таким чином, щоб відстежувати зміни в текстовому полі, нам потрібно onkeydown, oncutі onpaste. У зворотному дзвінку цих подій, якщо ви перевіряєте значення текстового поля, ви не отримуєте оновленого значення, оскільки значення змінюється після зворотного дзвінка. Таким чином, рішенням цього є встановлення функції тайм-ауту з таймаутом 50 мілі-секунд (а може і менше) для відстеження змін.

Це брудний злом, але це єдиний шлях, як я досліджував.

Ось приклад. http://jsfiddle.net/2BfGC/12/


4
oninputі textInputє подіями, які є фактичним рішенням для цього, але його підтримують не всі браузери.
Санкет Саху

Щодо другої точки кулі, я припускаю, що ви мали на увазі onkeyupі onkeydownякі схожі. Обидва можуть захоплювати клавіші Ctrl, Alt, Shift та Meta. Для третьої точки кулі я припускаю , що ви мали в виду onkeypress.
Даніель Стівенс

12

onkeyupвідбувається після набору тексту, наприклад, я натискаю, tколи я піднімаю палець, дія відбувається, але keydownце відбувається, перш ніж я розраховую символt

Сподіваюся, це комусь корисно.

Так що onkeyupкраще, коли ви хочете відправити те, що ви тільки що набрали зараз.


8

У мене була схожа вимога (текстове поле у ​​стилі щебетання). Б / в onkeyupі onchange. onchangeнасправді піклується про операції з введенням миші під час втраченого фокусу з поля.

[Оновлення] У HTML5 або новіших версіях використовуйте oninputдля отримання оновлень змін у режимі реального часу, як це пояснено в інших відповідях вище.


Oninput корисний, якщо ви хочете виявити, коли вміст текстової області, введення: текст, введення: пароль або вхід: пошуковий елемент змінився, тому що подія зміни на цих елементах спрацьовує, коли елемент втрачає фокус, а не відразу після модифікації .
хкасера

@hkasera Так, з HTML5 oninputце шлях. Але коли я реалізував, HTML5 не існував, і у нас був IE 8 :(. Я ціную ваше оновлення, оскільки воно надає актуальну інформацію для користувачів.
Mohnish,

8

Я думаю, що у 2018 році краще використовувати inputподію.

-

Як описано у специфікації WHATWG ( https://html.spec.whatwg.org/multipage/indices.html#event-input-input ):

Запускається на елементи керування, коли користувач змінює значення (див. Також подію зміни )

-

Ось приклад того, як його використовувати:

<input type="text" oninput="handleValueChange()">

7

Якщо ви використовуєте ТІЛЬКИ Internet Explorer, ви можете скористатися цим:

<input type="text" id="myID" onpropertychange="TextChange(this)" />

<script type="text/javascript">
    function TextChange(tBox) {
        if(event.propertyName=='value') {
            //your code here
        }
    }
</script>

Сподіваюся, що це допомагає.


8
Можливо, для внутрішнього проекту я думаю ... :)
eselk

94
Слава Богу, я не живу в цьому будинку! : D
Марко Матарацца

13
10 років тому в цьому реченні не було б нічого смішного .. :(
Michał Tabor

4
для мене це допомагає, я розробляю проект для деяких мобільних пристроїв із вбудованою ОС, де IE - єдиний браузер.
Андерс М.

3
Якщо ви використовуєте ТІЛЬКИ Internet Explorer - LOL. Зробив мій день у 2016 році!
Джек Блек

4

Є досить близьке рішення (не виправляйте всі способи вставки), але більшість з них:

Він працює як для входів, так і для текстових областей:

<input type="text" ... >
<textarea ... >...</textarea>

Робіть так:

<input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >
<textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea>

Як я вже говорив, не всі способи вставити події в усі браузери ... найгірше, що вони взагалі не запускають жодної події, але Таймери жахливо використовувати для таких.

Але більшість способів вставки виконуються за допомогою клавіатури та / або миші, тому зазвичай натискання клавіш onkeyup або onmouseup запускається після вставки, а також під час введення на клавіатурі він працює.

Переконайтеся, що ваш контрольний код не займає багато часу ... інакше користувач отримує погану вдосконалення.

Так, хитрість полягає в стрільбі по клавішах і по миші ... але будьте обережні, обидва можуть бути звільнені, тому врахуйте таке !!!


4

Будь ласка, оцініть наступний підхід за допомогою JQuery:

HTML:

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

Javascript (JQuery):

$("#inputId").keyup(function(){
        $("#inputId").blur();
        $("#inputId").focus();
});

$("#inputId").change(function(){
        //do whatever you need to do on actual change of the value of the input field
});

Я використовую так само
:)

Я усвідомлюю, що це не найновіша відповідь, але чи не розмивання та перефокусування вводу на кожній клавіші викручує розташування курсора, якби воно було де-небудь, крім кінця введення?
Майкл Мартін-Смукер

@ MichaelMartin-Smucker Ви б так думали, але, мабуть, не так: jsfiddle.net/gsss8c6L
Clonkex

4

"Вхід" працював на мене.

var searchBar  = document.getElementById("searchBar");
searchBar.addEventListener("input", PredictSearch, false);

3

Ви можете використовувати і події keydown, keyupі keypressтакож.


3

Для відстеження кожної спроби цього прикладу, а перед цим повністю зменшіть швидкість блимання курсору до нуля.

<body>
//try onkeydown,onkeyup,onkeypress
<input type="text" onkeypress="myFunction(this.value)">
<span> </span>
<script>
function myFunction(val) {
//alert(val);
var mySpan = document.getElementsByTagName("span")[0].innerHTML;
mySpan += val+"<br>";
document.getElementsByTagName("span")[0].innerHTML = mySpan;
}
</script>

</body>

onblur: подія генерується при виході

onchange: подія генерується при виході, якщо якісь зміни внесені у вхідний текст

onkeydown: подія генерується під час будь-якого натискання клавіші (для тривалого утримання клавіш також)

onkeyup: подія генерується при будь-якому випуску ключа

onkeypress: те саме, що onkeydown (або onkeyup), але не реагуватиме на ctrl, backsace, alt other


1

2018 рік, ось що я роблю:

$(inputs).on('change keydown paste input propertychange click keyup blur',handler);

Якщо ви можете вказати на недоліки у такому підході, я буду вдячний.


2
2019 року тут, і це спрацює кілька разів для кожного натискання клавіш. Для прикладу дивіться тут: jsfiddle.net/sp00n82/3r4691tq/5
sp00n

1

Спосіб 1: Додати слухача подій для input:

element.addEventListener("input", myFunction);

 

Спосіб 2. Визначте oninputвластивість за допомогою JavaScript:

element.oninput = function()
{
    myFunction();
};

 

Спосіб 3: Визначте oninputвластивість за допомогою HTML:

<input type="text" oninput="myFunction();">

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.