Esta respuesta funciona en aquellos casos:
- Haga clic en Normal
- Sólo mousedown (ratón se mueve fuera antes mouseup)
- teclado
- Si hay diferentes opciones con el mismo valor
Código:
$('#mySelect').on('change', function() {
if (this.selectedOptions.length < 4) {
$(this).find(':selected').addClass('selected');
$(this).find(':not(:selected)').removeClass('selected');
}else
$(this)
.find(':selected:not(.selected)')
.prop('selected', false);
});
Demo
O, para navegadores antiguos que no son compatibles con selectedOptions
,
$('#mySelect').on('change', function() {
var $sel = $(this).find(':selected');
if ($sel.length < 4) {
$sel.addClass('selected');
$(this).find(':not(:selected)').removeClass('selected');
}else
$(this)
.find(':selected:not(.selected)')
.prop('selected', false);
});
Demo
Bienvenido a stackoverflow, Tominated! – Sampson
OK, lo pondré más en contecto. es un formulario de correo electrónico interno de la empresa con un cuadro de selección generado automáticamente con el nombre de cada empleado. Lo estoy actualizando para que muestre los nombres que ya ha seleccionado (es una lista looooooong) y hay alguna validación del cliente de que no ha seleccionado más de 10 nombres (obviamente, hay un código lateral para evitar esto) . La identificación para la etiqueta de selección es "recipient_userid". Voy a publicar lo que tengo hasta ahora – tominated
$ (document) ready (function() { \t \t var last_valid_selection = null;. \t $ ("# recipient_userid") cambio (function (event) { \t \t \t var seleccionada = ""; \t \t \t \t $ ("# recipient_userid opción: seleccionado"). each (function() { \t \t \t seleccionado + = "