Czy jQuery może sprawdzić, czy zawartość wejściowa się zmieniła?

Czy jest możliwe powiązanie zdarzenia javascript (najlepiej jQuery) z "zmianą" wartości wejściowej formularza?

Wiem o metodzie .change(), ale nie uruchamia się, dopóki nie opuścisz (kursor) pola wejściowego. Rozważałem również użycie metody .keyup(), ale reaguje ona również na klawisze strzałek i tak dalej.

Muszę po prostu wywołać akcję za każdym razem tekst w wejściu zmienia się, nawet jeśli jest to tylko zmiana jednej litery.

Author: Pavel S., 2011-09-24

9 answers

Istnieje proste rozwiązanie, którym jest Zdarzenie HTML5 input. Jest on obsługiwany w aktualnych wersjach wszystkich głównych przeglądarek dla elementów <input type="text"> i istnieje proste obejście dla IE

Przykład (z wyjątkiem IE

$("#your_id").on("input", function() {
    alert("Change to " + this.value);
});
 70
Author: Tim Down,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:13

Tak, porównaj go z wartością, która była przed zmianą.

var previousValue = $("#elm").val();
$("#elm").keyup(function(e) {
    var currentValue = $(this).val();
    if(currentValue != previousValue) {
         previousValue = currentValue;
         alert("Value changed!");
    }
});

Inną opcją jest wyzwalanie zmienionej funkcji tylko na niektórych klawiszach. Użyj e.KeyCode, aby dowiedzieć się, który klawisz został naciśnięty.

 12
Author: alexn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 21:13:23
   function checkChange($this){
    var value = $this.val();      
    var sv=$this.data("stored");            
        if(value!=sv)
          $this.trigger("simpleChange");    
    }

$(document).ready(function(){
$(this).data("stored",$(this).val());   
    $("input").bind("keyup",function(e){  
    checkChange($(this));
});        
$("input").bind("simpleChange",function(e){
    alert("the value is chaneged");
    });        
});

Oto skrzypce http://jsfiddle.net/Q9PqT/1/

 7
Author: Rafay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 21:40:02

Można również zapisać wartość początkową w atrybucie danych i przetestować ją z bieżącą wartością.

<input type="text" name="somename" id="id_someid" value="" data-initial="your initial value" /> 

$("#id_someid").keyup(function() {
    return $(this).val() == $(this).data().initial;
});

Zwróci true, jeśli wartość początkowa nie uległa zmianie.

 5
Author: Kwaw Annor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 08:36:31

Możesz użyć danych w jQuery i złapać wszystkie zdarzenia, które następnie testują je pod kątem ostatniej wartości (nieprzetestowanej):

$(document).ready(function() {  
    $("#fieldId").bind("keyup keydown keypress change blur", function() {
        if ($(this).val() != jQuery.data(this, "lastvalue") {
         alert("changed");
        }
        jQuery.data(this, "lastvalue", $(this).val());
    });
});

To byłoby całkiem dobre w stosunku do długiej listy przedmiotów. Użycie jQuery.data oznacza, że nie musisz tworzyć zmiennej javascript, aby śledzić wartość. Możesz zrobić $("#fieldId1, #fieldId2, #fieldId3, #fieldId14, etc"), aby śledzić wiele pól.

Aktualizacja: Dodano blur do listy bind.

 2
Author: jwatts1980,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-28 16:11:28

Musiałem użyć tego rodzaju kodu do skanera, który wklejał rzeczy do pola

$(document).ready(function() {
  var tId,oldVal;
  $("#fieldId").focus(function() {
     oldVal = $("#fieldId").val();
     tId=setInterval(function() { 
      var newVal = $("#fieldId").val(); 
      if (oldVal!=newVal) oldVal=newVal;
      someaction() },100);
  });
  $("#fieldId").blur(function(){ clearInterval(tId)});
});

Nie testowane...

 1
Author: mplungjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 21:20:44

Myślę, że nie ma "prostego" rozwiązania. Prawdopodobnie będziesz musiał użyć zarówno zdarzeń onKeyUp, jak i onChange, aby również złapać zmiany za pomocą myszy. Za każdym razem, gdy twój kod jest wywoływany, możesz zapisać wartość, którą "widziałeś" na tym.seenValue dołączone prawo do pola. To powinno być trochę łatwiejsze.

 1
Author: Sarel Botha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 21:28:42

Możesz ustawić zdarzenia na kombinacji klawiszy i myszy, a także onblur, aby mieć pewność. W takim przypadku należy zapisać wartość danych wejściowych. W następnym wywołaniu porównaj bieżącą wartość z ostatnio zapisaną wartością. Czyń swoją magię tylko wtedy, gdy faktycznie się zmieniła.

Aby zrobić to w mniej lub bardziej czysty sposób:

Można powiązać dane z elementem DOM (lookup api.jquery.com/jQuery.data ) można więc napisać ogólny zestaw procedur obsługi zdarzeń, które są przypisane do wszystkich elementów w forma. Każde zdarzenie może przekazać element, przez który zostało wywołane, do jednej funkcji ogólnej. Ta jedna funkcja może dodać starą wartość do danych elementu. W ten sposób powinieneś być w stanie zaimplementować to jako ogólny fragment kodu, który działa na całym formularzu I każdym formularzu, który napiszesz od teraz. :) I zajmie to chyba nie więcej niż około 20 linijek kodu.

Oto przykład: http://jsfiddle.net/zeEwX/

 1
Author: GolezTrol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 21:51:36

Ponieważ użytkownik może przejść do menu systemu operacyjnego i wybrać wklej za pomocą myszy, nie ma bezpiecznego zdarzenia, które spowoduje to dla Ciebie. Jedynym sposobem, który zawsze działa, jest posiadanie setInterval, który sprawdza, czy wartość wejściowa się zmieniła:

var inp = $('#input'),
    val = saved = inp.val(),
    tid = setInterval(function() {
        val = inp.val();
        if ( saved != val ) {
            console.log('#input has changed');
            saved = val;
    },50);

Możesz również skonfigurować to za pomocą specjalnego zdarzenia jQuery.

 0
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-24 06:59:30