2013-02-27 2 views
2

Можно ли просто изменить символ, который написан в текстовом поле, путем изменения некоторых свойств объекта event? Например, я хочу, чтобы скрыть пароль персонажей из команды:
типов пользователей:Изменить входной символ события

Логин Имя пользователя Пароль

Я хочу, чтобы появиться:

Логин имя пользователя ********

И сохранить пароль в переменной. Итак, я хочу переназначить любую клавишу до *, когда textbox.value содержит /^login [a-zA-Z0-9]+ /.

Редактировать - почтительно комментарии говоря о непонимании мой вопрос:
Потому что все выше происходит в маленьком клиенте командной строки, и может быть несколько команд, которые я могу хотеть, чтобы защитить от * запутывания, нет мысли использование <input type="password" /> приемлемо!

+2

Есть ли причина, по которой вы не используете ''? –

+0

Вы могли бы просто использовать поле пароля при условии, что используете JS на html? – mtahmed

+1

Человек, я думал, что если я напишу 'login username password', то будет достаточно очевидно, что мы говорим о командной строке! –

ответ

2

Этот снипп делает трюк. Это не идеально, но можно развивать дальше.

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; 
} 
+0

Большое спасибо, это меня вдохновит. –

+0

Я принял это, хотя это не ответ на мой вопрос - как изменить фактический нажатый символ. Я считаю, что это невозможно, но может быть сделано с помощью 'window.dispatchEvent()'. –

+0

Я видел, что работает только в IE и 'onkeypress', я боюсь, что это единственный кросс-браузерный способ сделать это. [Здесь] (http://stackoverflow.com/q/14766547/1169519) вопрос с кодом, который работает для IE. – Teemu

1

Вы можете использовать input type=password, но по каким-либо другим причинам приведенный ниже скрипт выполнит эту работу за вас.

var field = document.getElementById("password") 
var val= ""; 
field.onkeydown = function(evt){ 
    val+= String.fromCharCode(evt.keyCode)  
    this.value = val.replace(/./g,"*");  
    document.getElementById("hiddenfieldPassword").value = val; // Hidden Field to store the password. 
    return false; 
} 
+0

Попробуйте это со стрелками и другими клавишами без символов. Попробуйте это с SHIFT - ** случай будет проигнорирован **. Наконец, не забывайте, что введенная команда ** не должна исчезать **! –

+0

Я сделал несколько скриптов JS, чтобы показать вам, что ваш код действительно не работает - http://jsfiddle.net/vS2ZX/1/ –

Смежные вопросы