2012-06-23 47 views
9

JSFiddle

He creado un select con 3 option s (1) en blanco en el violín. Cuando cambio manualmente de foo a bar, el oyente change se dispara normalmente.jQuery optado por no disparar onchange evento cuando se cambia el valor a través de JS

Ahora bien, si se restablece la select través de JS con el code posted in some answers here, el evento change no se dispara para la opción en blanco que acaba de seleccionar, por otra parte, si selecciono la opción que fue seleccionado antes de hacer clic en el botón reset caso onchange ganó' t fuego tampoco.

Estoy seguro que el select 'valor de s es está cambiando con la función anterior, que se puede ver en este fiddle, pero el select' s onchange caso simplemente no se dispara.

También he intentado onchange, onclick, oninput eventos en vano. En este momento me pregunto si debería usar un MutationObserver o eliminar el elemento elegido renderizado del DOM y crear otro, pero probablemente estoy pensando demasiado. Cualquier ayuda es apreciada.

también:

Esta respuesta me ha ayudado mucho: jQuery Chosen reset

Esta respuesta no ayudó: how to fire onchange event in chosen prototype javascript select box?

Código para referencia futura si jsfiddle.net es bajado:

HTML

<div id="wrapper"> 
    <select id="chosen"> 
     <option value="!!EMPTY VALUE!!"></option> 
     <option value="foo">foo</option> 
     <option value="bar">bar</option> 
    </select> 
</div> 
<br> 
<button id="reset">Reset</button> 

JS

$(function() { 
    $('#chosen').chosen(); 

    $('#wrapper').on('change', '#chosen', function() { 
     console.log('onchange: ' + this.value); 
    }); 

    $('#reset').click(function() { 
     $("#chosen").val('').trigger("liszt:updated"); //doesn't work 
     //$("#chosen").prop('selectedIndex', 0).trigger("liszt:updated"); //doesn't work either 
     console.log('reset: ' + $('option:selected').val()); 
    }); 
}); 
+0

** Webforms de ASP.Net **: me encontré con esta pregunta cuando mi aplicación parecía tener este problema, pero resultó ser un error de Javascript causado por ASP Validadores de WebForm. Vea este [boleto jQuery-UI] (http://bugs.jqueryui.com/ticket/4071#comment:9) – sparebytes

Respuesta

9

Es necesario para desencadenar el cambio después de cambiar el valor con $(selector).trigger("change")

$('#reset').click(function() { 
     $("#chosen").val('').trigger("change"); //doesn't work 
     //$("#chosen").prop('selectedIndex', 0).trigger("liszt:updated"); 
     console.log('reset: ' + $('option:selected').val()); 
    }); 
+1

*** Cara extrema a la palma de la mano ***. Oh mi, gracias hombre! –

+0

9 minutos hasta que pueda aceptarlo. =] –

+0

¡De nada!:] –

4

Copia de una respuesta de los comentarios de Fabricio mate que trabajaban para mí para que otros usuarios Don No veo esta publicación y echo de menos una solución al principio como lo hice.

$('#chosen_chzn').remove(); 
$('#chosen').val('').change().removeClass('chzn-done').chosen(); 

See this on his Fiddle

originalmente intentó continuar utilizando la llamada .trigger('liszt:updated') en lugar de la .change(), pero eso no funcionó. Tampoco vio el razonamiento detrás de .removeClass('chzn-done'), pero esto también es esencial o su cuadro de selección se desvanecerá.

+3

En realidad, creo que he encontrado otra solución "mejor". No estoy seguro Creo que acabo de actualizar a [Select 2] (http://ivaynberg.github.com/select2/) que dispara el evento 'change' con solo llamar' .change() 'en la entrada original. –

+1

+1 aunque para aquellos que están atrapados con Chosen, no recuerdo completamente el razonamiento detrás de eliminar la clase 'chzn-done', pero estoy bastante seguro de que fue porque' chzn-done' aplica 'display: none' a los elementos 'select' a los que has llamado' .chosen() 'y llamar a' .chosen() 'en elementos con esa clase no funcionaría. –

+1

Creo que si no quita chzn-done, entonces la llamada elegida() no hace nada, cree que ya se ha configurado. Una especie de guardia pobre del hombre. – Andy

Cuestiones relacionadas