Quiero evitar que se cambie un cuadro de selección si se aplica una determinada condición. Hacer esto no parece funcionar:
$('#my_select').bind('change', function(ev) { if(my_condition) { ev.preventDefault(); return false; } });Supongo que esto se debe a que, en este punto, la opción seleccionada ya ha cambiado.
¿Cuáles son otras formas de hacer esto?
Prueba esto:
var my_condition = true; var lastSel = $("#my_select option:selected"); $("#my_select").change(function(){ if(my_condition) { lastSel.prop("selected", true); } }); $("#my_select").click(function(){ lastSel = $("#my_select option:selected"); });En caso de que alguien necesite una versión genérica de la respuesta de Mattsven (como hice yo), aquí está:
$('select').each(function() { $(this).data('lastSelected', $(this).find('option:selected')); }); $('select').change(function() { if(my_condition) { $(this).data('lastSelected').attr('selected', true); } }); $('select').click(function() { $(this).data('lastSelected', $(this).find('option:selected')); });Si simplemente desea evitar la interacción con la selección por completo cuando my_condition es verdadera, siempre puede capturar el evento mousedown y hacer que su evento lo evite allí:
var my_condition = true; $("#my_select").mousedown(function(e){ if(my_condition) { e.preventDefault(); alert("Because my_condition is true, you cannot make this change."); } });Esto evitará que ocurra cualquier evento de cambio mientras my_condition sea verdadero.