Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.10.2012, 19:44
Аспирант
Отправить личное сообщение для FoxTrix Посмотреть профиль Найти все сообщения от FoxTrix
 
Регистрация: 27.07.2012
Сообщений: 73

onKeyUp/onKeyPress
Здравствуйте!
Пишу проверку данных вводимых в input text.
Есть:
<input type="text" name="text" id="text" onKeyUp="control(this.value)">
и скрипт к нему
function control(str)
{
	var mask = /\W/
	var result = check(str);
	function check(str)
	{
		var result = mask.exec(str);
		return result;
	}
	
	if(result != null)
	{
		var repl = str.replace(result, '');
		control(repl);
	}
	else
	{
		if(result == null)
			document.getElementById('text').value = str;
	}
}
с onKeyUp работает как нужно, но перед удалением символ успевает отобразиться в поле, а это выглядит не очень.

нашёл решение проблемы здесь, но не могу его переделать под себя =(

если делаю с onKeyPress так
function control(str)
{
	function value()
	{
		document.getElementById('text').value = str;
		
	}
	var mask = /\W/
	var result = check(str);
	function check(str)
	{
		var result = mask.exec(str);
		return result;
	}
	
	if(result != null)
	{
		var repl = str.replace(result, '');
		control(repl);
	}
	else
	{
		if(result == null)
			setTimeout(value, 0);
	}
}
то вообще не даёт ничего ввести, удаляет всё(хотя проверка идёт)

подскажите, в чём проблема?
Ответить с цитированием
  #2 (permalink)  
Старый 23.10.2012, 20:25
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

FoxTrix,

Почитайте про события клавиатуры http://learn.javascript.ru/keyboard-events

Порядок возникновения событий:
1) keydown
2) keypress - на момент этого события символ еще не введен в поле
3) keyup

В вашем случае, чтобы неверный символ не отображался в поле, можно использовать событие keypress и проверять какой символ ввели (если не разрешенный - то делаем preventDefault).

Последний раз редактировалось Hoshinokoe, 23.10.2012 в 20:29.
Ответить с цитированием
  #3 (permalink)  
Старый 23.10.2012, 20:42
Аспирант
Отправить личное сообщение для FoxTrix Посмотреть профиль Найти все сообщения от FoxTrix
 
Регистрация: 27.07.2012
Сообщений: 73

Hoshinokoe,
я знаю события клавиатуры, в ссылке которую я кидал
http://learn.javascript.ru/events-and-timing-depth
чуть ниже приведено решение, именно с onKeyPress, но под себя у меня его переделать не получается.

preventDefault для меня не подойдёт т.к. при вставке текста через Ctrl + V (если в нем присутствуют запрещённые символы) предотвратится вставка всей строки, а не только запрещённых символов
Ответить с цитированием
  #4 (permalink)  
Старый 23.10.2012, 21:03
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

FoxTrix,

Тогда как-то так:
<input type="text" name="text" id="text"/>
<script type="text/javascript">
    document.getElementById('text').onkeypress = function () {
        var self = this;

        function handle() {
            var res = /\W/.exec(self.value);
            if (res && res.length)
                self.value = self.value.replace(res, '');
        }

        setTimeout(handle, 0);
    };
</script>

Последний раз редактировалось Hoshinokoe, 23.10.2012 в 21:05.
Ответить с цитированием
  #5 (permalink)  
Старый 23.10.2012, 21:17
Аспирант
Отправить личное сообщение для FoxTrix Посмотреть профиль Найти все сообщения от FoxTrix
 
Регистрация: 27.07.2012
Сообщений: 73

Hoshinokoe,
Спасибо!
немного переделал под себя, получилось так
<input type="text" name="text" id="text" onKeyDown="a(this)">

function a(self)
{
	function handle() {
		
		var res = /\W/.exec(self.value);
		if (res.length)
		{
			self.value = self.value.replace(res, '');
			a(self);
		}
	}

	setTimeout(handle, 0);
}
переделал на onKeyDown, чтобы отлавливать Ctrl+V и Shift+Insert, и добавил рекурсию для удаления нескольких символов вставленных через Ctrl+V =)
Ещё раз спасибо!)

Последний раз редактировалось FoxTrix, 23.10.2012 в 21:21.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск