是否可以在只接受粘贴输入的表单上输入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-v
与v
完全相同,但在Windows上,theEvent.ctrlKey
成员可以区分这两者。在mac上执行相同操作显然需要keydown / up来检查cmd是否被按下。它是可行的,但不包括在此代码中,以防其他人希望使用它。
答案 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)
这是一个更强大的解决方案,我扩展了上面的代码。可能有点矫枉过正,但它适用于所有浏览器。以下代码将:
$( "#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;
答案 2 :(得分:2)
为什么要让它们粘贴?如果您通过电子邮件发送验证令牌,则只需通过电子邮件将其发送至http://example.com/verify/ {{TOKEN}},然后从那里获取其余的注册流程。