Chọn tất cả nội dung của hộp văn bản khi nhận được tiêu điểm (Vanilla JS hoặc jQuery)


311

Giải pháp Vanilla JS hoặc jQuery sẽ chọn tất cả nội dung của hộp văn bản khi hộp văn bản nhận được tiêu điểm là gì?



3
@gdoron vì một số lý do liên kết chuyển hướng đến câu hỏi này.
Kẻ hủy diệt


Vấn đề với hầu hết các giải pháp này là chúng không hoạt động chính xác khi thay đổi vị trí con trỏ trong trường đầu vào. Hãy xem câu trả lời của tôi ở đây: stackoverflow.com/a/20826207/641452
Colin Breame

Câu trả lời:


370
$(document).ready(function() {
    $("input:text").focus(function() { $(this).select(); } );
});

23
Ngoài ra, chỉ để biết thêm thông tin: "input [type = text]" bây giờ có thể là "input: text" liên quan
Ricardo Vega

8
Điều này dường như không hoạt động đối với tôi trên Chrome và trang web jQuery nói rằng nó phụ thuộc vào trình duyệt. Bất cứ ai khác có thể xác minh?
Kenny Wyland

71
Có vẻ như các trình duyệt WebKit can thiệp vào điều này vì sự kiện mouseup. Tôi đã thêm cái này và nó hoạt động: $ ('input: text'). Mouseup (function (e) {return false;});
Kenny Wyland

5
Kenny là chính xác, nhưng thật không may, 'mouseup' cũng ảnh hưởng đến các điều khiển spinner của Chrome. Kích hoạt tắt 'nhấp chuột' thay vì 'tập trung' dường như giải quyết điều đó
Richard Kennard

24
Tôi sử dụng như thế này: $ ("input: text"). Select (). Focus ();
Phương

227

<input type="text" onfocus="this.select();" onmouseup="return false;" value="test" />


43
+ onmouseup = "return false" để dừng bỏ chọn khi nhấp
Anthony Johnston

2
+1 cho một số loại stopEvent cho mouseup, hoặc điều này không hoạt động đáng tin cậy. Nhược điểm của việc đó là một khi con trỏ ở trong trường, nhấp vào đâu đó trong văn bản đã chọn để định vị con trỏ ở đó không hoạt động; nhấp chuột được vô hiệu hóa hiệu quả. Tuy nhiên, đối với các tình huống lựa chọn toàn bộ văn bản tập trung là mong muốn, có lẽ đó là ít tệ hơn của hai tệ nạn.
ban hành

Tôi đã có thể phần nào khắc phục được vấn đề được nêu ra bằng cách đặt ra một biến toàn cục doMouseUp thành false, trong sự kiện onMouseDown, nếu điều này! = Document.activeEuity. Sau đó, trong khi onMouseUp, đặt lại doMouseUp thành true và trả về giá trị doMouseUp trước khi bạn đặt lại. Điều này đang trở nên phức tạp và cần mã - tôi sẽ đăng câu trả lời giải thích rõ hơn.
Travis

1
KHÔNG thêm onmouseup="return false;"nếu bạn muốn người dùng có thể tự do lựa chọn và chỉnh sửa văn bản sau khi lấy nét bên trong hộp văn bản. Với mã này, văn bản sẽ bị khóa trong tình huống "chọn tất cả" và người dùng sẽ không thể chỉnh sửa trừ khi người dùng nhập văn bản mới hoặc sử dụng các phím mũi tên để di chuyển. Thành thật mà nói, điều này cảm thấy giống như một hành vi rất kỳ lạ và sẽ không có ý nghĩa trừ khi hộp văn bản được dự định là vĩnh viễn không thể chỉnh sửa (và do đó bị vô hiệu hóa).
ADTC

1
Về mặt kỹ thuật, bạn không cần onmouseup="return false;"nếu bạn chỉ muốn lựa chọn xảy ra khi người dùng nhấp lần đầu hoặc tab. Và +1 cho javascript vanilla!
clabe45

42
$(document).ready(function() {
  $("input[type=text]").focus().select();
});

3
Đã xác nhận. Câu trả lời được bình chọn / chấp nhận cao nhất hiện tại dường như không hoạt động đối với Chrome.
Aron Boyette

