Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将HTML输入限制为仅允许粘贴_Javascript_Html_Textfield_Paste - Fatal编程技术网

Javascript 将HTML输入限制为仅允许粘贴

Javascript 将HTML输入限制为仅允许粘贴,javascript,html,textfield,paste,Javascript,Html,Textfield,Paste,是否可以在只接受粘贴输入的表单上使用HTML输入 作为注册过程的一部分,最终用户需要在基本HTML输入表单中输入一个20个字符的标识令牌。理想情况下,用户只需将令牌复制/粘贴到适当的字段中。我们不想让用户手动输入,因为他们可能会错误地输入字母,而且我们没有任何可靠的方法来验证输入 令牌来自桌面软件,需要粘贴到已打开的网页(即他们下载软件的位置)中。因此,可点击的链接不是一个可行的选择 有没有办法做到这一点,例如通过Javascript?谢谢 我的解决方案根据SimplePi的答案改编: <

是否可以在只接受粘贴输入的表单上使用HTML输入

作为注册过程的一部分,最终用户需要在基本HTML输入表单中输入一个20个字符的标识令牌。理想情况下,用户只需将令牌复制/粘贴到适当的字段中。我们不想让用户手动输入,因为他们可能会错误地输入字母,而且我们没有任何可靠的方法来验证输入

令牌来自桌面软件,需要粘贴到已打开的网页(即他们下载软件的位置)中。因此,可点击的链接不是一个可行的选择

有没有办法做到这一点,例如通过Javascript?谢谢


我的解决方案根据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(); } } 文本框名称
这是一个更健壮的解决方案,我对上面的代码进行了扩展。可能有点过分,但它适用于所有浏览器。以下代码将:

  • 使文本框与readonly一样,但将遵循选项卡索引并设置焦点
  • 使用鼠标或键盘支持win和mac的所有剪贴板功能
  • 允许撤消、重做和全选
  • $(“#您的#文本框”)。按键(功能(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