Listo... el problema era en el modo 'borrar' y es que no es seguro modificar la cantidad de elementos de un arreglo desde dentro de un bucle y mantener coherencia luego con el indice.
La solucion fue crear un "arreglo de elementos a borrar" y procesarlos al final:
Código Javascript
:
Ver original<style>
select{
height:10em;
width:7em;
}
</style>
<form action="" method="">
Select 1<br/>
<select name="elementos1" multiple >
<option value="tizas" >tizas</option">
<option value="zapatos">zapatos</option">
<option value="pizarron" >pizarron</option">
</select>
<p/>
Select 2<br/>
<select name="elementos2" multiple >
<option value="marcadores" >marcadores</option">
<option value="mochila">mochila</option">
<option value="utiles" >utiles</option">
<option value="pizarron" >pizarron</option">
<option value="tizas" >tizas</option">
<option value="zapatos">zapatos</option">
</select>
</form>
<p/>
<a href="javascript:limpiarSelect1('disable');">Deshabilitar options</a><br/>
<a href="javascript:limpiarSelect1('delete');">Borrar options</a>
<script>
/*
@param modo 'delete' ó 'disable'
*/
function limpiarSelect1(modo)
{
modo = modo || 'delete';
if (modo!='delete' && modo!='disable')
throw new Error('Modo incorrecto');
sel1 = document.getElementsByName('elementos1')[0];
sel2 = document.getElementsByName('elementos2')[0];
conj1 = sel1.getElementsByTagName('option');;
conj2 = sel2.getElementsByTagName('option');;
var borrar = new Array;
// recorro el primer select
for (var i=0; i<conj1.length;i++)
{
// recorro el segundo select
for (var j=0; j<conj2.length;j++)
if (conj1[i].value==conj2[j].value)
{
console.log(modo+' para '+conj1[i].value);
if (modo=='delete')
{
borrar.push(conj1[i]);
}else
conj1[i].disabled='disabled'
}
}
if (modo=='delete' && borrar.length!=0)
for (var i=0; i<borrar.length;i++)
sel1.removeChild(borrar[i]);
}
</script>