39
$(document).ready(function() {
    $("input:text")
        .focus(function () { $(this).select(); } )
        .mouseup(function (e) {e.preventDefault(); });
});

1
Điều này là tốt Cảm ơn! Nhận xét bằng cách đưa ra câu trả lời của Zach đưa ra một nhược điểm của việc ngăn chặn mouseupsự kiện mặc định của sự kiện: "một khi con trỏ ở trong trường, nhấp vào đâu đó trong văn bản đã chọn để định vị con trỏ ở đó không hoạt động; nhấp chuột bị vô hiệu hóa. tình huống lựa chọn toàn bộ văn bản tập trung là mong muốn, có lẽ đó là ít tệ hơn của hai tệ nạn. "
JohnK

25

jQuery không phải là JavaScript dễ sử dụng hơn trong một số trường hợp.

Nhìn vào ví dụ này:

<textarea rows="10" cols="50" onclick="this.focus();this.select()">Text is here</textarea>

Nguồn: Thủ thuật CSS , MDN


7
Có lẽ điều đó ổn nếu bạn không nhớ việc đánh dấu và mã của mình bị lẫn lộn; ngày nay hầu hết mọi người cố gắng giữ cho kịch bản của họ 'không phô trương'. Ồ ... và jQuery Javascript.
Andrew Barber

2
Cảm ơn lời đề nghị của onclick, hoạt động tuyệt vời. Không phải ai cũng sử dụng jQuery nên rất vui khi thấy một tùy chọn khác.
Lukus

điều này giả sử người dùng chỉ sử dụng chuột
pcnate

có thể sử dụng onf Focus = "this.f Focus (); this.select ()" cho bàn phím
Muhammad Nadeem

21

Đây không chỉ là sự cố Chrome / Safari, tôi đã trải nghiệm một hành vi khá giống với Firefox 18.0.1. Điều thú vị là điều này không xảy ra trên MSIE! Vấn đề ở đây là sự kiện mouseup đầu tiên buộc phải bỏ chọn nội dung đầu vào, vì vậy chỉ cần bỏ qua sự xuất hiện đầu tiên.

$(':text').focus(function(){
    $(this).one('mouseup', function(event){
        event.preventDefault();
    }).select();
});

Cách tiếp cận timeOut gây ra một hành vi lạ và chặn mọi sự kiện mouseup bạn không thể xóa lựa chọn nhấp lại vào phần tử đầu vào.


1
+1 cho việc sử dụng một để ngăn chặn một lần di chuột. Tôi thực sự không thích không thể chọn văn bản bằng chuột sau lần nhấp đầu tiên.
Pluc

13

HTML:

Enter Your Text : <input type="text" id="text-filed" value="test">

Sử dụng JS:

var textFiled = document.getElementById("text-filed");
textFiled.addEventListener("focus", function() { this.select(); });

Sử dụng JQuery:

$("#text-filed").focus(function() { $(this).select(); } );

Sử dụng React JS:

Trong thành phần tương ứng bên trong chức năng kết xuất -

<input
  type="text"
  value="test"
  onFocus={e => e.target.select()}
/>

2
Điều này làm việc cho tôi trong React:onFocus={(e) => e.target.select()}
Paito

11

Giải pháp của tôi là sử dụng thời gian chờ. Có vẻ hoạt động tốt

$('input[type=text]').focus(function() {
    var _this = this;
    setTimeout(function() {
        _this.select();
    }, 10);
});

Đây là giải pháp tôi sử dụng và thích. Tôi sử dụng giá trị thời gian chờ là 0 vì điều đó sẽ khiến nó được thêm vào cuối hàng đợi sự kiện hiện tại, điều đó có nghĩa là nó sẽ chạy sau sự kiện "mouseup".
DavidM


4

Tôi biết mã nội tuyến là kiểu xấu, nhưng tôi không muốn đưa mã này vào tệp .js. Hoạt động mà không cần jQuery!

<input type="text" value="blah blah" onfocus="this.select(); this.selAll=1;" onmouseup="if(this.selAll==0) return true; this.selAll=0; return false;"></input>

3

