Tôi đang cố tạo một vùng văn bản tự động thụt lề và cho đến nay nó hoạt động với mã sau đây. Vấn đề mà tôi đang gặp là tôi hiện đang ngăn chặn hành động mặc định khi nhấn enter để tính toán các tab trong dòng và sau đó chèn dòng mới sau đó.Diện tích văn bản "Thông minh" tự động thụt lề
Tác phẩm này, nhưng tôi muốn có hành động mặc định của vùng văn bản, nếu bạn nhấn giữ, nó sẽ không di chuyển vùng văn bản cho đến khi dấu mũ chạm vào hàng dưới cùng, sau đó thanh cuộn vẫn giữ nguyên ở hàng dưới cùng. Mã hiện tại bên dưới giữ dấu mũ trong trường nhìn nếu được sử dụng ở bất kỳ vị trí nào trong vùng văn bản, nhưng nó làm nội dung phía trên dấu mũ để cuộn lên, đó là một sự thỏa hiệp vì dấu mũ không còn biến mất nữa. Nếu không có giải pháp nào khác, điều này sẽ hoạt động tốt, nhưng tôi hy vọng có những ý tưởng khác.
var start = this.selectionStart-1;
var end = this.selectionEnd;
var sT = this.scrollTop;
var sH = this.scrollHeight;
var vH = $(this).height();
var x = (sH - sT) - vH;
// Check if hitting enter on the first line as no newline will be found
if (this.value.lastIndexOf('\n',start)==-1)
var startSubstr = 0;
else
var startSubstr = this.value.lastIndexOf('\n',start)+1;
var endFirst = end - startSubstr;
var valueToScan = this.value.substr(startSubstr,endFirst);
var count = 0;
// Count only \t at the beginning of the line, none in the code
while (valueToScan.indexOf('\t')!=-1) {
if (valueToScan.indexOf('\t')!=0)
break;
count++;
valueToScan = valueToScan.substr(valueToScan.indexOf('\t')+1);
}
// Command to isert the newline, and then add the \t's found in previously
$(this).insertAtCaret('\n');
for (var i=0;i<count;count--) {
$(this).insertAtCaret('\t');
}
var sH = this.scrollHeight;
this.scrollTop = (sH - x) - vH;
EDIT Như một bản cập nhật, để xóa đi bất kỳ sự nhầm lẫn, tôi đang cố gắng để tạo ra một textbox kiểu IDE, ví dụ như vậy trong hầu hết các IDE nếu bạn gõ như sau
function example(whatever) {
Example Stuff // And then hit enter here
Tôi muốn nó đưa bạn đến cùng một khoảng cách tab từ đường viền bên trái dưới dạng "Nội dung mẫu" để giữ cho mã của bạn dễ đọc hơn. Tôi hiện đang có chức năng đó nhưng vấn đề là tôi đang chặn khóa nhập, có nghĩa là tôi phải cung cấp chức năng đó. Tôi gặp khó khăn khi sao chép chính xác chức năng của việc không cuộn hộp văn bản cho đến khi con trỏ chạm vào đường viền dưới cùng. Vì vậy, nếu bạn đã giữ để nhập ở trên cùng của textarea, con trỏ chỉ cần di chuyển xuống textarea, di chuyển bất kỳ văn bản với nó cho đến khi nó chạm vào biên giới phía dưới, và sau đó scrollbar cho textarea sẽ theo con trỏ. Có lý?
EDIT 2thẻ cập nhật để chỉ ra code đang với PHP
Tôi đã làm việc về vấn đề này trong khi bài này đã được ngồi. Tôi nghĩ rằng một tùy chọn khác mà tôi sẽ khám phá khi tôi có cơ hội thay vì ngăn chặn nhập chỉ cho phép hành động mặc định nhấn enter và đọc chuỗi từ lastIndexOf('\n')-1
đến \n
gần đây nhất đối với bất kỳ \t
nào. Tôi nghĩ rằng sẽ cho tôi chuỗi mà tôi đang tìm kiếm, nhưng không làm rối loạn hành vi của văn bản. Sẽ cập nhật lại sau khi thử nghiệm.
EDIT 3 Đã giải quyết, như bản cập nhật trước của tôi, tôi quyết định quét chuỗi sau khi nhấn phím, giữ nguyên hành vi tự nhiên (phần thay đổi được thêm bên dưới cho những người quan tâm) và vấn đề duy nhất thực sự là bạn giữ nhập, nó sẽ không đếm thụt đầu dòng từ nguồn gốc của báo chí nhập, đó là tốt của tôi. Tôi sẽ cung cấp cho một trong những http://stackoverflow.com/users/15066/matyr'>matyr, mặc dù tôi đã tìm ra trước khi ông trả lời ông vẫn là gần nhất.
if (this.value.lastIndexOf('\n',start-2)==-1) {
var startSubstr = 0;
} else {
var startSubstr = this.value.lastIndexOf('\n',start-1)+1;
}
var valueToScan = this.value.substr(startSubstr,start);
Duy trì vị trí cuộn không phải là vấn đề, nó cho phép con trỏ tiếp tục đến cuối của vùng văn bản trước khi theo dõi nó với mỗi dòng mới.Tôi sẽ cố gắng sử dụng keyup thay vì keydown theo lần cập nhật gần đây nhất của tôi – Robert
nếu bạn sử dụng KEYUP có nghĩa là nó sẽ kích hoạt tất cả các nút bấm, thực tế chúng ta cần đôi khi để giữ một nút để có nhiều sự kiện.Trong trường hợp đó KEYDOWN là tốt hơn.Đó là sự kiện KEYDOWN cháy trước khi ký tự textarea cập nhật để bạn muốn sử dụng el.keydown (function (e) {setTimeout (function (e) {/ * HÀNH ĐỘNG KEYDOWN CỦA BẠN * /}, 1)}); – kami