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

时间:2014-02-06 14:43:31

标签: javascript html textfield paste

是否可以在只接受粘贴输入的表单上输入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>

这适用于某些浏览器,但不适用于所有浏览器。 Mac上的Firefox是我发现的唯一一个攻击者 - 一般报告中的firefox ctrl-vv完全相同,但在Windows上,theEvent.ctrlKey成员可以区分这两者。在mac上执行相同操作显然需要keydown / up来检查cmd是否被按下。它是可行的,但不包括在此代码中,以防其他人希望使用它。

3 个答案:

答案 0 :(得分:5)

<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="" />

答案 1 :(得分:3)

这是一个更强大的解决方案,我扩展了上面的代码。可能有点矫枉过正,但它适用于所有浏览器。以下代码将:

  1. 使文本框与readonly一样,但会尊重标签索引并设置焦点
  2. 使用鼠标或键盘支持所有剪贴板功能win和mac
  3. 允许撤消,重做并全选
  4. &#13;
    &#13;
    $( "#your_textbox" ).keypress(function(evt) {
    	// Note this could be a bit of overkill but I found some
    	// problems in Firefox and decided to go the distance
    	// including old windows keyboard short cut keys.
    	// Enumerate all supported clipboard, undo and redo keys
    	var clipboardKeys = {
    		winInsert : 45,
    		winDelete : 46,
    		SelectAll : 97,
    		macCopy : 99,
    		macPaste : 118,
    		macCut : 120,
    		redo : 121,	
    		undo : 122
    	}
    	// Simulate readonly but allow all clipboard, undo and redo action keys
    	var charCode = evt.which;
    	//alert(charCode);
    	// Accept ctrl+v, ctrl+c, ctrl+z, ctrl+insert, shift+insert, shift+del and ctrl+a
    	if (
    		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 == clipboardKeys.winDelete ||	/* shift+del windows cut	*/ 
    		evt.ctrlKey && evt.keyCode == clipboardKeys.winInsert  ||	/* ctrl+ins windows copy	*/ 
    		evt.ctrlKey && charCode == clipboardKeys.SelectAll		/* ctrl+a select all		*/
    		){ return 0; }
    	// Shun all remaining keys simulating readonly textbox
    	var theEvent = evt || window.event;
    	var key = theEvent.keyCode || theEvent.which;
    	key = String.fromCharCode(key);
    	var regex = /[]|\./;
    	if(!regex.test(key)) {
    		theEvent.returnValue = false;
    		theEvent.preventDefault();
    	}
    });
    &#13;
    &#13;
    &#13;

答案 2 :(得分:2)

为什么要让它们粘贴?如果您通过电子邮件发送验证令牌,则只需通过电子邮件将其发送至http://example.com/verify/ {{TOKEN}},然后从那里获取其余的注册流程。