Javascript 将HTML输入限制为仅允许粘贴
是否可以在只接受粘贴输入的表单上使用HTML输入 作为注册过程的一部分,最终用户需要在基本HTML输入表单中输入一个20个字符的标识令牌。理想情况下,用户只需将令牌复制/粘贴到适当的字段中。我们不想让用户手动输入,因为他们可能会错误地输入字母,而且我们没有任何可靠的方法来验证输入 令牌来自桌面软件,需要粘贴到已打开的网页(即他们下载软件的位置)中。因此,可点击的链接不是一个可行的选择 有没有办法做到这一点,例如通过Javascript?谢谢Javascript 将HTML输入限制为仅允许粘贴,javascript,html,textfield,paste,Javascript,Html,Textfield,Paste,是否可以在只接受粘贴输入的表单上使用HTML输入 作为注册过程的一部分,最终用户需要在基本HTML输入表单中输入一个20个字符的标识令牌。理想情况下,用户只需将令牌复制/粘贴到适当的字段中。我们不想让用户手动输入,因为他们可能会错误地输入字母,而且我们没有任何可靠的方法来验证输入 令牌来自桌面软件,需要粘贴到已打开的网页(即他们下载软件的位置)中。因此,可点击的链接不是一个可行的选择 有没有办法做到这一点,例如通过Javascript?谢谢 我的解决方案根据SimplePi的答案改编: <
我的解决方案根据SimplePi的答案改编:
<html>
<body>
<script type="text/javascript">
function validate(evt) {
var theEvent = evt || window.event;
var key = theEvent.charCode || theEvent.which;
if(key >= 32 && (theEvent.ctrlKey === undefined || !theEvent.ctrlKey)) {
if(theEvent.preventDefault) theEvent.preventDefault();
else theEvent.returnValue = false;
}
}
</script>
<span>Textbox name</span> <br />
<input type="text" onkeypress='validate(event)' value=""/>
</body>
</html>
功能验证(evt){
var theEvent=evt | | window.event;
var key=theEvent.charCode | | theEvent.which;
如果(键>=32&&(theEvent.ctrlKey==undefined | | |!theEvent.ctrlKey)){
如果(theEvent.preventDefault)theEvent.preventDefault();
否则theEvent.returnValue=false;
}
}
文本框名称
这适用于某些浏览器,但并非所有浏览器。Mac上的Firefox是我发现的唯一一个违规者——Firefox在常规报告中与
v
完全相同,但在windows上,theEvent.ctrlKey
成员可以区分两者。在mac电脑上执行同样的操作显然需要按下键/向上键来检查是否按下了cmd。这是可行的,但不包括在本代码中,以防其他人希望使用它。为什么还要让他们将其粘贴进去?如果您是通过电子邮件发送验证令牌,那么只需通过电子邮件将它们路由到{{token}},然后从那里接收注册过程的其余部分
<script type="text/javascript">
function validate(evt) {
var theEvent = evt || window.event;
var key = theEvent.keyCode || theEvent.which;
key = String.fromCharCode(key);
var regex = /[]|\./;
if(!regex.test(key)) {
theEvent.returnValue = false;
if(theEvent.preventDefault) theEvent.preventDefault();
}
}
</script>
<span>Textbox name</span>
<input name="ReceiveNo" type="text" class="txtbox" onkeypress='validate(event)' value="" required tabindex="" />
功能验证(evt){
var theEvent=evt | | window.event;
var key=theEvent.keyCode | | theEvent.which;
key=String.fromCharCode(key);
var regex=/[]\./;
如果(!正则表达式测试(键)){
theEvent.returnValue=false;
如果(theEvent.preventDefault)theEvent.preventDefault();
}
}
文本框名称
这是一个更健壮的解决方案,我对上面的代码进行了扩展。可能有点过分,但它适用于所有浏览器。以下代码将:
$(“#您的#文本框”)。按键(功能(evt){
//注意这可能有点过分,但我发现了一些
//Firefox中的问题,并决定继续
//包括旧的windows键盘快捷键。
//枚举所有支持的剪贴板、撤消和重做键
var剪贴簿键={
winInsert:45,
温德莱特:46,
全选:97,
macCopy:99,
macPaste:118,
麦切:120,
重做:121,
撤销:122
}
//模拟只读,但允许所有剪贴板、撤消和重做操作键
var charCode=evt.which;
//警报(字符码);
//接受ctrl+v、ctrl+c、ctrl+z、ctrl+insert、shift+insert、shift+del和ctrl+a
如果(
evt.ctrlKey&&charCode==clipboardKeys.redo | |/*ctrl+y redo*/
evt.ctrlKey&&charCode==clipboardKeys.undo | |/*ctrl+z undo*/
evt.ctrlKey&&charCode==clipboardKeys.macCut | |/*ctrl+x mac cut*/
evt.ctrlKey&&charCode==clipboardKeys.macPaste | |/*ctrl+v mac paste*/
evt.ctrlKey&&charCode==clipboardKeys.macCopy | |/*ctrl+c mac copy*/
evt.shiftKey&&evt.keyCode==clipboardKeys.winInsert | |/*shift+ins-windows-paste*/
evt.shiftKey&&evt.keyCode==剪贴板KEYS.winDelete | | |/*shift+del windows cut*/
evt.ctrlKey&&evt.keyCode==clipboardKeys.winInsert | |/*ctrl+ins-windows-copy*/
evt.ctrlKey&&charCode==clipboardKeys.SelectAll/*ctrl+a全选*/
){返回0;}
//避开模拟只读文本框的所有剩余键
var theEvent=evt | | window.event;
var key=theEvent.keyCode | | theEvent.which;
key=String.fromCharCode(key);
var regex=/[]\./;
如果(!正则表达式测试(键)){
theEvent.returnValue=false;
theEvent.preventDefault();
}
});代码>我很确定这是可能的,但这将是一个非常糟糕的用户体验。大多数用户无论如何都会复制/粘贴令牌ID,那么为什么要为最小的用户付出额外的努力呢?您必须同时允许键盘快捷键粘贴(这可能因操作系统而异)和右键单击上下文菜单粘贴。还有,怎样才能阻止他们粘贴与您的令牌完全不同的东西?他们从哪里获得令牌?@ajp15243没有什么可以阻止他们粘贴随机文本,尽管我们可以强制要求文本必须正好是20个字符。这是为了防止用户错误意外地键入一个(或多个)无法检测的字母。@DylanStreb我很确定这是可能的,但需要大量的投资和测试,以确保它不包含任何隐藏的、巨大的漏洞。为什么不让他们输入两到三次钥匙,以确保他们没有输入错误?如果他们像大多数人一样进行复制/粘贴,这将是快速且不容易出错的。如果他们键入的内容与大多数人不同,那么他们以同样的方式错误键入两到三次的几率要比一次低得多。对不起,请更新更多详细信息:令牌是从桌面应用程序获得的。这是他们需要应用于用户帐户的物理设备的序列号。这似乎只是将文本框仅限于数字,并且禁止粘贴任何文本。@DylanStreb我修复了数字的问题。粘贴效果很好。在我自己的服务器上检查。只需执行key!=22
而不是key=String.fromCharCode(key)
和regex似乎可以工作,因为22是按下ctrl-v时设置为key的值。右键单击菜单不受影响。这样做可能是解决办法,但我需要更彻底地测试它。Tha