8

我看到,当我在调用它的函数时尝试从 textarea 字段中读取值时onpaste,我得到了该字段的旧值(粘贴操作之前的那个),而不是新值(粘贴操作之后的那个)。

这是此行为的演示:http: //jsfiddle.net/qsDnr/

代码副本如下:

<!DOCTYPE html>
<html>
<head>
<title>On Paste</title>
<script type="text/javascript">
var textareaElement;
var previewElement;

function update()
{
    previewElement.innerHTML = textareaElement.value;
}

window.onload = function() {
    textareaElement = document.getElementById('textarea');
    previewElement = document.getElementById('preview');
    textareaElement.onpaste = update    
}
</script>
</head>
<body>
<textarea id="textarea">
</textarea>
<div id="preview">
</div>
</body>
</html>

您可以通过以下步骤确认行为。

  1. 将字符串复制foo到剪贴板。
  2. 右键单击 textarea 字段并选择“粘贴”。div 元素中不显示任何内容。
  3. 右键单击 textarea 字段并再次选择“粘贴”。foo出现在 div 元素中。

由于我希望 div 元素始终显示使用粘贴操作在 textarea 元素中更新的内容,因此所需的输出分别是步骤 2foofoo foo步骤 3 中的和。

我设法获得所需输出的一种方法是使用延迟update()函数调用window.setTimeout(),所以而不是

textareaElement.onpaste = update    

我有

textareaElement.onpaste = function() {
    window.setTimeout(update, 100);
};

这次(演示:http: //jsfiddle.net/cwpLS/)。这就是我想要的。但是,这感觉更像是一种解决方法,而不是一种直接的方式来做我想做的事。我想知道是否有任何替代或更好的方法来做到这一点。

4

2 回答 2

3

我很确定您 setTimeout 解决方案是实现所需效果的唯一方法,或者尝试访问剪贴板对象 - 如果您要跨浏览器和旧浏览器支持,这可能会变得混乱。

于 2012-03-25T04:12:17.530 回答
0

在跨浏览器中没有直接的方法可以做到这一点。有关 Firefox 中的行为,请参阅下面的链接。

Mozilla

目前没有仅 DOM 的方式来获取被粘贴的文本;您必须使用 nsIClipboard 来获取该信息。

另请查看讨论其他可能性的stackoverflow 链接。

于 2012-03-25T04:10:07.860 回答