2009-09-26 79 views
3

我有了这个原型代码来检测输入按下textarea的。KeyDown事件被调用两次

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事件调用两次?

回答

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版本(未发布)的行为完全相同。

你在做别的事情。也许运行绑定两次的函数?

+0

哇咔咔,我发现我有js文件链接两次......反正THX :) – 2009-09-26 14:00:07

1

或者这应该工作:

document.observe('keydown', function(e, el) { 
if ((e.keyCode == 13) && (el = e.findElement('.chattext'))) { 
    e.die(); 
    $('dbg').insert('<div>enter pressed</div>') 
} 
})