2009-09-26 104 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>') 
} 
})