jQuery - chọn tất cả văn bản từ một vùng văn bản


130

Làm thế nào tôi có thể làm cho nó như vậy khi bạn nhấp vào bên trong một vùng văn bản, toàn bộ nội dung của nó được chọn?

Và cuối cùng khi bạn nhấp lại, để bỏ chọn nó.



5
@Blender: Không, câu hỏi đó liên quan đến việc làm nổi bật văn bản trong một yếu tố, không phải là văn bản. Hai người khá khác nhau.
Tim Down

Câu trả lời:


194

Để ngăn người dùng khỏi khó chịu khi toàn bộ văn bản được chọn mỗi khi họ cố gắng di chuyển dấu mũ bằng chuột, bạn nên thực hiện việc này bằng cách sử dụng focussự kiện chứ không phải clicksự kiện. Sau đây sẽ thực hiện công việc và khắc phục sự cố trong Chrome để ngăn phiên bản đơn giản nhất (nghĩa là chỉ gọi select()phương thức của textarea trong focustrình xử lý sự kiện) hoạt động.

jsFiddle: http://jsfiddle.net/NM62A/

Mã số:

<textarea id="foo">Some text</textarea>

<script type="text/javascript">
    var textBox = document.getElementById("foo");
    textBox.onfocus = function() {
        textBox.select();

        // Work around Chrome's little problem
        textBox.onmouseup = function() {
            // Prevent further mouseup intervention
            textBox.onmouseup = null;
            return false;
        };
    };
</script>

Phiên bản jQuery:

$("#foo").focus(function() {
    var $this = $(this);
    $this.select();

    // Work around Chrome's little problem
    $this.mouseup(function() {
        // Prevent further mouseup intervention
        $this.unbind("mouseup");
        return false;
    });
});

10
Tôi nghĩ sẽ tốt hơn khi triển khai công cụ này bằng cách sử dụng nút "chọn tất cả văn bản" riêng vì việc tự động chọn văn bản trên tiêu điểm hoặc nhấp vào các sự kiện thực sự gây khó chịu.
RobG

2
Điều này không thành công với tôi trong Chrome, giải pháp hoạt động là: stackoverflow.com/a/6201757/126600
zack

@zack: Ví dụ jsFiddle trong câu trả lời này hoạt động với tôi trong Chrome. Nó không dành cho bạn? Tôi đồng ý câu trả lời mà bạn liên kết đến là hoàn hảo hơn.
Tim Down

@TimDown: bạn nói đúng, tôi đã quá nhiệt tình - thực sự nó hoạt động chính xác trên 'click', nhưng không thành công nếu bạn tabvào textarea - giải pháp khác của bạn hoạt động cho cả hai trường hợp :)
zack

Thay đổi mã ở trên một chút và nó sẽ hoạt động như một bùa mê .. $("#foo").mouseup(function() { $("#foo").unbind("mouseup"); return false; }); bạn cần tham khảo hộp văn bản mà không cần sử dụng thischỉ giới thiệu với đường dẫn đầy đủ .. và nó sẽ hoạt động ..
pratikabu

14

Cách tốt hơn, với giải pháp cho vấn đề tab và chrome và cách jquery mới

$("#element").on("focus keyup", function(e){

        var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
        if(keycode === 9 || !keycode){
            // Hacemos select
            var $this = $(this);
            $this.select();

            // Para Chrome's que da problema
            $this.on("mouseup", function() {
                // Unbindeamos el mouseup
                $this.off("mouseup");
                return false;
            });
        }
    });

11

Tôi đã kết thúc bằng cách sử dụng này:

$('.selectAll').toggle(function() {
  $(this).select();
}, function() {
  $(this).unselect();
});

nhưng tôi không biết cách kiểm tra xem văn bản đã được chọn chưa, vì vậy tôi có thể đảo ngược hai hành động :(
Alex

1
@Alex: Tôi sẽ không gây rối quá nhiều với điều này nếu tôi là bạn. Người dùng mong đợi hành vi tiêu chuẩn từ textareas.
Tim Down

không, văn bản đặc biệt này chỉ có nghĩa là để sao chép-dán. tất cả văn bản tôi có bên trong nó là một chuỗi được mã hóa lớn, chỉ có thể được thay thế hoàn toàn hoặc được sao chép vào bảng tạm
Alex

@Alex: À, đúng rồi. Bạn có thể muốn làm cho nó chỉ đọc bằng cách thêm readonlythuộc tính sau đó.
Tim Down

1
@Hollister: Không, người dùng hoặc tập lệnh hoàn toàn có thể chọn nội dung trong div. Có lẽ bạn đang nghĩ đến việc sao chép vào bảng tạm, điều không thể có trong tập lệnh mà không có thư viện dựa trên Flash như ZeroClipboard.
Tim Down

6
$('textarea').focus(function() {
    this.select();
}).mouseup(function() {
    return false;
});

5

Phiên bản jQuery ngắn hơn một chút:

$('your-element').focus(function(e) {
  e.target.select();
  jQuery(e.target).one('mouseup', function(e) {
    e.preventDefault();
  });
});

Nó xử lý trường hợp góc Chrome chính xác. Xem http://jsfiddle.net/Ztyx/XMkwm/ để biết ví dụ.


4

Chọn văn bản trong một yếu tố (gần giống với tô sáng bằng chuột của bạn)

:)

Sử dụng câu trả lời được chấp nhận trên bài đăng đó, bạn có thể gọi hàm như thế này:

$(function() {
  $('#textareaId').click(function() {
    SelectText('#textareaId');
  });
});

Có lẽ đánh dấu câu hỏi này là một bản sao có thể hữu ích hơn? Đó thực sự không phải là câu trả lời của bạn, vì vậy tốt hơn là nên hợp nhất hai câu hỏi.
Máy xay sinh tố

Đồng ý - Mặc dù OP có thể hưởng lợi từ lời giải thích bổ sung cho việc triển khai của cô. :)
Todd

Câu hỏi đó liên quan đến việc làm nổi bật văn bản trong một yếu tố, không phải là một văn bản. Hai người khá khác nhau.
Tim Down

cảm ơn, tôi phát hiện ra rằng tôi có thể làm điều này với $(this).select(), tôi sẽ sử dụng nó vì nó ít mã hơn :)
Alex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.