Sí, ese sería el problema del código.
Intenta poner el código para que no funcione la sustitución con lo que ya has sustituido (en el ejemplo que posteas, valdría con cambiar de orden los
replace()).
Si no puedes hacer eso... veo la cosa más complicada. Ten en cuenta que la programación en javascript es secuencial, y que cada sentencia se ejecuta por orden. Es decir, lo que haga la anterior está disponible para la siguiente. No puedes ejecutar dos sentencias a la vez que es lo que necesitas.
Es que este problema se me planteó desde el primer momento que posteaste tu duda. Con las expresiones regulares, una vez que miras un caracter, ya sigues hacia delante y no lo vuelves a comprobar. Podría ser como un bucle que va comprobando caracter por caracter (también se podría hacer con este bucle).
Este ejemplo funciona para la primera "a" (se sustituye por b). Luego si introduces otra letra, hará otra pasada y esta nueva "b" se sustituirá por "c":
Código PHP:
<input type="text" onkeyup="sustituir(this)" />
<script type="text/javascript">
var reemplazos = {
"a": "b",
"b": "c"
};
function sustituir(campo) {
campo.value = campo.value.replace( /[a-z]/g, function($1) {
return reemplazos[$1] || $1;
} );
}
</script>
Lo que sí podríamos hacer es "engañar", detectando la tecla que se ha pulsado, y sólo sustituyendo ésta:
Código PHP:
<input type="text" onkeyup="sustituir(event, this)" />
<script type="text/javascript">
var reemplazos = {
"a": "b",
"b": "c"
};
function sustituir(evt, campo) {
var key = (window.event) ? window.event.keyCode : evt.which;
var esLetra = ( (key > 64 && key < 91) || (key > 96 && key < 123) || (key==165) || (key==164) || (key==32) || (key==209) || (key==241) );
if( esLetra ) {
var ultimoCaracter = String.fromCharCode(key).toLowerCase();
campo.value = campo.value.substring(0, campo.value.length-1 ) + ultimoCaracter.replace( /[a-z]/g, function($1) {
return reemplazos[$1] || $1;
} );
}
}
</script>
Lo que no sé es por qué me está detectando la letra en mayúsculas, le he tenido que poner un toLowerCase() provisional, porque no he podido encontrar el error.
A ver si así te puedes hacer un apaño, a mi me ha funcionado bien, pero ya te digo: minúsculas.
Un saludo