Czysty JavaScript nasłuchuje zmiany wartości wejściowej


105

Czy istnieje sposób, w jaki mogę utworzyć stałą funkcję, która nasłuchuje danych wejściowych, więc gdy ta wartość wejściowa się zmienia, coś jest wyzwalane natychmiast?

Szukam czegoś przy użyciu czystego javascript, bez wtyczek, bez frameworków i nie mogę edytować HTML.

Coś, na przykład:

Kiedy zmieniam wartość na wejściu MyObject, ta funkcja działa.

Jakaś pomoc?

Odpowiedzi:


141

Po to są wydarzenia .

HTMLInputElementObject.addEventListener('input', function (evt) {
    something(this.value);
});

22
Nie zadziała, jeśli wartość wejściowa zostanie zmieniona przez javascript
ImShogun

1
Zauważ, że typeof this.valuejest string. Jeśli potrzebna jest liczba, przekonwertuj ją za pomocą parseInt lub parseFloat .
Akseli Palén

34

Jako podstawowy przykład ...

HTML:

<input type="text" name="Thing" value="" />

Scenariusz:

/* event listener */
document.getElementsByName("Thing")[0].addEventListener('change', doThing);

/* function */
function doThing(){
   alert('Horray! Someone wrote "' + this.value + '"!');
}

Oto skrzypce: http://jsfiddle.net/Niffler/514gg4tk/


11
Nie zadziała, jeśli zawartość wejściowa zostanie zmieniona przez JavaScript. ani ze zdarzeniem „input” ani „change”.
ImShogun

9
Jakiego zdarzenia możesz słuchać, gdy wartość zostanie zmieniona przez javascript?
zero_cool

3
I jak zauważyli inni, również nie wyzwala się, dopóki nie wyjdziesz z pola wprowadzania. Wiem, że już stara odpowiedź. Ale te odpowiedzi pojawiają się zaskakująco często i nigdy nie wspominają o ograniczeniach.
Torxed

@ImShogun jakieś pomysły, jak "wspierać" przypadek, gdy dane wejściowe są zmieniane przez JS?
Alessio

9

Właściwie zaznaczona odpowiedź jest dokładnie poprawna, ale odpowiedź może mieć ES6kształt:

HTMLInputElementObject.oninput = () => {
  console.log('run'); // Do something
}

Lub można napisać jak poniżej:

HTMLInputElementObject.addEventListener('input', (evt) => {
  console.log('run'); // Do something
});

2

Domyślne użycie

el.addEventListener('input', function () {
    fn();
});

Ale jeśli chcesz uruchomić zdarzenie podczas ręcznej zmiany wartości wejściowych za pomocą JS, powinieneś użyć zdarzenia niestandardowego (dowolna nazwa, np. 'MyEvent' \ 'ev' itp.). i zmieniasz wartości wejściowe za pomocą JS - możesz nazwać swoje zdarzenie niestandardowe „zmiana” \ „wejście” i to też będzie działać.

var event = new Event('input');
el.addEventListener('input', function () { 
  fn();
});
form.addEventListener('input', function () { 
  anotherFn();
});


el.value = 'something';
el.dispatchEvent(input);

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events


0

Innym podejściem w 2020 roku może być document.querySelector():

const myInput = document.querySelector('input[name="exampleInput"]');

myInput.addEventListener("change", (e) => {
  // here we do something
});

@customcommander dzięki za informację zwrotną. Odpowiedź edytowana!
Runsis

0

Jeśli chcesz monitorować zmiany za każdym razem, gdy naciśniesz klawisz na klawiaturze.

const textarea = document.querySelector(`#string`)
textarea.addEventListener("keydown", (e) =>{
   console.log('test') 
})

-7

zamiast id użyj tytułu, aby zidentyfikować swój element i napisz kod jak poniżej.

$(document).ready(()=>{

 $("input[title='MyObject']").change(()=>{
        console.log("Field has been changed...")
    })  
});

op zażądał „czystego javascript”, co oznacza brak jQuery - stąd głosy negatywne
pojawiło się
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.