jQuery. Аналог keyup для цифровой клавиатуры

A
На сайте с 18.10.2007
Offline
125
1378

День добрый. Есть функция, вызывающая поисковые подсказки по мере ввода в поисковую строку


$(document).ready(function(){
$('body').on('keyup', '#ajaxSearchString', function() {
var search = $('#ajaxSearchString').val();
var data = 'id=117&search=' + search;
if (search.length > 2) {
$.ajax({
url: 'index.php',
type: 'GET',
data: data,
dataType: 'html',
async: false,
success: function(response){
$('.searchPreResults').html(response);
}
});
} else {
$('.searchPreResults').empty();
}
});
});

Каким образом вызывать её не при событии keyup, а при вводе с цифровой клавиатуры?

Сама клавиатура работает примерно по такому принципу (тут привожу сильно упрощенный вариант)


$('body').on('click', '.keypad div', function() {
var character = $(this).text();
var write = $('#ajaxSearchString').val() + character;
$('#ajaxSearchString').val(write);
});
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
дани мапов
На сайте с 06.09.2012
Offline
204
#1


$('body').on('click', '.keypad div', function() {
var character = $(this).text();
var write = $('#ajaxSearchString').val() + character;
$('#ajaxSearchString').val(write).trigger('keyup');


});
Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
Ayavryk
На сайте с 11.10.2003
Offline
209
#2
дани мапов:
$('#ajaxSearchString').val(write).trigger('keyup');

Плохое это занятие - эмуляция нажатия клавиатуры.

Торикстартеру - вынесите функцию чтения/записи записи наружу и вызывайте ее напрямую.

Тынгыр, мынгыр, комсомол (http://erum.ru). Ехари, ехари, (жалобно) аяврик. /народная тунгусская песня/
дани мапов
На сайте с 06.09.2012
Offline
204
#3

И чем это плохо?

Ayavryk
На сайте с 11.10.2003
Offline
209
#4

Если в функции произошла ошибка будет сложнее определить откуда ее вызвали. У вас вызов замаскирован какими-то прослойками jquery и DOM

Лучше к такой практике не привыкать.

дани мапов
На сайте с 06.09.2012
Offline
204
#5
Ayavryk:
Если в функции произошла ошибка будет сложнее определить откуда ее вызвали. У вас вызов замаскирован какими-то прослойками jquery и DOM
Лучше к такой практике не привыкать.

Честно говоря, туманно и неубедительно. Ладно, пусть ТС делает как ему лучше.

Ayavryk
На сайте с 11.10.2003
Offline
209
#6

1. Туманно ровно до тех пор пока не придется столкнуться с чужим кодом на несколько тысяч строк, в котором программа сама собой жамкает по кнопкам. Причем делает это неправильно, в самый неподходящий момент, да еще и отложено по таймеру. Такой код я как раз унаследовал от предыдущего верстальщика.

2. Все что используется повторно, лучше оформлять в виде отдельных функций, переменных, объектов.

Например в тексте и вас и у топикстартера дважды используется $('#ajaxSearchString')

В принципе ничего страшного. Но отсутствие привычки такой подход рано или поздно приведет к тормозам.

дани мапов
На сайте с 06.09.2012
Offline
204
#7
Ayavryk:
1. Туманно ровно до тех пор пока не придется столкнуться с чужим кодом на несколько тысяч строк, в котором программа сама собой жамкает по кнопкам. Причем делает это неправильно, в самый неподходящий момент, да еще и отложено по таймеру. Такой код я как раз унаследовал от предыдущего верстальщика.
2. Все что используется повторно, лучше оформлять в виде отдельных функций, переменных, объектов.
Например в тексте и вас и у топикстартера дважды используется $('#ajaxSearchString')
В принципе ничего страшного. Но отсутствие привычки такой подход рано или поздно приведет к тормозам.

Я привел простое решение для ТС и ничего там плохого нет, не надо вводить в заблуждение. Я что написал ему тысячу строк кода?

Ayavryk:
Если в функции произошла ошибка будет сложнее определить откуда ее вызвали. У вас вызов замаскирован какими-то прослойками jquery и DOM
Лучше к такой практике не привыкать.

Что может быть непонятного в использовании функции "trigger", например для вас? Чем это замаскировано? Естественно, если бы с нуля это все писалось - можно было и по другому сделать, это любому понятно.

Ayavryk
На сайте с 11.10.2003
Offline
209
#8
дани мапов:
Я что написал ему тысячу строк кода?

всего одну - описание обработчика:

var f = ...

дани мапов:
Что может быть непонятного в использовании функции "trigger", например для вас? Чем это замаскировано? .

Тем что функция вызывается через длинную-длинную цепочку обработчиков jquery. Если не верите - посмотрите fireBug. У меня получилось 7 вызовов левых jquery-процедур от триггера до вызова того что нужно было вызвать. Во-первых это неоправданная трата ресурсов, во вторых осложняет локализацию источника вызова. А в третьих - зачем вот так через одно место????

jquery - замечательная библиотека, но иногда прививает какие-то странные шаблоны.

дани мапов
На сайте с 06.09.2012
Offline
204
#9
Ayavryk:
всего одну - описание обработчика:
var f = ...

Тем что функция вызывается через длинную-длинную цепочку обработчиков jquery. Если не верите - посмотрите fireBug. У меня получилось 7 вызовов левых jquery-процедур от триггера до вызова того что нужно было вызвать. Во-первых это неоправданная трата ресурсов, во вторых осложняет локализацию источника вызова. А в третьих - зачем вот так через одно место????

jquery - замечательная библиотека, но иногда прививает какие-то странные шаблоны.

Даже если человек вводит со скоростью от 1 символ/полсекунды, то выигрыш в микросекунду тут ничего не даст. Получается, кроме этого сомнительного недостатка - мое решение ничем не грозит ТС. Критиковать попусту любой может, если так хотите помочь ему - приведите конкретное решение, а не общие советы и лекции по оптимизации JS и пусть он выберет, то что ему удобнее.

Ayavryk
На сайте с 11.10.2003
Offline
209
#10
дани мапов:
Даже если человек вводит со скоростью от 1 символ/полсекунды, то выигрыш в микросекунду тут ничего не даст.

Зависит от сложности задачи. Иногда отказ от лишнего обращения к DOM дает резкий прирост скорости. К тому же речь идет не только о скорости но и об удобстве отладки. - стек вызова не замусоривается ничем лишним.

дани мапов:
приведите конкретное решение

Я уже приаел конкретное решение - вынести функцию обработчик и обращаться к нему напрямую

var someclick = function(){...}

$('body').on('keyup', '#ajaxSearchString', someclick);

$('body').on('click', '.keypad div', function() {... someclick();});

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий