Aggiornamento:
l proprietà .which attualmente risulta deprecata https://caniuse.com/#feat=keyboardevent-which
Anche se è comunque supportata dalla maggior parte dei browser effettivamente in divrsi browser sembra funzionare in modi differenti.
Ho notato ad esempio che con quello script si hanno dei malfunzionamenti usando CH o IE.

In questo caso, a mio parere, dovresti separare il controllo tra i caratteri stampabili, che puoi verificare attraverso l'evento keypress e la proprietà charCode, e quelli non stampabili, che puoi controllare attraverso l'evento keydown e la proprietà keyCode.

Qui un esempio aggiornato:
codice:
<!DOCTYPE html>
<html lang="en" dir="ltr">
   <head>
      <meta charset="utf-8">
      <title>esempio</title>
   </head>
   <body >
      <form action="" method="" name="vform">
         <input type="text" id="showText" value="" onkeypress="controlloCarattere(event)" onkeydown="controlloTasto(event)"  name="mvar" readonly><br>
      </form>
      <p id="err"></p>
      <script>
         var contenitoreErrore = document.getElementById('err');
         var campo = vform.mvar;
         
         function controlloCarattere(event) {
            var codice = event.charCode;

            if (                                            // Se premuto tasto con codice carattere consentito:
                  ( codice >= 48 && codice <= 57 )          //  Numeri
               || ( codice >= 65 && codice <= 90 )          //  Lettere maiuscole
               || ( codice >= 97 && codice <= 122 )         //  Lettere minuscole
            ) {
               campo.value += String.fromCharCode(codice);  // Aggiungo il carattere digitato

            } else {                                        // Se premuto un tasto non consentito
                                                            // Visualizzo l'errore
               contenitoreErrore.innerHTML="carattere non permesso";
               setTimeout(function(){ contenitoreErrore.innerHTML="" },1000);

            }
         }
         function controlloTasto(event) {
            var codice = event.keyCode;
            
            if ( codice == 8 ) {                            // Se premuto Backspace
               campo.value = campo.value.slice(0, -1);      // Rimuovo l'ultimo carattere
            }
         }
      </script>
   </body>
</html>
Vedi se può andare.