我有这个Prototype代码来检测 Enter 按textarea。
document.observe('keydown', function(e, el) {
if ((e.keyCode == 13) && (el = e.findElement('.chattext'))) {
e.stop();
// foo bar
}
}
和html
<textarea id="chattext_17" class="chattext" cols="20" rows="3"></textarea>
但问题是,该事件被调用两次。我甚至试图将其重写为jQuery
$('.chattext').live('keydown', function(e) {
if (e.keyCode == 13) {
e.preventDefault();
// foo bar
}
});
但即使这样,事件也会被调用两次。
当我尝试使用FireBug调试它时,它总是在完成事件处理程序
后跳转到此处function createWrapper(element, eventName, handler) {
var id = getEventID(element);
var c = getWrappersForEventName(id, eventName);
if (c.pluck("handler").include(handler)) return false;
var wrapper = function(event) {
if (!Event || !Event.extend || // always false here
(event.eventName && event.eventName != eventName))
return false;
Event.extend(event);
handler.call(element, event); // here the event gets called again
};
wrapper.handler = handler;
c.push(wrapper);
return wrapper;
}
我不是原型大师,所以我不知道问题出在哪里。
为什么要调用keydown事件两次?
答案 0 :(得分:5)
适合我。请参阅http://jsbin.com/ibozo/edit
<textarea id="chattext_17" class="chattext" cols="20" rows="3"></textarea>
<div id="dbg"></div>
脚本:
document.observe('keydown', function(e, el) {
if ((e.keyCode == 13) && (el = e.findElement('.chattext'))) {
e.stop();
$('dbg').insert('<div>enter pressed</div>')
}
})
每按一次[Enter]键,每个调试语句都会插入一次。 jQuery版本(未发布)表现完全相同。
你做错了什么。也许运行两次绑定的函数?
答案 1 :(得分:1)
或者这应该有效:
document.observe('keydown', function(e, el) {
if ((e.keyCode == 13) && (el = e.findElement('.chattext'))) {
e.die();
$('dbg').insert('<div>enter pressed</div>')
}
})