【发布时间】:2013-01-03 21:51:59
【问题描述】:
我目前已将我的 textarea 绑定到几个似乎有效的事件。但是,问题在于事件会重叠并触发多次,这反过来又会大大降低性能。
我想要做的几乎就是捕捉到文本区域的任何更改:单击、粘贴、keyup、keydown、右键单击上下文菜单编辑(右键单击、剪切/删除/粘贴)、拖放等。这有可以跨浏览器工作,至少到 IE8。当您使用箭头键或类似键在文本区域中移动插入符号时,必须触发事件(我根据插入符号位置处理更改等)。
我不能使用任何重大延迟。一旦你对 textarea 做一些事情,事件必须立即触发并执行我在那里的任何代码。
我目前正在使用 jQuery 来绑定事件,但我可以使用纯 javascript 解决方案,只要它可以跨浏览器工作并执行我想要的操作。
这是我目前使用的代码:
var deadKeycodes = [16, 17, 18, 19, 20,
27, 33, 34, 35, 36,
38, 40, 44, //37 = left arrow and 39 = right arrow removed, it needs to trigger on those
45, 112, 113, 114, 115,
116, 117, 118, 119, 120,
121, 122, 123, 144, 145];
$(original).bind('propertychange keyup keydown input click', function(e) {
if (!Array.prototype.indexOf || deadKeycodes.indexOf(e.keyCode) == -1) { // prevent execution when pressing a 'dead' key
//do stuff here
}
});
如果有什么不清楚的地方就问吧,我会为你澄清的:)
【问题讨论】:
-
keydown 和 click 是你真正需要的,如果 click 没有覆盖,也许粘贴和剪切事件也是如此。
-
Keyup 和 keydown 在不同的时间触发。在文本区域中按住一个键并查看(并查看降价预览何时更新)。一般来说,keyup 和 keydown 不能很好地确定输入何时发生变化(尽管您可以将两者都用于可接受的情况)。
-
keydown 与 setTimeout 设置为 0 配对,非常适合在 keydown 时立即检测更改,而不是等待 keyup。
标签: javascript jquery events jquery-events