如何使用jQuery来防止空格键进入空格?

我认为在表单输入中劫持空格键是一件简单的事情,这样它就像连字符一样起作用。 通常jQuery使这样的东西非常简单。

我试过的代码是这样的:

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

但这没有任何效果。 我尝试了一个更简单的脚本:

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

此脚本在空间按下时正确警告32,在连字符按下时正确警告109。 另外,我没有JavaScript错误。

if (e.keyCode == 32) return 109;为什么不if (e.keyCode == 32) return 109; 工作? 当我用if (e.keyCode == 32) alert("space!!");替换该行时if (e.keyCode == 32) alert("space!!"); 我正确地收到警报,所以我知道if正确返回true

是什么赋予了?

编辑 – 解决方案

感谢@Nick指出了复制粘贴问题。 我最后得到了一点混合动力。 这是我已经开始工作的代码,它既平滑又处理复制/粘贴。

  $("#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, "-"); }); }); 

问题是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的例子

通常想在这里使用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,"-")); }); 

这甚至适用于粘贴内容的人,这是一种绕过keydownvalidation的简单方法。