Этот снипп делает трюк. Это не идеально, но можно развивать дальше.
window.onload = function() {
var cmdfield = document.getElementById('cmdfield'),
commandString = '',
cmds = '(login|logout)',
rex = new RegExp('^' + cmds + ' [a-zA-Z0-9]+ (\\w*)'),
keyPress = function (e) {
if ((e.which > 64 && e.which < 123) || (e.which > 47 && e.which < 58) || e.which === 32) {
commandString += String.fromCharCode(e.which);
this.value = commandString.replace(rex, function (m, a, b) {
var command = m.split(' ')[0],
param = m.split(' ')[1],
len = b.length;
if (len > 0) {
return command + ' ' + param + ' ' + new Array(len + 1).join('*');
}
if (len === 0) {
return command + ' ' + param + ' ';
}
});
}
e.preventDefault();
return;
},
keyDown = function (e) {
if (e.which === 8) {
commandString = commandString.substring(0, commandString.length - 1);
e.stopPropagation();
return;
}
if (!((e.which > 64 && e.which < 122) || (e.which > 47 && e.which < 58) || e.which === 32)) {
e.preventDefault();
}
return;
};
cmdfield.addEventListener('keydown', keyDown, false);
cmdfield.addEventListener('keypress', keyPress, false);
}
cmds
представляет собой трубу, разделенный список всех слов, которые должны иметь один видимый параметр после него, и после этого параметра не будет звезды на текстовом поле, пока до следующего места. Если команда отсутствует в списке, третий параметр не будет запутан.
Если вы хотите, чтобы обнаружить более чем одно вхождение такого рода комбинаций на одной и той же линии, просто используйте ниже регулярное выражение:
rex = new RegExp('\\b' + cmd + ' [a-zA-Z0-9]+ (\\w*)', 'g'),
Реальное значение «командного текста» хранится в commandString
.
Обратите внимание, что эта реализация не защищена от редактирования текста с помощью мыши или буфера обмена. Также при запуске в Firefox BACKSPACE не будет пустым полем, прежде чем пользователь начнет писать снова.
Живая демонстрация на jsFiddle.
EDIT
На самом деле ваш вопрос о переопределении Event
свойств объекта. В общем, эти свойства доступны только для чтения и не могут быть изменены. Однако, похоже, для правила существует исключение: по крайней мере IE9 допускает модификацию window.event.keyCode
в обработчике onkeypress
. Снимок ниже действительно работает в IE9 при вызове inline onkeypress=capitalize()
, но не с обработчиком, прикрепленным addEventListener()
.
function capitalize() {
key = window.event.keyCode;
if (key > 96 && key < 123) {
window.event.keyCode = window.event.keyCode - 32;
}
return window.event.keyCode;
}
Есть ли причина, по которой вы не используете ''? –
Вы могли бы просто использовать поле пароля при условии, что используете JS на html? – mtahmed
Человек, я думал, что если я напишу 'login username password', то будет достаточно очевидно, что мы говорим о командной строке! –