2010-08-20 40 views
11

Tôi đang cố gắng tạo lại hành vi nhắn tin nhanh chuẩn trên điều khiển vùng TEXT: nhập các công trình dưới dạng nút gửi. ctrl + nhập dưới dạng nhập thực.jquery ctrl + nhập như nhập vào vùng văn bản

$("#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; 
} 

Tôi đã thử cả hai dòng nhận xét và không có. Không làm việc. nhập đơn giản hoạt động như mong đợi. Bất kỳ ý tưởng nào để thêm nhập trên ctrl + enter?

mã khóa không phải là vấn đề. chúng được phát hiện chính xác. vì vậy tất cả các công trình nếu như mong đợi. Nhưng việc thêm dòng mới hoạt động không chính xác (trong FF, Chrome hoạt động chính xác). Vì vậy, tôi cần cách multibrowser chính xác để chèn biểu tượng dòng mới vào textarea. Nếu không thêm chuỗi bằng tay (bởi một số sự kiện dựa trên ctrl + enter) nó sẽ tốt hơn.

thay đổi về sự kiện nhấn phím không có hiệu lực. "\ r \ n" không được trợ giúp.

trang kiểm tra nằm here

+0

tính năng bổ sung đó là gì! cho – Starx

+0

Bạn đã thử xác định khác nếu (e.keyCode == 13 && e.ctrlKey)? –

+0

Tôi đã thử nếu (e.keyCode == 13 && e.ctrlKey). Không thành công. Có thể không phải là "\ n"? Nhưng tôi đã không tìm thấy bất kỳ cách nào khác. "\ r \ n" cũng không được hỗ trợ. trong Fire Fox tất cả đều ổn. Trong IE chuyển sang dòng kế tiếp chỉ khi nhấn ký tự tiếp theo (tức là vận chuyển trả về không hoạt động) –

Trả lời

2

Một vài nguyên nhân tiềm năng:

Xác định chức năng trước khi bạn tham khảo nó.

Đảm bảo bạn đang ràng buộc sự kiện trong sự kiện document.ready, để mục dom tồn tại khi bạn tham chiếu.

Thay đổi else (e.keyCode == 13) thành else if (e.keyCode == 13).

Đảm bảo đây là textarea, không phải là input[type=text].

Cân nhắc sử dụng keypress thay vì keydown. Một số trình duyệt sẽ gửi keyCode == 10 thay vì keyCode == 13 khi sử dụng phím bổ trợ ctrl (một số trình duyệt sẽ gửi ngay cả khi bạn không sử dụng phím bổ trợ ctrl).

+0

nếu bị lãng quên khi sao chép mã. Tôi đã thay đổi phân mảnh thành hiện thực. đăng ký được thực hiện ở trên sẵn sàng. Vì vậy, các sự kiện sẽ kích hoạt chính xác. Nếu các trường hợp được xử lý chính xác. Nhưng không có biểu tượng dòng mới. –

+0

-2? Quan tâm để giải thích? Bất kỳ một trong những vấn đề có thể gây ra điều này không làm việc, và tôi chỉ có thể đi trên mã được cung cấp. –

+0

Tôi đồng ý, phiếu giảm giá rất khắc nghiệt trong trường hợp này – Jake

2

wow nỗi đau trong mông. Tôi đã chơi với điều này một thời gian và tôi phải giả định đây chỉ là IE không hợp tác. dù sao, đây là điều tốt nhất tôi có thể làm sáng nay và nó siêu hacky, nhưng có lẽ bạn có thể đạt được điều gì đó từ nó.

giải thích: Tôi đang thử nghiệm với ie8, phần tử văn bản và chuyển phát nhanh mới. Kết quả có thể thay đổi. Ký tự ascii 173 (0xAD) không hiển thị ký tự, mặc dù nó được tính là ký tự khi di chuyển con trỏ của bạn xung quanh. thêm char này sau khi bạn buộc một dòng mới được tức là để di chuyển con trỏ xuống. trước khi cuộc gọi đến SendMessage chúng tôi thay thế các char bổ sung với không có gì.

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; 
} 

nếu bạn cố thực hiện thay thế trên mỗi lần nhấn phím, nó sẽ không hoạt động tốt. bạn có thể giải quyết vấn đề này bằng các phím trắng/danh sách đen và tìm một phương pháp để đưa con trỏ trở lại văn bản mà nó phải đi.

0

Bạn có thể kiểm tra sự ctrl và alt như trong

$(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; 
    }); 
}); 

Xem một ví dụ làm việc ở đây: http://jsfiddle.net/VcyAH/

+0

mã khóa không phải là vấn đề (xem nhận xét của tôi ti Eton). chúng được phát hiện chính xác. vì vậy tất cả các công trình nếu như mong đợi. Nhưng việc thêm dòng mới hoạt động không chính xác (trong FF, Chrome hoạt động chính xác). Vì vậy, tôi cần cách multibrowser chính xác để chèn biểu tượng dòng mới vào textarea. Nếu không thêm chuỗi bằng tay (bởi một số sự kiện dựa trên ctrl + enter) nó sẽ tốt hơn. –

+0

Ah, tôi hiểu, sau khi bình luận của bạn và đọc lại câu hỏi của bạn và tất cả các ý kiến ​​khác tôi nghĩ rằng tôi hiểu mong muốn của bạn. Tôi sẽ xem xét điều này một chút sau (không có thời gian ngay lập tức) –

16

Sau đây sẽ làm việc trong tất cả các trình duyệt chính, bao gồm IE.Nó sẽ cư xử chính xác như thể vào phím đã được nhấn khi bạn nhấn ctrl-nhập:

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

đây là cách tốt hơn so với những gì tôi đã đưa ra. – lincolnk

+0

hoạt động giống như một nét duyên dáng :) –

+0

Nên có 'e.preventDefault();' để làm việc này đúng cách. –

0

Nếu bạn có thể gắn bó với Shift + Enter thay vì Ctrl + Enter sau đó giải pháp là tầm thường. Bạn không cần bất kỳ mã đặc biệt nào khi Shift + Enter kích hoạt ngắt dòng tự động. Chỉ cần bắt đồng bằng Enter để thực hiện việc gửi.

1

Câu trả lời của tôi dẫn từ câu trả lời của Ian Henry về keyCode == 10, có vẻ như là trường hợp trong IE (được kiểm tra trong 8 & 9). Kiểm tra xem bạn có đang xử lý sự kiện cửa sổ hay không và mã khóa.

$('#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 
    }     
    }); 
Các vấn đề liên quan