2010-07-05 23 views
251

Estoy intentando activar el evento change en un cuadro de texto cuando cambio su valor con un botón, pero no funciona. Compruebe this fiddle.val() no desencadena el cambio() en jQuery

Si escribe algo en los cuadros de texto y hace clic en algún otro lugar, se activa change. Sin embargo, si hace clic en el botón, el valor del cuadro de texto cambia, pero change no se activa. ¿Por qué?

+2

posible duplicado de (http://stackoverflow.com/questions/ 2247386/jquery-textbox-valxxxx-not-causing-change-to-fire) –

+0

El título mismo respondió mi pregunta. Confirmado en ** [.change()] (https://api.jquery.com/change/) ** amarillo "Nota: Cambiando el valor de un elemento de entrada usando JavaScript, usando .val() por ejemplo, won ' t disparar el evento ". –

Respuesta

331

onchange solo se dispara cuando el usuario escribe en la entrada y luego la entrada pierde el foco.

Usted puede llamar manualmente el evento onchange usando después de ajustar el valor:

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

Como alternativa, puede trigger el evento usando:

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

¿Hay alguna razón por la cual los chicos de jQuery no implementaron esto? – Ergec

+1

¿No implementó qué? – GenericTypeTea

+15

siéntase libre de extender jquery y agregar una función de decir valWithChange que hará lo que desee. No puede ser la acción predeterminada ya que muchas veces no desea que el evento se desencadene a partir de un cambio de valor automatizado, solo cuando un usuario interactúa con el elemento – redsquare

12

No es posible que tenga que activarlo manualmente después de establecer el valor:

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

o:

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

Parece que los eventos no están burbujeando. Pruebe esto:

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

Espero que esto ayude.

Intenté simplemente un simple viejo $("#mytext").trigger('change') sin guardar el valor anterior, y el .change dispara incluso si el valor no cambió. Es por eso que guardé el valor anterior y llamé al $("#mytext").trigger('change') solo si cambia.

+0

Sorprendido de que no tenía más votos, ya que es la implementación efectiva actual de un cambio de elemento HTML. – vol7ron

50

De excelente sugerencia de redsquare, esto funciona muy bien:

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

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

No es necesario que ajuste 'this':' return this.val (v) .trigger ("change"); ' –

21

Puede reemplazar muy fácilmente la función val para desencadenar el cambio reemplazándolo con un proxy para la función original val.

sólo tiene que añadir este código en algún lugar de su documento (después de cargar 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 ejemplo de trabajo: here

(Tenga en cuenta que esto siempre se disparará change cuando val(new_val) se llama incluso si el valor didn 'en realidad cambiado.)

Si desea desencadenar el cambio SÓLO cuando el valor realmente cambió, utilice este:

//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); 

ejemplo vivo de que: http://jsfiddle.net/5fSmx/1/

+3

Hmm, pato-patching innecesario, creo :-p. Sería mejor que, como [comentado por redsquare] (http://stackoverflow.com/questions/3179385/val-doesnt-trigger-change-in-jquery#comment3273526_3179392), darle a esa función un nombre diferente al de '.val() '. – binki

+1

Si cambia el nombre debe cambiar su código existente - de esta manera su código continuará funcionando –

+3

Pero entonces todo el código que fue escrito con la definición correcta de '.val()' en mente comenzaría de repente a producir lado -efectos: -p. – binki

0

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

El evento change se envía a un elemento cuando su valor cambia.Este evento está limitado a <input> elementos, <textarea> cajas y <select> elementos. Para cuadros de selección, casillas de verificación y botones de opción, el evento se dispara inmediatamente cuando el usuario hace una selección con el mouse, pero para los otros tipos de elementos el evento se aplaza hasta que el elemento pierde el foco.

10

Necesitas cadena del método como este: [? Textbox.val jQuery ('xxxx') no causar el cambio al fuego]

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

<3 para el encadenamiento! –

Cuestiones relacionadas