2012-06-29 64 views
1

我正在试图防止某些键被输入到输入框,但只有特定的键被按下转变键被防止按键同时shift键举行

$('selector').keydown(function(e) { 
    console.log(e.shiftKey); 
    if (e.shiftKey && e.which == 51) { 
    e.preventDefault(); 
    alert('Disallowed'); 
    } 
}); 

警报触发但字符仍显示在文本框中。

我试着四处寻找解释,为什么会发生这种情况,但无济于事,任何帮助将不胜感激!

编辑

卸下alert似乎解决这个问题(这似乎奇怪的),我真的很想知道为什么这样的行为虽然,它似乎没有任何意义。

感谢

+0

用'return false'代替'e.preventDefault();'会做这个工作 – Teneff

+0

我试过了,它似乎不工作: – billyonecan

+0

http://jsfiddle.net/GEngv/工作得很好(在Firefox中)! – rodneyrehm

回答

2

如果现在的问题是:为什么alert()有所作为?

alert是一个有趣的语句(和confirmprompt),它暂停您的JavaScript的执行,但释放了任何其他等待您的JavaScript执行的浏览器处理。它会干扰调试相当多。

浏览器将不会对您preventDefault()发言作出反应,直到你的JavaScript已经完成,将在alert有已暂停你的JavaScript,因此浏览器并没有在这一点上接收到的事件的返回状态,而不幸的是,alert已允许浏览器处理其他事件,即keypress,该事件潜行过去,因此您看到不想输入的字符出现。

你不能使用alert,或者,如果你需要它(?!),你可以发布它包裹在一个setTimeout,所以它不会阻止你的JavaScript和​​的结果将导致keypress之中抑制。

-

或者,您可以首先使用了keypress

$('selector').keypress(function(e) { 
    console.log(e.shiftKey); 
    if (e.which == 163) { 
    e.preventDefault(); 
    alert('Disallowed'); 
    } 
}); 

尽管如此,这仍然不能阻止字符被替代方法输入,所以我个人不会首先考虑到这一点。 : -/

5

只需使用e.which,而不是e.keyCode

$('#input').keydown(function(e) { 
    if (e.shiftKey && e.which == 51) { 
    e.preventDefault(); 
    alert('Disallowed'); 
    } 
}); 

Working sample

,因为从jQuery的文档:

对于键或鼠标事件,此属性指示特定键或 按钮是pressed.The event.which财产归event.keyCodeevent.charCode。建议观看事件,其中用于键盘按键输入。 event.which也归按钮按压(鼠标按下和mouseupevents),报告1左按钮2中间,和3为右。使用event.which而不是event.button

如果你想删除输入英镑符号上.keyup()

$('#input').keyup(function(e) { 
    var val = $.trim(this.value); 
    if (e.shiftKey && e.which == 51) { 
    $(this).val(val.replace(/\#/,'')); 
    } 
}); 

DEMO

试试这个,然后尝试:

$(this).val(val.replace(/\u00A3/g, '')); 

的完整代码

$('#input').keyup(function(e) { 
    var val = $.trim(this.value); 
    if (e.shiftKey && e.which == 51) { 
    $(this).val(val.replace(/\u00A3/g, '')); 
    } 
}); 
+0

它不适用于我:|尽管警报显示,角色仍然出现在框中。我已经在Chrome 19.x和FF 14.x中进行了测试,感谢有关'e.which'的信息,我从现在开始使用它! +1 – billyonecan

+0

@deifwud请检查我的第二个演示 – thecodeparadox

+0

与此相同的东西,字符仍然出现在文本框中:/ – billyonecan

1
$('#selector').keydown(function(e) { 
    console.log(e.shiftKey); 
    if (e.shiftKey && e.keyCode == 51) { 
    $(this).prop('disabled', true); 
    //do something, fade an object in...display a message, etc 
    setTimeout(function(){ 
     $(this).prop('disabled', false); 
    }, 500); 
    } 
}); 

这对我的作品。

编辑

新增setTimeout函数来复制你的愿望。

+0

这工作,直到我删除警报:( – billyonecan

+0

条件化语句,禁用属性,然后把setTimeout并重新启用它。 – Ohgodwhy

+0

@deifwud请参阅更新。 – Ohgodwhy