2009-12-10 73 views
0

如何找出用户输入或粘贴到textarea的内容?例如,如果他们在索引1处键入B(或β),或者他们在索引23处粘贴了hello world\n。我已经搜索了一点儿但找不到任何东西。这里是我到目前为止,使用jQuery的:JavaScript textarea:输入/粘贴的内容和位置?

$("textarea").keydown(function(evt){ 
    var index= getCaret(this); // this.selectionStart doesn't work in IE 
    var key = evt.keyCode; // Wrong. 
} 

getCaretthis questionevent.keyCode的问题是非英文键盘布局。就粘贴而言,我完全陷入困境。

如果可能,我想知道textarea更改之前的值 - 即从keydown事件中。我不确定这是否可以粘贴。

(删除更容易 - 检测keyCode==8退格键和keyCode==46对德尔如果selection.length > 0,然后选择删除;否则,字符或解除后,从理论上讲有前还粘贴上的选择上面的情况。 )

任何让这个更接近于在任何浏览器中工作的任何部分都非常感谢。也就是说,你怎么知道:

  1. 输入字符的unicode字符串值?
  2. 何时发生粘贴?
  3. 粘贴文本内容是什么?

回答

1

我不太清楚你的最终目标是什么,所以很难提供建议。然而,这里的一些信息:

当用户输入一个字符,让他们输入足够使用keypress事件(假设你的事件对象存储在名为evt一个变量)使用String.fromCharCode(evt.keyCode || evt.which)容易。

对于粘贴,事情有点棘手。最简单的事情是在发生之前检测粘贴,存储textarea的值,并在很短的时间后(使用window.setTimeout)比较新值和旧值。至于检测粘贴,很多浏览器现在有事件:从版本5开始的IE浏览器,从版本3开始的Firefox和WebKit浏览器一段时间(不知道确切的时间),所以你可以使用那些浏览器。作为其他浏览器的后备,您可以在​​事件处理程序中检测到Ctrl-V和Shift-Insert,但这绝不是万无一失的,因为当用户使用编辑菜单或浏览器中的上下文菜单进行粘贴时,它不会触发。

+0

'evt.which'与'evt.keyCode'具有相同的键盘布局问题。我曾考虑过'setTimout'选项(它也可以解决布局问题),但是这需要对输入的每个字符进行可能冗长的比较,并且在输入字符之前无法完成。无论如何,谢谢,我已经提出了你的答案。 – 2009-12-10 20:40:00

+0

'evt.which'等效于非IE浏览器中的'keypress'事件中的'evt.charCode',它在更多的浏览器中被支持并报告字符代码而不是键码,所以没有键盘布局问题。此页面是关键事件的良好参考:http://unixpapa.com/js/key.html。 'setTimeout'建议仅适用于粘贴,并且对于每个键入的字符都不需要。 – 2009-12-10 21:33:15