2010-09-20 93 views
0

函數內部我有一個事件處理函數。到現在爲止還挺好。但在那個事件處理程序,我想捕獲輸入按下並替換爲HTML。跨瀏覽器事件處理程序必須捕獲[ENTER]

我已經做了這樣的:

CrossBrowserEventHandler(Editor, 'keyup', function(Event) { myFunctionRef(idname, Event) }); 
    var myFunctionRef = function myFunction(idname, Event) 
    { 
     var keyCode; 
     if (!Event && window.event) { 
      Event = window.event; 
     } 
     if (Event) { 
      keyCode = (window.Event) ? Event.which : Event.keyCode; 

      if (keyCode == 13) { 
       Event.target.ownerDocument.execCommand("inserthtml",false,'<br />'); 
       Event.returnValue = false; 
      } 
     } 
     PushText(idname); /* pushes the input from a rich text iframe to a textarea */ 
    } 

的跨瀏覽器的事件處理函數如下:

function CrossBrowserEventHandler(target,eventName,handlerName) 
{ 
    if (target.addEventListener) { 
     target.addEventListener(eventName, handlerName, false); 
    } 
    else if (target.attachEvent) { 
     target.attachEvent("on" + eventName, handlerName); 
    } 
    else { 
     target["on" + eventName] = handlerName; 
    } 
} 

在第一部分中我捕捉到的鍵碼13(回報)和替換它通過一個execCommand到一個HTML換行符。它這樣做,但兩次。它不會取消/刪除實際的返回按下事件。

任何想法(除了標準的建議使用JS框架,我不能有很多的原因,其中之一是實際學習的過程)?

回答

0

你不應該捕獲鍵碼10而不是13嗎? 10代表換行符,13代表回車。

編輯:你可能會得到事件兩次a)你可能已經註冊了兩次或b)事件可能冒泡。對於B,我會建議你取消冒泡如

... 
     if (keyCode == 13) { 
      Event.target.ownerDocument.execCommand("inserthtml",false,'<br />'); 
      Event.returnValue = false; 
      Event.cancelBubble = false; 
     } 
... 

但是,另一個建議是從事件處理函數返回false。例如,

... 
     Event.returnValue = false; 
     Event.cancelBubble = false; 
     return false; 
    } 
... 

而且

CrossBrowserEventHandler(Editor, 'keyup', function(Event) { return myFunctionRef(idname, Event) }); 
+0

在這種情況下,我想捕捉13,而不是10 – 2010-09-20 06:33:24

+0

可以是事件冒泡的情況下 - 我已經編輯我的答案。 – VinayC 2010-09-20 07:24:43

+0

不幸的是,它仍然通過execCommand之後的Enter。讓我詳細說明這一點。它用於富文本區域功能,並且由於大多數瀏覽器將返回轉換爲HTML段落(IE和FF)或包含在div中的換行符,因此爲了統一起見,我希望它將返回轉換爲換行符。 – 2010-09-20 07:52:30