2010-08-20 95 views
11

我試圖在TEXT區域控件上重現標準的即時通訊行爲: 輸入作爲發送按鈕。 ctrl +輸入爲真實輸入。jquery ctrl +輸入爲文本區域中的輸入

$("#txtChatMessage").keydown(MessageTextOnKeyEnter); 
function MessageTextOnKeyEnter(e) 
{ 
    if (!e.ctrlKey && e.keyCode == 13) 
    { 
     SendMessage(); 
     return false; 
    } 
    else if(e.keyCode == 13) 
    { 
     $(this).val($(this).val() + "\n"); 
    } 
    return true; 
} 

我已經嘗試了兩個註釋行和沒有。不起作用。簡單地按預期工作。 任何想法如何添加輸入Ctrl + Enter?

關鍵代碼不是問題。它們被正確檢測到。所以如果按預期工作。但是添加新行可能不正確(在FF中,Chrome可正常工作)。所以我需要正確的多瀏覽器方式將新行符號插入到textarea中。如果沒有手動添加字符串(通過一些基於Ctrl + Enter的事件),它會更好。

更改按鍵事件不起作用。 「\ r \ n」沒有幫助。

測試頁位於here

+0

什麼是額外的!對於 – Starx 2010-08-20 15:27:05

+0

您是否嘗試指定else if(e.keyCode == 13 && e.ctrlKey)? – 2010-08-20 15:30:36

+0

我試過如果(e.keyCode == 13 && e.ctrlKey)也。沒有成功。可能不是「\ n」?但我還沒有找到任何其他多瀏覽器的方式。 「\ r \ n」也沒有幫助。 在Fire Fox一切正常。 IE只在按下一個字符時才移動到下一行(即回車不起作用) – 2010-08-20 15:42:41

回答

2

幾個可能的原因:

定義函數,你引用它之前。

確保您綁定了事件document.ready事件,以便在您引用它時存在dom項目。

更改​​到else if (e.keyCode == 13)

請確定這是一個textarea而不是input[type=text]

考慮使用keypress而不是​​。

使用ctrl修飾鍵時,某些瀏覽器會發送keyCode == 10而不是keyCode == 13(即使您沒有使用Ctrl修飾鍵時,某些瀏覽器也會發送它)。

+0

如果在複製代碼時遺忘了。我已經將片段變爲現實。訂閱已準備就緒。 因此事件正確啓動。如果案件正確處理。但沒有新的符號。 – 2010-08-20 15:29:01

+0

-2?謹慎解釋?這些問題中的任何一個都可能導致這種情況不起作用,我只能繼續提供所提供的代碼。 – 2010-08-20 15:58:01

+0

我同意,在這種情況下,投票是苛刻的 – Jake 2010-08-20 20:54:41

2

哇,屁股疼得厲害。我一直在玩這一段時間,我不得不認爲這只是IE不合作。無論如何,這是今天早上我能做的最好的事情,這是超級哈克,但也許你可以從中獲益。

解釋:我正在測試ie8,一個textarea元素和快遞新。結果可能會不同。 ascii字符173(0xAD)不顯示字符,儘管它在移動光標時計爲字符。在強制換行之後附加此char可以將光標向下移動。在撥打SendMessage之前,我們將多餘的字符替換爲空白。

function MessageTextOnKeyEnter(e) 
{ 
    var dummy = "\xAD"; 
    if (!e.ctrlKey && e.keyCode == 13) 
    { 
     var regex = new RegExp(dummy,"g"); 
     var newval = $(this).val().replace(regex, ''); 
     $(this).val(newval); 

     SendMessage(); 
     return false; 
    } 
    else if(e.keyCode == 13) 
    { 
     $(this).val($(this).val() + "\n" + dummy); 
    } 
    return true; 
} 

如果您嘗試在每次擊鍵時進行替換,它將不會很好地工作。你可能可以通過白名單或黑名單來處理這個問題,並找到一種方法將光標放回到應該去的文本中。

0

您可以檢查Ctrl和Alt在

$(document).ready(function() { 
    $('#myinput').keydown(function(e) { 
     var keysare = 'key code is: ' + e.which + ' ' + (e.ctrlKey ? 'Ctrl' : '') + ' ' + (e.shiftKey ? 'Shift' : '') + ' ' + (e.altKey ? 'Alt' : ''); 
     //alert(keysare); 
     $('#mycurrentkey').text(keysare); 
     return false; 
    }); 
}); 

看到這裏工作的例子:http://jsfiddle.net/VcyAH/

+0

關鍵代碼不是問題(請參閱我的評論ti Eton)。它們被正確檢測到。所以如果按預期工作。但是添加新行可能不正確(在FF中,Chrome可正常工作)。所以我需要正確的多瀏覽器方式將新行符號插入到textarea中。如果沒有手動添加字符串(通過一些基於Ctrl + Enter的事件),它會更好。 – 2010-08-20 16:02:52

+0

啊,我看到,在你評論和重讀你的問題和所有其他評論後,我想我理解你的願望。我會稍後再看一下(立刻沒有時間) – 2010-08-20 16:15:33

16

下面將在所有主要的瀏覽器,包括IE瀏覽器。它的行爲完全就好像進入按下了按鍵,當你按Ctrl + Enter:

function MessageTextOnKeyEnter(e) { 
    if (e.keyCode == 13) { 
     if (e.ctrlKey) { 
      var val = this.value; 
      if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") { 
       var start = this.selectionStart; 
       this.value = val.slice(0, start) + "\n" + val.slice(this.selectionEnd); 
       this.selectionStart = this.selectionEnd = start + 1; 
      } else if (document.selection && document.selection.createRange) { 
       this.focus(); 
       var range = document.selection.createRange(); 
       range.text = "\r\n"; 
       range.collapse(false); 
       range.select(); 
      } 
     } 
     return false; 
    } 
} 
+0

這比我想出來的要好得多。 – lincolnk 2010-08-20 17:06:05

+0

作品像一個魅力:) – 2010-08-23 06:41:16

+0

應該有'e.preventDefault();'也爲了這個工作正常。 – 2017-07-12 21:49:03

0

如果你能排杆+ Enter鍵,而不是按Ctrl + Enter,然後解決方案是微不足道的。由於Shift + Enter自動觸發換行符,因此不需要任何特殊代碼。只需簡單地回車即可發送。

1

我的答案從Ian Henry的關於keyCode == 10的答案中得到了答案,這似乎是IE中的情況(在8 & 9中測試過)。檢查你是否正在處理一個Windows事件並獲取關鍵代碼。

$('#formID #textareaID').keypress(function(e) { 
    if(window.event) { 
     var keyCode = window.event.keyCode;  
    } 
    else { 
     var keyCode = e.keyCode || e.which; 
    } 

    if((!e.ctrlKey && (keyCode == 13))) { 
     //do stuff and submit form 
    } 
    else if((e.ctrlKey && (keyCode == 13)) || (keyCode == 10)) { 
     //do stuff and add new line to content 
    }     
    });