Các câu trả lời ở đây đã giúp tôi đạt đến một điểm, nhưng tôi gặp vấn đề với các trường nhập số HTML5 khi nhấp vào nút lên / xuống trong Chrome.

Nếu bạn nhấp vào một trong các nút và để chuột qua nút, số sẽ tiếp tục thay đổi như thể bạn đang giữ nút chuột vì chuột bị vứt đi.

Tôi đã giải quyết điều này bằng cách gỡ bỏ trình xử lý mouseup ngay khi nó được kích hoạt như dưới đây:

    $("input:number").focus(function () {
        var $elem = $(this);
        $elem.select().mouseup(function (e) {
            e.preventDefault();
            $elem.unbind(e.type);
        });
    });

Hy vọng điều này sẽ giúp mọi người trong tương lai ...


Dây thừng. u đang đưa ra một giải pháp cho một vấn đề tự tạo. Nếu bạn nhìn đúng vào câu trả lời, chúng chỉ ràng buộc mouseupvới các trường nhập văn bản chứ không phải numbers. Do đó, vấn đề này không nên đến
Om Shankar

Vấn đề với mouseup ràng buộc là nó can thiệp khi di chuyển con trỏ trong trường. Đây là một giải pháp tốt hơn, nhưng nếu bạn tab vào trường, thì mousedown tiếp theo sẽ bị mất (và người dùng sẽ không thể di chuyển con trỏ bằng chuột). Điều đó tốt hơn là mất tất cả mousedowns!
Colin Breame

3

Điều này sẽ làm việc, Hãy thử cái này -

<input id="textField1" onfocus="this.select()" onmouseup="return false" /> 

Hoạt động trong Safari / IE 9 và Chrome, mặc dù tôi không có cơ hội thử nghiệm trên Firefox.


3

Tôi biết đã có rất nhiều câu trả lời ở đây - nhưng câu trả lời này cho đến nay vẫn còn thiếu; một giải pháp cũng hoạt động với nội dung được tạo ajax:

$(function (){
    $(document).on("focus", "input:text", function() { 
        $(this).select(); 
    });
});

2

Tôi đã có thể cải thiện một chút câu trả lời của Zach bằng cách kết hợp một vài cuộc gọi chức năng. Vấn đề với câu trả lời đó là nó vô hiệu hóa hoàn toàn trênMouseUp, do đó ngăn bạn nhấp xung quanh trong hộp văn bản một khi nó tập trung.

Đây là mã của tôi:

<input type="text" onfocus="this.select()" onMouseUp="javascript:TextBoxMouseUp();" onMouseDown="javascript:TextBoxMouseDown();" />

<script type="text/javascript">
    var doMouseUp = true;
    function TextBoxMouseDown() {
        doMouseUp = this == document.activeElement;
        return doMouseUp;
    }
    function TextBoxMouseUp() {
        if (doMouseUp)
        { return true; }
        else {
            doMouseUp = true;
            return false;
        }
    }
</script>

Đây là một cải tiến nhỏ so với câu trả lời của Zach. Nó hoạt động hoàn hảo trong IE, hoàn toàn không hoạt động trong Chrome và hoạt động với thành công xen kẽ trong FireFox (nghĩa đen là mọi lúc). Nếu ai đó có ý tưởng về cách làm cho nó hoạt động đáng tin cậy trong FF hoặc Chrome, vui lòng chia sẻ.

Dù sao, tôi hình dung tôi sẽ chia sẻ những gì tôi có thể để làm cho nó đẹp hơn một chút.


Có một lỗi trong mã của bạn - phương thức thứ hai nên được gọi là "TextBoxMouseUp". Hãy xem câu trả lời của tôi trong đó sử dụng một cách tiếp cận tương tự.
Colin Breame

1
Cần lưu ý rằng onMouseUp=""onMouseDown=""không phải là tiêu chuẩn w3 chính xác. Họ nên onmouseup=""onmousedown="". Cũng như các thuộc tính html khác, chúng nên được viết bằng chữ thường không phải trong trường hợp lạc đà.
Đã vẽ

2

