2010-07-05 13 views
251

Sto cercando di attivare l'evento change su una casella di testo quando cambio il suo valore con un pulsante, ma non funziona. Controllare this fiddle.val() non fa scattare il cambiamento() in jQuery

Se si digita qualcosa nelle caselle di testo e fare clic da qualche altra parte, change viene attivato. Tuttavia, se si fa clic sul pulsante, il valore della casella di testo viene modificato, ma non viene attivato change. Perché?

+2

possibile duplicato (http://stackoverflow.com/questions/ 2247386/jquery-textbox-valxxxx-not-causare-change-to-fire) –

+0

Il titolo stesso ha risposto alla mia domanda. Confermato a ** [.change()] (https://api.jquery.com/change/) ** giallo "Nota: modifica del valore di un elemento di input utilizzando JavaScript, utilizzando ad esempio .val(), won" licenziare l'evento. " –

risposta

331

onchange solo viene generato quando l'utente immessi nell'input e quindi l'ingresso perde il focus.

È possibile chiamare manualmente l'evento onchange utilizzando dopo aver impostato il valore:

$("#mytext").change(); // someObject.onchange(); in standard JS 

In alternativa, è possibile trigger l'evento utilizzando:

$("#mytext").trigger("change"); 
+0

C'è un motivo per cui i ragazzi di jQuery non l'hanno implementato? – Ergec

+1

Non ha implementato cosa? – GenericTypeTea

+15

sentiti libero di estendere jquery e aggiungere una funzione valWithChange che farà ciò che vuoi. Non può essere l'azione predefinita quante volte non vuoi che l'evento si inneschi da un cambio di valore automatico, solo quando un utente interagisce con l'elemento – redsquare

12

Non potrebbe essere necessario attivare manualmente dopo l'impostazione il valore:

$('#mytext').change(); 

oppure:

$('#mytext').trigger('change'); 
7

Sembra che gli eventi non siano gorgoglianti. Prova questo:

$("#mybutton").click(function(){ 
    var oldval=$("#mytext").val(); 
    $("#mytext").val('Changed by button'); 
    var newval=$("#mytext").val(); 
    if (newval != oldval) { 
    $("#mytext").trigger('change'); 
    } 
}); 

Spero che questo aiuti.

Ho provato solo un semplice vecchio $("#mytext").trigger('change') senza salvare il vecchio valore e lo .change si attiva anche se il valore non è cambiato. Ecco perché ho salvato il valore precedente e ho chiamato $("#mytext").trigger('change') solo se cambia.

+0

Sorpreso che questo non ha avuto più voti, dal momento che è l'attuale implementazione effettiva di un cambiamento di elemento HTML. – vol7ron

50

Da eccellente suggerimento di redsquare, questo funziona bene:

$.fn.changeVal = function (v) { 
    return $(this).val(v).trigger("change"); 
} 

$("#my-input").changeVal("Tyrannosaurus Rex"); 
+3

Non è necessario eseguire il wrapping 'this':' return this.val (v) .trigger ("change"); ' –

21

È possibile sostituire facilmente la funzione val per innescare il cambiamento sostituendolo con un proxy per la funzione originaria val.

basta aggiungere questo codice da qualche parte nel documento (dopo aver caricato jQuery)

(function($){ 
    var originalVal = $.fn.val; 
    $.fn.val = function(){ 
     var result =originalVal.apply(this,arguments); 
     if(arguments.length>0) 
      $(this).change(); // OR with custom event $(this).trigger('value-changed'); 
     return result; 
    }; 
})(jQuery); 

Un esempio di lavoro: here

(Si noti che questo sarà sempre innescherà change quando val(new_val) viene chiamato anche se il valore didn 't in realtà cambiato.)

Se si desidera attivare la modifica SOLO quando il valore effettivamente modificato, utilizzare questo:

//This will trigger "change" event when "val(new_val)" called 
//with value different than the current one 
(function($){ 
    var originalVal = $.fn.val; 
    $.fn.val = function(){ 
     var prev; 
     if(arguments.length>0){ 
      prev = originalVal.apply(this,[]); 
     } 
     var result =originalVal.apply(this,arguments); 
     if(arguments.length>0 && prev!=originalVal.apply(this,[])) 
      $(this).change(); // OR with custom event $(this).trigger('value-changed') 
     return result; 
    }; 
})(jQuery); 

esempio vivo per questo: http://jsfiddle.net/5fSmx/1/

+3

Hmm, patch di anatra non necessario, penso :-p. Potrebbe essere meglio, come [commentato da redsquare] (http://stackoverflow.com/questions/3179385/val-doesnt-trigger-change-in-jquery#comment3273526_3179392), assegnare a tale funzione un nome diverso da '.val() '. – binki

+1

Se si rinomina, è necessario modificare il codice esistente - in questo modo il codice esistente continuerà a funzionare –

+3

Ma poi tutto il codice che è stato scritto con la definizione corretta di '.val()' in mente inizierà improvvisamente a produrre effetti :-p. – binki

0

Da https://api.jquery.com/change/:

L'evento change viene inviato ad un elemento quando il suo valore cambia.Questo evento è limitato agli elementi <input>, alle caselle <textarea> e agli elementi <select>. Per le caselle di selezione, le caselle di controllo e i pulsanti di opzione, l'evento viene attivato immediatamente quando l'utente effettua una selezione con il mouse, ma per gli altri tipi di elemento l'evento viene posticipato fino a quando l'elemento non si concentra.

10

È necessario catena del metodo come questo: [? Textbox.val jQuery ('xxxx') senza causare cambiamenti al fuoco]

$('#input').val('test').change(); 
+0

<3 per il collegamento! –

Problemi correlati