如何判断用户是在输入还是粘贴?

4
在我的JSP文本字段中,我希望知道用户是在输入数据还是粘贴数据。我该如何使用javascript来识别?

编辑:根据安迪的答案,我知道如何处理它,但仍然好奇那些人是如何编写onpaste事件的。

@Ravi:不确定我是否理解了你对问题的更新 - 你是指浏览器供应商如何编写事件吗?还是其他什么? - Andy E
是的,如果我想编写自己的 onpaste 事件,我该怎么做? - Ravi Gupta
4个回答

9

Safari、Chrome、Firefox和Internet Explorer都支持onpaste事件(不确定Opera是否支持)。监听onpaste事件,就可以捕获粘贴的内容。


实现这个很简单。在你的输入框中使用html添加事件处理程序:

<input type="text" id="myinput" onpaste="handlePaste(event);">

或者JavaScript-DOM:
var myInput = document.getElementById("myInput");

if ("onpaste" in myInput) // onpaste event is supported
{
    myInput.onpaste = function (e)
    {
        var event = e || window.event;
        alert("User pasted");
    }
}
// Check for mutation event support instead
else if(document.implementation.hasFeature('MutationEvents','2.0'))
{
    /* You could handle the DOMAttrModified event here, checking 
       new value length vs old value length but it wouldn't be 100% reliable */
}

据我所知,Opera浏览器不支持onpaste事件。您可以使用DOMAtrrModified事件,但这会在脚本更改输入框的值时触发,因此您必须小心处理。不幸的是,我不熟悉突变事件,因此我不想通过编写我不确定的示例来搞砸这个答案。


5
以前不知道这个存在,所以我喜欢 Stack Overflow。 - Paul Whelan
@Tim Down:确实如此,但我认为没有必要提到这一点,因为很少有人使用Firefox 2.0。 - Andy E
我认为提及这些事情总是值得的。我不会明确提到某个东西是否在IE 4甚至IE 5中可用,但Firefox 2.0并不算太旧。 - Tim Down

1

统计按键次数,并确保与文本框中的内容匹配。粘贴的内容可能不完整,与文本框中的字符数量不一致。


那很聪明,但不防水。如果我打字后粘贴,或者使用退格键重新开始呢? - Sandor Drieënhuizen
检查文本框中的字符总数。粘贴操作会使计数器增加,超过您在键盘事件中检测到的数量。删除键有一个代码来查找它并将计数减少 :) - Paul Whelan
您可以使用上下文菜单进行粘贴,而无需使用任何键,因此您的处理事件无法捕获此操作。 - Andy E
是的,你可以这样做,但字符仍然会出现在文本框中,因此你知道文本框中的字符数比输入的要多,因此你可以检测到已发生粘贴。 - Paul Whelan
我看到上面有一个onpaste事件可以解决它。但我想你是对的。我可以继续讲述关于将一个字符粘贴到另一个字符上的问题,但那样就太苛刻了 :) - Sandor Drieënhuizen
嗨,桑多尔,我其实也在考虑这个问题 :) - Paul Whelan

0

我知道对于文本区域,你可以使用 onPaste 事件来捕获粘贴事件。

HTML:

<textarea id="textEditor" />

在JS中:

var editor = document.getElementById("textEditor");

if (isIE /* determine this yourself */) {
   editor.onPaste = function() {

   }
} else {
   //Not IE
   editor.onpaste = function() {

   }
}

//The capitalisation of the onpaste (non-IE) and onPaste (IE) makes a difference.

关于输入方面,有 onKeyDownonKeyUponKeyPress 事件。
希望这能帮到你。

可能与 SO 相关的问题 IE onPaste event using javascript not HTML


0

你永远无法确定。即使拦截关键输入,用户可能使用上下文菜单使用鼠标粘贴。访问剪贴板(以比较输入和剪贴板内容)将不能按照您所需的方式进行,因为它是一个严格的用户操作。未经用户明确同意,您将无法以编程方式访问它(浏览器将显示确认消息)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接