Giống như @Travis và @Mari, tôi muốn tự động chọn khi người dùng nhấp vào, có nghĩa là ngăn hành vi mặc định của mouseupsự kiện, nhưng không ngăn người dùng nhấp xung quanh. Giải pháp tôi đưa ra, hoạt động trong IE11, Chrome 45, Opera 32 và Firefox 29 (đây là những trình duyệt tôi hiện đã cài đặt), dựa trên chuỗi các sự kiện liên quan đến một cú click chuột.

Khi bạn nhấp vào một kiểu nhập văn bản không có tiêu điểm, bạn sẽ nhận được các sự kiện này (trong số các sự kiện khác):

  • mousedown: Đáp lại nhấp chuột của bạn. Tăng xử lý mặc địnhfocus nếu cần thiết và bắt đầu lựa chọn.
  • focus: Là một phần của việc xử lý mặc định của mousedown .
  • mouseup: Việc hoàn thành nhấp chuột của bạn, có xử lý mặc định sẽ đặt kết thúc lựa chọn.

Khi bạn bấm vào một kiểu nhập văn bản đã có tiêu điểm, focussự kiện sẽ bị bỏ qua. Vì @Travis và @Mari đều chú ý một cách khéo léo, việc xử lý mặc định các mouseupnhu cầu chỉ được ngăn chặn nếu focussự kiện xảy ra. Tuy nhiên, vì không có "focus sự kiện "không xảy ra", chúng ta cần suy ra điều này, điều chúng ta có thể làm trong phần mousedownxử lý.

Giải pháp @ Mari's yêu cầu jQuery được nhập, điều mà tôi muốn tránh. Giải pháp của @ Travis thực hiện điều này bằng cách kiểm tra document.activeElement. Tôi không biết tại sao chính xác giải pháp của anh ấy không hoạt động trên các trình duyệt, nhưng có một cách khác để theo dõi liệu đầu vào văn bản có tập trung hay không: chỉ cần làm theofocusblur sự kiện sự kiện.

Đây là mã làm việc cho tôi:

    var blockMouseUp = false;
    var customerInputFocused = false;

    txtCustomer.onfocus =
      function ()
      {
        try
        {
          txtCustomer.selectionStart = 0;
          txtCustomer.selectionEnd = txtCustomer.value.length;
        }
        catch (error)
        {
          txtCustomer.select();
        }

        customerInputFocused = true;
      };

    txtCustomer.onblur =
      function ()
      {
        customerInputFocused = false;
      };

    txtCustomer.onmousedown =
      function ()
      {
        blockMouseUp = !customerInputFocused;
      };

    txtCustomer.onmouseup =
      function ()
      {
        if (blockMouseUp)
          return false;
      };

Tôi hy vọng điều này là giúp đỡ cho một ai đó. :-)


+1 Cảm ơn, nhưng làm thế nào điều này có thể được viết lại để bạn không mã hóa điều khiển 'txtCustomer' vào tập lệnh? Có cách nào để truyền lại một đối tượng 'này' không?
Fandango68

Một cách sẽ là tạo một hàm tiện ích để áp dụng hành vi cho bất kỳ phần tử nào, được truyền vào dưới dạng tham số. Trong hàm đó, tham chiếu phần tử sẽ được mã hóa cứng - đến tham số. Sau đó, bạn có thể gọi nó trên bất kỳ số lượng phần tử đầu vào nào, được xác định bằng bất kỳ phương tiện nào bạn có theo ý của bạn. :-)
Jonathan Gilbert

Xin lỗi tôi là một người mới. Bạn có thể vui lòng cập nhật câu trả lời của bạn với một ví dụ? Cảm ơn
Fandango68

1
Chỉ cần bọc mã tôi đã viết trong một khai báo hàm có tham số gọi là "txtCustomer". Tôi khuyên bạn nên đổi tên "txtCustomer" thành một cái gì đó khác, nhưng nếu bạn không tự tin khi làm điều đó, về mặt kỹ thuật nó sẽ hoạt động với biến có tên là "txtCustomer". Điều đó có nghĩa là: hàm MakeTextBoxAutoSelect (txtCustomer) { những gì tôi đã viết ở trên }
Jonathan Gilbert


1

Giải pháp JavaScript hoặc jQuery sẽ chọn tất cả nội dung của hộp văn bản khi hộp văn bản nhận được tiêu điểm là gì?

