Как использовать jQuery, чтобы предотвратить пробел ключа от пробела?

Я подумал, что было бы просто захватить ключ пробела, когда он будет введен в форме, чтобы он функционировал как дефис. Как правило, jQuery делает такие вещи очень простыми.

Код, который я пробовал, следующий:

        $("#StreamUrl").keydown(function (e) {
            if (e.keyCode == 32) return 109;
        });

Но это не имеет никакого эффекта. Я попробовал более простой script:

        $("#StreamUrl").keydown(function (e) {
            //if (e.keyCode == 32) return 109;
            alert(e.keyCode);
        });

Этот script корректно предупреждает 32 о пробеле и 109 при дефисном нажатии. Кроме того, у меня нет ошибок JavaScript.

Почему бы не if (e.keyCode == 32) return 109; работать? Когда я заменяю эту строку на if (e.keyCode == 32) alert("space!!");, я получаю предупреждение правильно, поэтому я знаю, что if возвращает true правильно.

Что дает?

Изменить - Решение

Спасибо @Nick за то, что он указал на проблему с копией. У меня получилось немного гибрида. Здесь код, который я получил для работы, который является гладким и обрабатывает Copy/Paste.

        $("#StreamUrl").keydown(function (e) {
            if (e.keyCode == 32) {
                $(this).val($(this).val() + "-"); // append '-' to input
                return false; // return false to prevent space from being added
            }
        }).change(function (e) {
            $(this).val(function (i, v) { return v.replace(/ /g, "-"); }); 
        });

Ответы

Ответ 1

Проблема заключается в том, что return 109 не выполняет то, что вы хотите. В обработчике событий вы возвращаете true или false в зависимости от того, хотите ли вы, чтобы браузер выполнил действие по умолчанию. В keydown вы должны вернуть false, чтобы предотвратить добавление символа.

$("#StreamUrl").keydown(function (e) {
     if (e.keyCode == 32) { 
       $(this).val($(this).val() + "-"); // append '-' to input
       return false; // return false to prevent space from being added
     }
});

пример jsfiddle

Ответ 2

Обычно здесь требуется keyup, которое запускается после того, как пространство было добавлено, что-то вроде этого немного проще:

$("#StreamUrl").bind("keyup change", function () {
  $(this).val(function(i, v) { return v.replace(/ /g,"-"); });
});

Попробуйте здесь, то, что это делает, позволяет добавить пространство, но затем мгновенно заменяет пробелы для дефисов, передавая функция .val(). Для более старых версий jQuery это будет выглядеть так:

$("#StreamUrl").bind("keyup change", function () {
  $(this).val($(this).val().replace(/ /g,"-"));
});

Это работает даже для людей, вставляющих содержимое, простой способ обойти проверку keydown.