Un'alternativa può essere quella di usare direttamente il keyCode e confrontarlo con un array di valori consentiti:
codice:
function onlyNumbers(evt) {
evt = evt || window.event;
var key = evt.keyCode || evt.which;
if( ![48,49,50,51,52,53,54,55,56,57,96,97,98,99,100,101,102,103,104,105,13,8,46,37,38,39,40,35,36].includes(key) )
return false;
}
Certo, non è il massimo definire ad uno ad uno tutti i valori, ma in questo modo è possibile specificare anche diversi altri tasti (enter, backspace, canc, tasti frecca, ecc.).
Analogamente si potrebbe usare la proprietà key dell'oggetto event, e una regex che specifica i valori consentiti:
codice:
function onlyNumbers(evt) {
evt = evt || window.event;
if( !/[0-9]|Enter|Backspace|Delete|ArrowRight|ArrowUp|ArrowLeft|ArrowDown|End|Home/.test(evt.key) )
return false;
}
In questo caso, la proprietà key non è supportata da Safari e non so da quale altro browser.