Bạn chỉ cần thêm thuộc tính sau:

onfocus="this.select()"

Ví dụ:

<input type="text" value="sometext" onfocus="this.select()">

(Thành thật mà nói tôi không biết tại sao bạn lại cần bất cứ thứ gì khác.)


1

Điều này làm việc cho tôi (đăng vì nó không phải trong câu trả lời nhưng trong một bình luận)

 $("#textBox").focus().select();

0
$('input').focus(function () {
    var self = $(this);
    setTimeout(function () {
        self.select();
    }, 1);        
});

Chỉnh sửa: Yêu cầu của Per @ DavidG, tôi không thể cung cấp chi tiết vì tôi không chắc tại sao điều này hoạt động, nhưng tôi tin rằng nó có liên quan đến sự kiện tập trung truyền lên hoặc xuống hoặc bất cứ điều gì và yếu tố đầu vào nhận thông báo nó đã nhận được trọng tâm. Đặt thời gian chờ sẽ cho phần tử một chút thời gian để nhận ra nó đã được thực hiện.


Vui lòng giải thích câu trả lời của bạn thay vì chỉ dán trong một số mã.
DavidG

0

Nếu bạn xâu chuỗi các sự kiện lại với nhau, tôi tin rằng nó sẽ loại bỏ nhu cầu sử dụng .one như được đề xuất ở những nơi khác trong chuỗi này.

Thí dụ:

$('input.your_element').focus( function () {
    $(this).select().mouseup( function (e) {
        e.preventDefault();
    });
});

0

Lưu ý: Nếu bạn đang lập trình trong ASP.NET, bạn có thể chạy tập lệnh bằng ScriptManager.RegisterStartupScript trong C #:

ScriptManager.RegisterStartupScript(txtField, txtField.GetType(), txtField.AccessKey, "$('#MainContent_txtField').focus(function() { $(this).select(); });", true );

Hoặc chỉ cần nhập tập lệnh trong trang HTML được đề xuất trong các câu trả lời khác.


Câu hỏi không có ASP.NET ở bất cứ đâu. : |
Mohamed Thaufeeq

Đúng, tôi đã đăng bài này chỉ trong trường hợp lập trình viên đang sử dụng ASP.NET. Nó có thể hữu ích cho ai đó đang tìm kiếm câu trả lời bằng cách sử dụng khung (vì điều này đã giúp tôi). Tôi chỉ chia sẻ và hy vọng ai đó sẽ thấy nó hữu ích.
Exel Gamboa

Chỉ trong trường hợp lập trình viên đang sử dụng ASP.NET, anh ta sẽ thêm thẻ 'asp.net' vào câu hỏi. : |
Mohamed Thaufeeq

0

Tôi gieo cái này ở đâu đó, làm việc hoàn hảo!

            $('input').on('focus', function (e) {
                $(this)
                $(element).one('mouseup', function () {
                        $(this).select();
                        return false;
                    })                        .select();
            });

0

Tôi đến dự tiệc muộn, nhưng điều này hoạt động hoàn hảo trong IE11, Chrome, Firefox, mà không làm rối tung mouseup (và không có JQuery).

inputElement.addEventListener("focus", function (e) {
    var target = e.currentTarget;
    if (target) {
        target.select();
        target.addEventListener("mouseup", function _tempoMouseUp(event) {
            event.preventDefault();
            target.removeEventListener("mouseup", _tempoMouseUp);
        });
    }
});

đúng nhưng nếu bạn focusbằng cách lập bảng vào trường, bạn sẽ tìm thấy nhiều người nghe sự kiện mouseup đính kèm ...
Sebastian Scholle

-1

Giải pháp của tôi là tiếp theo:

var mouseUp;
$(document).ready(function() {
    $(inputSelector).focus(function() {
        this.select();
    }) 
    .mousedown(function () {
        if ($(this).is(":focus")) {
          mouseUp = true;
        }
        else {
          mouseUp = false;
        }
     })
     .mouseup(function () {
        return mouseUp;
     });
});

Vì vậy, mouseup sẽ hoạt động thường xuyên, nhưng sẽ không bỏ chọn sau khi lấy nét bằng đầu vào

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.