2009-12-10 30 views
0

如何找出用戶輸入或粘貼到textarea的內容?例如,如果他們在索引1處鍵入B(或β),或者他們在索引23處粘貼了hello world\n。我已經搜索了一點兒但找不到任何東西。這裏是我到目前爲止,使用jQuery的:JavaScript textarea:輸入/粘貼的內容和位置?

$("textarea").keydown(function(evt){ 
    var index= getCaret(this); // this.selectionStart doesn't work in IE 
    var key = evt.keyCode; // Wrong. 
} 

getCaretthis questionevent.keyCode的問題是非英文鍵盤佈局。就粘貼而言,我完全陷入困境。

如果可能,我想知道textarea更改之前的值 - 即從keydown事件中。我不確定這是否可以粘貼。

(刪除更容易 - 檢測keyCode==8退格鍵和keyCode==46對德爾如果selection.length > 0,然後選擇刪除;否則,字符或解除後,從理論上講有前還粘貼上的選擇上面的情況。 )

任何讓這個更接近於在任何瀏覽器中工作的任何部分都非常感謝。也就是說,你怎麼知道:

  1. 輸入字符的unicode字符串值?
  2. 何時發生粘貼?
  3. 粘貼文本內容是什麼?

回答

1

我不太清楚你的最終目標是什麼,所以很難提供建議。然而,這裏的一些信息:

當用戶輸入一個字符,讓他們輸入足夠使用keypress事件(假設你的事件對象存儲在名爲evt一個變量)使用String.fromCharCode(evt.keyCode || evt.which)容易。

對於粘貼,事情有點棘手。最簡單的事情是在發生之前檢測粘貼,存儲textarea的值,並在很短的時間後(使用window.setTimeout)比較新值和舊值。至於檢測粘貼,很多瀏覽器現在有事件:從版本5開始的IE瀏覽器,從版本3開始的Firefox和WebKit瀏覽器一段時間(不知道確切的時間),所以你可以使用那些瀏覽器。作爲其他瀏覽器的後備,您可以在​​事件處理程序中檢測到Ctrl-V和Shift-Insert,但這絕不是萬無一失的,因爲當用戶使用編輯菜單或瀏覽器中的上下文菜單進行粘貼時,它不會觸發。

+0

'evt.which'與'evt.keyCode'具有相同的鍵盤佈局問題。我曾考慮過'setTimout'選項(它也可以解決佈局問題),但是這需要對輸入的每個字符進行可能冗長的比較,並且在輸入字符之前無法完成。無論如何,謝謝,我已經提出了你的答案。 – 2009-12-10 20:40:00

+0

'evt.which'等效於非IE瀏覽器中的'keypress'事件中的'evt.charCode',它在更多的瀏覽器中被支持並報告字符代碼而不是鍵碼,所以沒有鍵盤佈局問題。此頁面是關鍵事件的良好參考:http://unixpapa.com/js/key.html。 'setTimeout'建議僅適用於粘貼,並且對於每個鍵入的字符都不需要。 – 2009-12-10 21:33:15