Podés hacer algo asi
Código HTML:
Ver original<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> /*<![CDATA[*/
/* estilos */
select{
width: 80px;
}
/*]]>*/
<script type="text/javascript"> //<![CDATA[
/* script */
function comparar(){
var u = document.getElementById('uno').value;
var d = document.getElementById('dos').value;
var t = document.getElementById('tres').value;
var c = document.getElementById('cuatro').value;
var cadena = u+d+t+c;
alert(cadena); // para verificar
for(i=1; i <=4; i++){
var re = new RegExp(i);
var resultado= re.test(cadena);
alert(re); // para verificar
alert(resultado); // para verificar
if(resultado == false){
alert('ha omitido o repetido un valor');
return false;
}
}
alert('Todo ok. proceso el form'); // para verificar
}
//]]>
<form action="#" method="post" onsubmit="return comparar();"> <select id="uno" name="uno" multiple="multiple" size="6">
<select id="dos" name="dos" multiple="multiple" size="6">
<select id="tres" name="tres" multiple="multiple" size="6">
<select id="cuatro" name="cuatro" multiple="multiple" size="6">
<input type="submit" value="procesar"/>
Al hacerlo con números se simplifica.
Algunos alert() están solo para verificar el funcionamiento. La idea es construir una cadena con los valores seleccionados, y contra esta hacer un test con una expresión regular. Por lógica, para que no se repitan los números tu numero tiene que contener los cuatro números, el pattern de la expresión regular se genera dinamicamente en el for usando los valores de i (de 1 a 4), con cualquier false para resultados, la ejecución se detiene.
Lo que me deja dudas es que hacés si no seleccionan nada en uno de los selects, yo la armé para que sea obligatorio. Pero eso depende de como y para que vayas a usar el form.
Probada en IE8+, FF, Chrome, opera, Safari
SAludos