Подсчет слов через запятую - PullRequest
0 голосов
/ 03 февраля 2012

Моя функция счетчика выглядит следующим образом

function count() {
    var value =  ids.val();
    return (value == '') ? 0 : value.replace(/\s,?|,$/g, '').split(',').length;
}

Затем проверка возвращаемого значения и отправка данных через ajax

if(count() === 10){   
    ajaxPost();     
    $(ids).val('');
}

Я установил интервал для использования этой функции.Отметив, что, попробовал все другие функции, такие как change (), paste () .. единственный способ, который работал с моим устройством сканера, это установить интервал.

Проблема в том, что когда я набираю 9 цифр, например 1... 9, а затем хотите ввести 10, когда я нажимаю 1, чтобы написать 10 сразу после 9, он непосредственно публикует данные.не ждет ",".Как я могу изменить его так, чтобы он ожидал "," после последнего (в данном случае 10-го) слова?

Ответы [ 5 ]

1 голос
/ 03 февраля 2012

10 слов с конечной запятой дают вам 10 запятых, следовательно, 11 элементов в массиве результатов split (последний элемент будет пустым, если запятая является последним символом ввода). Проверьте это как if (count() === 11)....

1 голос
/ 03 февраля 2012

Вы можете проверить нажатую клавишу и посмотреть, является ли она запятой, а затем запускать код только после того, как станет известно, что последняя введенная клавиша была запятой:

$(ids).on('keyup', function (event) {
    if (event.which == 188) {
        if (count(this.value) === 10) {
            ajaxPost();     
            ids.value = '';
        }
    }
});
0 голосов
/ 03 февраля 2012

На вашем месте я бы поместил этот код в обработчик нажатия клавиш. Таким образом, он будет вызываться только при вводе новых символов. Чтобы предотвратить слишком частое выполнение проверки, используйте _. Debounce . Наконец, как упоминал Эндрю, ",,,,,,,,,,". Split (','). Length == 11. Похоже, вы саботируете себя этим регулярным выражением, которое ищет необязательную заключительную запятую.

0 голосов
/ 03 февраля 2012

Не уверен, что я полностью понял ваш вопрос, но ...

Вы хотите дождаться последнего "," чтобы убедиться, что все цифры были напечатаны вашим сканером?Или вам нужно получить эти 10, но интервал наступает как раз перед тем, как сканер закончит запись?

Если это второй случай, я рекомендую перезапускать интервал при каждом событии keyPressed.Сделав это, вы дадите некоторое время сразу после нажатия клавиши, чтобы подождать, если нажмете любую другую клавишу.

Итак, у вас будет что-то вроде этого:

var lastInterval = null
$(ids).keyPress(function() {
    if(lastInterval != null)
        clearTimeout(lastInterval)
    lastInterval = setInterval(function() {
        // ... your code here
    }, 1000)
})

Это понятно?Надеюсь, это поможет:)

--- EDIT

Хорошо, странно, что сканер штрих-кода не запускает события keyPress, но, принимая это за предпосылку, вы можете проверить измененияв строке, и когда строка не изменилась за N циклов, вы запускаете свой код.

В этом примере вы будете уверены, что строка осталась равной как минимум 1000мс (от 1000 мс до 1999 мс).

var lastString = ""
setInterval(function() {
    if(lastString == $(ids).val()) { // So, if the value remains the same for 2 cycles, the second one your code will be evaluated
        // ... your code here
    }
    lastString = $(ids).val()
}, 1000)
0 голосов
/ 03 февраля 2012

Это должно работать ...

var count = function(str){
  var matches = str.match(/.*?,/g);
  return (matches == null)? 0 : matches.length;
};

Также вы, вероятно, можете использовать методы keyup или keydown для перехвата этого события вместо использования setInterval.

...