Виявити змінене текстове поле для введення


289

Я переглянув численні інші запитання та знайшов дуже прості відповіді, включаючи код нижче. Я просто хочу виявити, коли хтось змінює вміст текстового поля, але чомусь він не працює ... Я не отримую помилок консолі. Коли я встановлюю в браузері точку розриву на change()функції, вона ніколи не потрапляє на неї.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">

1
лише кілька речей, які слід спробувати: надайте вводу type = "text" і перетворіть його в однотонний елемент. <input id = "inputDatabaseName" type = "text" />
szeliga

Прибрав непотрібний код, лише 7 років пізно.
Адвокат диявола

Відповіді:


523

Ви можете використовувати inputподію Javascript у jQuery так:

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

У чистому JavaScript:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

Або так:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

1
Не можу знайти документацію на цю подію, але вона працює саме так, як я її очікую. Будь-яка ідея, де я можу знайти сторінку документа?
Хорхе Педре

3
Ви можете знайти його у списку подій HTML5: w3schools.com/tags/ref_eventattributes.asp або тут help.dottoro.com/ljhxklln.php
Ouadie

7
Це рішення насправді набагато краще, ніж використання клавіатури. Наприклад, IE дозволяє користувачеві очистити поле для введення, натиснувши X, який не запускає клавіш.
Георг

7
Найближче рішення поки що, але все ще не працює, коли браузер виконує автозаповнення в текстових полях.
Saumil

3
Це набагато краще, ніж перша відповідь. Ctrl, Shift - всі клавіші вважаються клавіатурою. І найгірше, що якщо ви швидко введете, кілька входів реєструватимуться лише як одна подія клавіатури.
октреф

174

спробуйте клавіатуру замість зміни.

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

Ось офіційна документація jQuery для .keyup () .


1
зітхаю, клянусь, я спробував це (переглянувши це питання: stackoverflow.com/questions/1443292/… ) ... але, мабуть, не тому, що це працює зараз!
Адвокат диявола

27
змінювати запускається лише тоді, коли елемент втрачає фокус і при запуску клавіші на клавіатурі запускається клавіша.
Деклан Кук

9
що робити, якщо користувач вставляє код за допомогою ctrl + v або перетягуючи вибраний текст мишкою на #inputDatabaseName? Як ви це виявляєте?
Раду Сіміонеску

5
Основна проблема з цим полягає в тому, що він все ще не враховує, чи зміст насправді змінюється. Лише що була натиснута кнопка
Метрополіс

@Metropolis, ти бачив мою відповідь ?? stackoverflow.com/a/23266812/3160597
azerafati

103

У кожній відповіді відсутні деякі моменти, тому ось моє рішення:

$("#input").on("input", function(e) {
  var input = $(this);
  var val = input.val();

  if (input.data("lastval") != val) {
    input.data("lastval", val);

    //your change action goes here 
    console.log(val);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>

У Input Eventпожежах на клавіатури введення, довгий миша , автозаповнення і Copy-Paste протестовані на Chrome і Firefox. Перевірка попереднього значення змушує його виявляти реальні зміни, що означає не стріляти під час вставки однієї речі чи введення одного і того ж символу чи т.д.

Приклад роботи: http://jsfiddle.net/g6pcp/473/


оновлення:

І якщо ви хочете запускати свою програму change function лише тоді, коли користувач закінчує вводити та запобігати запуску дії зміни кілька разів, ви можете спробувати це:

var timerid;
$("#input").on("input", function(e) {
  var value = $(this).val();
  if ($(this).data("lastval") != value) {

    $(this).data("lastval", value);
    clearTimeout(timerid);

    timerid = setTimeout(function() {
      //your change action goes here 
      console.log(value);
    }, 500);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">

Якщо користувач починає вводити текст (наприклад, "foobar"), цей код заважає change actionвиконувати всі типи букв користувача і працює лише тоді, коли користувач перестає вводити текст, це добре спеціально для того, коли ви надсилаєте вхід на сервер (наприклад, пошукові вводи), процесорний сервер робить тільки один пошук , foobarа не шість пошуків , fа потім , foа потім fooі foobі так далі.


1
Це було першим, коли я працював приблизно з 6. Дивовижно. Дякую.
Енкоде

Практично працює на IE9: якщо ви видалите персонаж, він не викликає події. Хоча дуже вдале вирішення
Сома

@Soma, як говорять інші, "зламати IE - це не вада, це особливість";) хоча IE більше не триває, але якщо у вас є виправлення, повідомте про це
azerafati

Я знаю, але мені довелося це зробити для роботи :( Власне кажучи, я так і використовую $("#input").focusout(function () {}). Коли ви клацнете поза вхідним запитом, подія запускається. Працює на поточній версії Chrome і Firefox, а IE9
Soma

2
@Soma, якщо це єдиний спосіб роботи IE, ви можете використати це мій спосіб, лише змінивши цю лінію$("#input").on("input focusout",function(e){
azerafati

18

Текстові введення не викликають changeподії, поки вони не втратять фокус. Клацніть поза вхідним повідомленням, і з’явиться повідомлення.

Якщо зворотний виклик повинен спрацювати, перш ніж введення тексту втратить фокус, використовуйте .keyup()подію.


changeпрацює тут: jsfiddle.net/g6pcp ; keyupоповіщення після кожної клавіші, яка не є гарним способом
diEcho

1
@diEcho Я думаю, що попередження - це лише приклад, щоб його код працював ... а не те, що він збирається зробити в підсумку.
Скотт Харвелл

@diEcho Що сказав Скотт, це було лише для тестування. Ось як я налагоджую: D
Адвокат диявола

@Scott, будь ласка, будь ласка, скористайтеся правильним налагоджувачем, а не alert(). Це зробить налагодження набагато простіше.
Метт Бал

13

onkeyup, onpaste, onchange, oninputЗдається, виходить з ладу, коли браузер виконує автозаповнення в текстових полях. Щоб вирішити такий випадок, включіть " autocomplete='off'" у ваше текстове поле, щоб запобігти автоматичному заповненню текстового поля браузером,

Наприклад,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

3

У моєму випадку у мене було текстове поле, яке було прикріплено до вибору дат. Єдине рішення, яке працювало для мене, - це обробляти його всередині події onSelect дата-вибору.

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});

0

Я думаю, ви також можете використовувати keydown:

$('#fieldID').on('keydown', function (e) {
  //console.log(e.which);
  if (e.which === 8) {
    //do something when pressing delete
    return true;
  } else {
    //do something else
    return false;
  }
});

-5

РОБОТА:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});

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