Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> delegate keypress 
:(
    Опции темы
4epT
Дата 9.4.2012, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Всем привет. Хочу сделать скрипт который запрещает вводить в поле буквы (то есть сделать input для ввода цифр). Пытаюсь это сделать как можно универсальней ... Вот код:

Код

$(document).ready(function() {


    jQuery("body").delegate("input[type='text'].integer", "keypress", function(obj){
         
        var oldValue = $(this).val();
        var newValue = $(this).val() + String.fromCharCode(obj.keyCode); 
        
        var result = isInteger(newValue);
        
        if(result){
            $(this).val(newValue);
        } else {
            $(this).val(oldValue);
        }
        
    });
});


Код думаю понятен... по нажатию на клавишу, делаем две переменных, в одной (oldValue) текущее значение, во второй (newValue) текущее + то что бы нажали.

Проверяю на число и возвращаю true или false. Функция проверки работает (я в ней уверен). Если она вернула true, то смело присваиваем новое значение и все, если false то ставим старое. Постоянно поподаю по ветке else, но значение постоянно наращивается. В чем ошибка ?

p.s. если кто то хочет запустить, то вот код метода isInteger

Код

function isInteger(txt_value){
    
    var val1 = parseInt(txt_value);
    
    var val2 = txt_value.toString();
    
    if(isNaN(val1)){
        return false;
    }
    
    return val1.toString() == val2;
    
}


index.html
Код

<!DOCTYPE html>
<html>
    
    <head>
        <title></title>
        
        <script src="jquery-1.6.2.min.js" type="text/javascript"></script>
        <script src="controls.js" type="text/javascript"></script>
    </head>
    
    <body>
        
        <input type="text" class="integer" />
        
    </body>
    
</html>


Это сообщение отредактировал(а) Aliance - 9.4.2012, 14:13
PM MAIL   Вверх
ksnk
Дата 9.4.2012, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цифру вводим с первого раза, редактировать нельзя?
Разумнее проверять в конце вода, когда наступило событие onblur, или в форме по submit.

Вообще говоря - это решение обычной задачи - "маскирование ввода". Плагинов для jQeury по этому поводу довольно много, а вот насколько они работоспособны - нужно пробовать. В jQuery.UI, вроде, тоже что-то есть 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
4epT
Дата 9.4.2012, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



с onblur все нормально, но не красиво ) хотелось бы вообще запретить ввод букв в input. и хочется свое ) готовое можно использовать ... не проблема, но свое приятнее.


редактировать можно, нам ничего не помешает ) если я правильно понимаю событие keypress
PM MAIL   Вверх
Aliance
Дата 9.4.2012, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Я бы переписал функцию более изящно:
Код

function isInteger(v) {
  return (v.toString().search(/^-?[0-9]+$/) == 0);
}


Идем дальше. В последних версиях jQuery 1.7.* метод delegate() был заменен на on(), так что советую все же приучаться к новой модели ;)

Теперь, собственно, по коду. Получается-то что событие происходит независимо от условия в if. То есть вставляется либо 1, либо 2 раза символ нажатой клавиши.
Для этого нужно отменить выполнение действия события по умолчанию, вызвав метод preventDefault() объекта Event передаваемого аргументом анонимной callback-функции (к слову у тебя этот аргумент почему-то называется obj хотя логичнее что-то типа evt).

В итоге имеет следующее:
Код

function isInteger(v){
    return (v.toString().search(/^-?[0-9]+$/) == 0);
}

$(function(){
    jQuery("body").delegate(".integer", "keypress", function(event){
        if ( ! isInteger(String.fromCharCode(event.keyCode)))
            event.preventDefault();
    });
});


Для более современного on() можешь переписать по аналогии.
PM MAIL WWW ICQ Skype   Вверх
4epT
Дата 9.4.2012, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Спасибо попробую)

А вот насчет замены delegate на on .. допустим я не знаю версию jQuery на сайте клиента, мне нужно прям в скрипте чекать версию и в зависимости от нее вызывать то или иной метод ?
PM MAIL   Вверх
Aliance
Дата 9.4.2012, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



При подключении файла скриптов jquery-1.6.2.min.js путем нетривиального логического рассуждения можно прийти к аксиоме о том, что подключается версия 1.6.2

Но если и этих умозаключений недостаточно, можно прямо в коде после подключения библиотеки проверить её версию вот так:
Код

alert( 'Версия jQuery: ' + $.fn.jquery );

PM MAIL WWW ICQ Skype   Вверх
4epT
Дата 9.4.2012, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Я имел ввиду немного другое) я написал свой скрипт, отдал другому человеку он его подключил, и выяснилось что он использует не 1.7 версию а более старые версии.

