KeyDown事件被调用两次

时间:2009-09-26 13:37:14

标签: javascript jquery events prototypejs

我有这个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事件两次?

2 个答案:

答案 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>')
 }
})