Ваш пример работает. Но есть пару неудобных вещей ... не работают комбинации типа Ctrl + V ... Я работаю на маке (lion) и в event не приходит ctrlKey = true, оно там false. На stackoverflow нашел вот такой ответ, но я что то не совсем понял что там имелось ввиду.

Для клавишь backspace, лево, право, верх, вниз сделал спец метод:

Код

function isNavigationKeyCode(evt){
    if(evt.keyCode == 8){
        return true;
    } else if(evt.keyCode == 37){
        return true;
    } else if(evt.keyCode == 38){
        return true;    
    } else if(evt.keyCode == 39){
        return true;    
    } else if(evt.keyCode == 40){
        return true;    
    } else if(evt.ctrlKey == true && evt.keyCode == 86){
        return true;    
    } else {
        return false;
    }
}


и если была нажата одна из этих клавишь то просто пропускаем их ...

Как сделать поддержку горячих клавишь ctrl+v (cmd+v), ctrl + c (cmd+c), ctrl + x (cmd+x) ? в скобках написаны комбинации для мака.

Это сообщение отредактировал(а) Aliance - 9.4.2012, 17:59
PM MAIL   Вверх
Aliance
Дата 9.4.2012, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Предлагаю разбираться по порядку.

При использовании кнопки код на данном форуме было бы не плохо выбирать язык, код которого вставляется. А то меня уже утомило менять посты с html на javascript  smile 

Валидация формы на стороне клиента должна служить скорее средством помощи и удобства, а не безопасности и надежности. Конечно можно попытаться предвидеть все обстоятельства и максимизировать все варианты исходов, но если пользователь захочет все же обмануть систему - он это сделает. Если я сильно поищу, смогу найти скрипт, который как раз и занимается таким извратом, перехватывая ну чуть ли не все возможные события (и вставить, и отменить и даже перетащить). Только поставь вопрос самому себе - а оно тебе нужно?

Цитата(4epT @  9.4.2012,  18:54 Найти цитируемый пост)
я написал свой скрипт, отдал другому человеку он его подключил, и выяснилось что он использует не 1.7 версию а более старые версии.

я думаю, что тут два варианта: либо предполагать, что человек будет использовать/сможет обновить свою библиотеку до необходимой версии; либо писать 100500 костылей в коде вида:
Код

switch ($.fn.jquery) {
 case '1.6.2':
 case '1.6.3':
 case '1.6.4':
  // тут старый код с методом delegate()
 break;
 case '1.7.0':
 case '1.7.1':
 case '1.7.2':
  // тут новый код с методом on()
 break;
 default:
  // ломай меня полностью
 break;
}


Опять таки, возможно это моя нелюбовь к конструкциям ifelseifelseifelseif, но я бы твой спец метод переписал так:
Код

function isNavigationKeyCode(evt){
   if (evt.ctrlKey && evt.keyCode == 86)
      return true;
   switch (evt.keyCode) {
      case 8:
      case 37:
      case 38:
      case 39:
      case 40:
         return true;
      break;
      default:
         return false;
      break;
   }
}

PM MAIL WWW ICQ Skype   Вверх
4epT
Дата 9.4.2012, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Насчет неправильного выбора "код" извиняюсь, не заметил.

Код с swith более красив, не спорю.

Цитата

 Только поставь вопрос самому себе - а оно тебе нужно?


Нужно с целью изучить и сделать как можно ближе к идеалу. Понятное дело что если захотеть то обмануть можно и ничто не поможет... серверная валидация тоже есть, но хочется сделать именно вот так.

Насчет костыля с подключением нужной версии js, да, наверное будет легче просто подключить нужную версию.
PM MAIL   Вверх
Aliance
Дата 9.4.2012, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Я поищу ссылку и кину, если найду. На самом деле там даже не скрипт, а целая статья с подробным описанием чего и как делается. И само решение лично мне понравилось. Правда статья, если не изменяет память, на английском. Использовал тот скрипт года 3 назад, но там реально были собраны наверное все возможные варианты событий smile
PM MAIL WWW ICQ Skype   Вверх
4epT
Дата 9.4.2012, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Буду благодарен =)))
PM MAIL   Вверх
Aliance
Дата 9.4.2012, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Нашел, кажется оно!

Разве что там идет проверка на макс. кол-во символов, но на этой же основе можно сделать любую валидацию в общем-то.

Это сообщение отредактировал(а) Aliance - 9.4.2012, 18:34
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 9.4.2012, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



совет: раз уж речь про универсальность, лучше реализовать в виде плагина jQuery, чтоб к селектору не привязываться
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.