đầu vào jquery chọn tất cả vào trọng tâm


325

Tôi đang sử dụng mã này để thử và chọn tất cả văn bản trong trường khi người dùng tập trung vào trường. Điều gì xảy ra là, nó chọn tất cả trong một giây, sau đó nó không được chọn và con trỏ gõ được để lại nơi tôi nhấp ...

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

Tôi muốn tất cả vẫn được chọn.


Trình duyệt nào, có vẻ như nó hoạt động tốt với tôi trong FF?
R0MANARMY

8
Chrome = thất bại cho lần này
wowo_999

1
Tôi đã sử dụng Chrome, nhưng .click () giải quyết vấn đề :)
Tim

4
Lưu ý: Câu trả lời được chấp nhận ở đây chỉ giải quyết được một nửa vấn đề. Nó làm cho công việc chọn, nhưng gây khó khăn cho việc bỏ chọn nó với các lần nhấp tiếp theo. Một giải pháp tốt hơn có thể được tìm thấy ở đây: stackoverflow.com/questions/3380458/iêu
SDC

Câu trả lời:


480

Hãy thử sử dụng clickthay vì focus. Nó dường như hoạt động cho cả chuột và các sự kiện chính (ít nhất là trên Chrome / Mac):

jQuery <phiên bản 1.7:

$("input[type='text']").click(function () {
   $(this).select();
});

Phiên bản jQuery 1.7+:

$("input[type='text']").on("click", function () {
   $(this).select();
});

Đây là một bản demo


62
vấn đề là bạn không thể chọn thêm một phần văn bản bằng chuột, một khi nhấp chuột xảy ra, toàn văn được chọn.
Helin Wang

6
Không phải là một giải pháp khả thi cho tôi. Điều này tạo ra vấn đề được mô tả bởi Wang.
Marquez

1
Có một giải pháp dưới đây của Nianpeng cũng hoạt động với lựa chọn văn bản chuột.
Philibert Perusse

4
@AwQiruiGuo $ .fn.on ('click', ..) có thể sử dụng ít bộ nhớ hơn và hoạt động cho các phần tử con được thêm động.
Ricky Boyce

7
Điều này không hoạt động để tập trung một lĩnh vực khi tab.
Colin Breame

65

Tôi nghĩ rằng những gì xảy ra là thế này:

focus()
   UI tasks related to pre-focus
   callbacks
       select()
   UI tasks related to focus (which unselect again)

Một cách giải quyết có thể đang gọi select () không đồng bộ, để nó chạy hoàn toàn sau khi lấy nét ():

$("input[type=text]").focus(function() { 
    var save_this = $(this);
    window.setTimeout (function(){ 
       save_this.select(); 
    },100);
});

3
$ ("input [type = text]"). Focus (function () {var save_this = $ (this); window.setTimeout (function () {save_this.select ();}, 100);});
etienne

@etienne: Ồ, điểm tốt: việc xử lý thislà một chút bất ngờ trong phạm vi như vậy. Tôi sẽ cập nhật mã.
Piskvor rời khỏi tòa nhà

3
giá trị thời gian chờ là 0 cũng có vẻ ổn và hàm "Focusin ()" cũng hoạt động với phương thức này.
Tanguy

4
có, bạn thậm chí không cần thiết lập một khoảng thời gian. 0 sẽ hoạt động tốt vì thời gian chờ chạy ở cuối ngăn xếp cuộc gọi hiện tại. điều này có nghĩa là tập trung và nhấp vào tất cả các sự kiện, và sau đó chức năng của bạn chạy
Joshua Bambrick

1
Hết giờ 0 dường như có vấn đề là sự kiện 'nhấp chuột' có thể phát trong khung sau, bỏ chọn lại hộp. Tôi thấy rằng thời gian chờ 10 dường như hoạt động khá tốt - không có độ trễ đáng chú ý, nhưng đáng tin cậy hơn 0.
philh

57

Tôi nghĩ rằng đây là giải pháp tốt hơn. Không giống như chỉ chọn trong sự kiện onclick, nó không ngăn việc chọn / chỉnh sửa văn bản bằng chuột. Nó hoạt động với các công cụ kết xuất chính bao gồm IE8.

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

http://jsfiddle.net/25Mab/9/


4
Điều này chỉ hoạt động cho các trường hiện có, đây là bản cập nhật để liên kết nó với các trường đầu vào mới: jsfiddle.net
adriaan

Đôi khi sự tập trung có thể được đưa ra mà không cần một cú nhấp chuột, và điều này xử lý nó tốt. Do đó, đây là câu trả lời rõ ràng nhất - mặc dù có thể có một số người nghe sự kiện lơ lửng mỗi khi đầu vào được tập trung và không phải bằng một cú nhấp chuột ... tốt hơn nhiều so với setTimeout
ilovett

Điều này không cho phép nhấp chuột thứ hai trong các đầu vào số để chọn một phần khác của văn bản bằng chuột. Loại bỏ thứ hai select()dường như làm việc mặc dù.
dperish

Thậm chí tốt hơn với một bổ sung$('input[autofocus]').select();
Daniel Bleisteiner

38

Có một số câu trả lời hợp lý ở đây và @ user2072367 là sở thích của tôi, nhưng nó có một kết quả không mong muốn khi bạn tập trung qua tab thay vì qua nhấp chuột. (kết quả không mong muốn: để chọn văn bản bình thường sau khi lấy nét qua tab, bạn phải nhấp thêm một lần nữa)

Fiddle này sửa lỗi nhỏ đó và lưu trữ $ (cái này) trong một biến để tránh lựa chọn DOM dư thừa. Kiểm tra nó ra! (

Đã thử nghiệm trong IE> 8

$('input').on('focus', function() {
    var $this = $(this)
        .one('mouseup.mouseupSelect', function() {
            $this.select();
            return false;
        })
        .one('mousedown', function() {
            // compensate for untriggered 'mouseup' caused by focus via tab
            $this.off('mouseup.mouseupSelect');
        })
        .select();
});

2
+1 giải pháp của bạn và @ user2072367 là sạch nhất trong toàn bộ chủ đề này và tôi ước có một cách để nhanh chóng lên top nhanh nhất.
KyleMit

1
Thậm chí hoạt động nếu người dùng cố gắng tự chọn tất cả các văn bản, bravo.
Vitani

Đối với tôi điều này không hoạt động trên eg11 trên windows 8.1. Nó hoạt động trong eg11 trên windows 7 và trên windows 10
Lars Thomas Bredland

1
@LarsThomasBredland Tôi vừa thử trên win 8.1 + eg11 và nó hoạt động như mong đợi. Điều gì "không hoạt động" về nó cho bạn?
animatedgif

Nó chỉ không chọn bất cứ điều gì. (Tôi đã thử nghiệm trên một chiếc win8 khác và nó hoạt động ở đó - cùng cấp độ os và phiên bản tức là)
Lars Thomas Bredland

21

Sau khi xem xét cẩn thận, tôi đề xuất đây là một giải pháp sạch hơn trong chủ đề này:

$("input").focus(function(){
    $(this).on("click.a keyup.a", function(e){      
        $(this).off("click.a keyup.a").select();
    });
});

Bản trình diễn trong jsFiddle

Vấn đề:

Dưới đây là một chút giải thích:

Trước tiên, hãy xem thứ tự các sự kiện khi bạn di chuột hoặc tab vào một trường.
Chúng tôi có thể đăng nhập tất cả các sự kiện có liên quan như thế này:

$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
              function(e) { console.log(e.type); });

sự kiện tập trung

Lưu ý : Tôi đã thay đổi giải pháp này để sử dụng clickthay mouseupvì nó xảy ra sau đó trong đường ống sự kiện và dường như gây ra một số vấn đề trong firefox theo nhận xét của @ Jocie

Một số trình duyệt cố gắng định vị con trỏ trong mouseuphoặc clicksự kiện. Điều này có ý nghĩa vì bạn có thể muốn bắt đầu dấu mũ ở một vị trí và kéo qua để tô sáng một số văn bản. Nó không thể chỉ định vị trí dấu mũ cho đến khi bạn thực sự nhấc chuột. Vì vậy, các chức năng xử lý focusđược định mệnh phản hồi quá sớm, khiến trình duyệt ghi đè lên vị trí của bạn.

Nhưng điều khó khăn là chúng tôi thực sự muốn xử lý sự kiện tập trung. Nó cho chúng tôi biết lần đầu tiên có người vào trường. Sau thời điểm đó, chúng tôi không muốn tiếp tục ghi đè hành vi lựa chọn của người dùng.

Giải pháp:

Thay vào đó, trong focustrình xử lý sự kiện, chúng ta có thể nhanh chóng đính kèm người nghe cho các sự kiện click(nhấp vào) và keyup(tab trong) sắp diễn ra.

Lưu ý : Keyup của một sự kiện tab sẽ thực sự kích hoạt trong trường đầu vào mới, không phải trường hợp trước đó

Chúng tôi chỉ muốn bắn sự kiện một lần. Chúng tôi có thể sử dụng .one("click keyup), nhưng điều này sẽ gọi trình xử lý sự kiện một lần cho mỗi loại sự kiện . Thay vào đó, ngay khi nhấn chuột hoặc gõ phím, chúng tôi sẽ gọi chức năng của chúng tôi. Điều đầu tiên chúng ta sẽ làm là loại bỏ các trình xử lý cho cả hai. Bằng cách đó, sẽ không có vấn đề gì cho dù chúng tôi đã gắn thẻ hoặc kết nối. Hàm sẽ thực thi chính xác một lần.

Lưu ý : Hầu hết các trình duyệt tự nhiên chọn tất cả văn bản trong một sự kiện tab, nhưng như hoạt hình đã chỉ ra , chúng tôi vẫn muốn xử lý keyupsự kiện, nếu không mouseupsự kiện sẽ vẫn còn tồn tại bất cứ lúc nào chúng tôi đã đăng nhập. Chúng tôi lắng nghe cả hai để chúng tôi có thể bật tắt người nghe ngay khi chúng tôi xử lý lựa chọn.

Bây giờ, chúng tôi có thể gọi select()sau khi trình duyệt đã chọn, vì vậy chúng tôi chắc chắn sẽ ghi đè hành vi mặc định.

Cuối cùng, để bảo vệ thêm, chúng ta có thể thêm các không gian tên sự kiện vào các hàm mouseupvà các keyuphàm để .off()phương thức không loại bỏ bất kỳ trình nghe nào khác có thể đang phát.


Đã thử nghiệm trong IE 10+, FF 28+ và Chrome 35+


Ngoài ra, nếu bạn muốn mở rộng jQuery với một hàm được gọi oncesẽ chạy chính xác một lần cho bất kỳ số lượng sự kiện nào :

$.fn.once = function (events, callback) {
    return this.each(function () {
        var myCallback = function (e) {
            callback.call(this, e);
            $(this).off(events, myCallback);
        };
        $(this).on(events, myCallback);
    });
};

Sau đó, bạn có thể đơn giản hóa mã hơn nữa như thế này:

$("input").focus(function(){
    $(this).once("click keyup", function(e){      
        $(this).select();
    });
});

Demo trong fiddle


Trong Firefox 31 trên Windows, mã của bạn chỉ chọn văn bản trên mỗi lần nhấp khác khi bạn nhấp vào giữa hai hộp văn bản
Vitani

1
@Jocie, tôi không chắc tại sao nó lại xen kẽ, nhưng có vẻ như FF xử lý việc lựa chọn văn bản trong trường clickhợp nằm sâu hơn đường ống hơn mouseup. Vì chúng tôi muốn xử lý kết thúc lựa chọn càng sớm càng tốt để cung cấp cho chúng tôi nhiều cơ hội nhất để ghi đè trình duyệt, sử dụng nhấp chuột thay vì mouseup nên thực hiện thủ thuật. Đã thử nghiệm trong FF, Chrome và IE.
KyleMit

1
Cảm ơn bạn! Cuối cùng là một giải pháp thực sự hoạt động và trong tất cả các trình duyệt!
Vincent

1
Đúng! Điều này làm việc cho tôi quá! Cảm ơn bạn. Đây phải là câu trả lời chính thức
Fandango68

1
@RiZKiT, onesẽ không cắt nó thành "Trình xử lý được thực thi một lần cho mỗi phần tử cho mỗi loại sự kiện . Nó sẽ tự động tắt sự kiện đã kích hoạt nó, nhưng phần còn lại sẽ vẫn còn tồn tại và offquan tâm đến cả hai. câu hỏi: chức năng sẽ kích hoạt chính xác một lần cho bất kỳ số lượng sự kiện nào
KyleMit

13

Điều này sẽ thực hiện công việc và tránh vấn đề bạn không còn có thể chọn một phần của văn bản bằng chuột.

$("input[type=text]").click(function() {
    if(!$(this).hasClass("selected")) {
        $(this).select();
        $(this).addClass("selected");
    }
});
$("input[type=text]").blur(function() {
    if($(this).hasClass("selected")) {
        $(this).removeClass("selected");
    }
});

1
Quan trọng để giữ khả năng chọn một phần của văn bản bằng chuột. Tôi đang sử dụng cái này và A1
Philibert Perusse

2
Quá nhiều thứ đang diễn ra ở đây, hãy sử dụng giải pháp lấy nét / tập trung
George

@George user2072367 là khá tốt, nhưng nó có một số sai sót nghiêm trọng. Kiểm tra giải pháp của tôi (:
animatedgif

6

Phiên bản này hoạt động trên ios và cũng sửa lỗi kéo để chọn tiêu chuẩn trên chrome chrome

var srcEvent = null;

$("input[type=text],input[type=number]")

    .mousedown(function (event) {
        srcEvent = event;
    })

    .mouseup(function (event) {
        var delta = Math.abs(event.clientX - srcEvent.clientX) 
                  + Math.abs(event.clientY - srcEvent.clientY);

        var threshold = 2;
        if (delta <= threshold) {
                   try {
                        // ios likes this but windows-chrome does not on number fields
                        $(this)[0].selectionStart = 0;
                        $(this)[0].selectionEnd = 1000;
                    } catch (e) {
                        // windows-chrome likes this
                        $(this).select();
                    }
        }
    });

http://jsfiddle.net/Zx2sc/2/


Đã chỉnh sửa để thêm thử / bắt xấu xí để xoa dịu trình duyệt
anihilnine

5

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.

Sự onmouseupkiện thay đổi vị trí con trỏ trong trường, được kích hoạt sau onfocus(ít nhất là trong Chrome và FF). Nếu bạn loại bỏ vô điều kiện mouseupthì người dùng không thể thay đổi vị trí con trỏ bằng chuột.

function selectOnFocus(input) {
    input.each(function (index, elem) {
        var jelem = $(elem);
        var ignoreNextMouseUp = false;

        jelem.mousedown(function () {
            if (document.activeElement !== elem) {
                ignoreNextMouseUp = true;
            }
        });
        jelem.mouseup(function (ev) {
            if (ignoreNextMouseUp) {
                ev.preventDefault();
                ignoreNextMouseUp = false;
            }
        });
        jelem.focus(function () {
            jelem.select();
        });
    });
}
selectOnFocus($("#myInputElement"));

Mã sẽ có điều kiện ngăn chặn mouseuphành vi mặc định nếu trường hiện không có tiêu điểm. Nó hoạt động cho những trường hợp này:

  • nhấp khi trường không tập trung
  • nhấp khi trường có trọng tâm
  • đi vào lĩnh vực

Tôi đã thử nghiệm điều này trong Chrome 31, FF 26 và IE 11.


Điều này hoạt động hoàn hảo cho các sự kiện nhấp chuột, nhưng nếu tôi sử dụng tab để chuyển sang trường nhập liệu tiếp theo, tôi thấy rằng nội dung sẽ được chọn và bỏ chọn ngay sau đó
ToX 82

4

Tìm thấy một giải pháp tuyệt vời khi đọc chủ đề này

$(function(){

    jQuery.selectText('input:text');
    jQuery.selectText('input:password');

});

jQuery.extend( {
    selectText: function(s) { 
        $(s).live('focus',function() {
            var self = $(this);
            setTimeout(function() {self.select();}, 0);
        });
    }
});


đừng quên tất cả các loại văn bản HTML5 khác, ví dụ: 'input [type = email]'
jamiebarrow

3

Tôi đến từ cuối năm 2016 và mã này chỉ hoạt động trong các phiên bản gần đây của jquery (jquery-2.1.3.js trong trường hợp này).

if ($(element).is("input")) {
    $(element).focus(function () {
        $(element).select();
    });
}

2

i sử dụng FF 16.0.2 và jquery 1.8.3, tất cả các mã trong câu trả lời không hoạt động.
Tôi sử dụng mã như thế này và làm việc.

$("input[type=text]").focus().select();

4
Điều này không trả lời câu hỏi, đó là cách chọn nội dung của hộp nhập liệu khi người dùng tập trung vào trường . Điều này sẽ ngay lập tức tập trung và chọn mã, mà không cần người dùng nhập liệu.
sốt

@saluce tôi không hiểu ý bạn là gì? những gì người hỏi muốn là khi anh ta chọn trường, tất cả các văn bản hiện tại được chọn. Và mã của tôi nên làm điều đó. Tôi thậm chí sử dụng nó cho dự án của tôi, như thời gian khi tôi viết câu trả lời này.
GusDeCooL

1
Mã này sẽ tập trung và chọn mọi thứ khi nó chạy, nhưng mã, trong chính nó, không bị ràng buộc với một sự kiện do người dùng tạo , chẳng hạn như nhấp vào hộp văn bản. Ví dụ: $("input[type=text]").on('click', function () { $(this).focus.select(); })gây ra sự tập trung và chọn xảy ra khi người dùng nhấp vào hộp, vì nó được thực thi khi người dùng nhấp vào hộp. Không có trình xử lý sự kiện, mã không trả lời câu hỏi, do đó, downvote và bình luận. Về cơ bản, bạn có phần "tất cả văn bản hiện tại được chọn" nhưng không phải là phần "khi anh ấy chọn trường".
sốt

1
@GusDeCooL đủ vui (mặc dù đây không phải là chính xác những gì anh ấy đã hỏi) Tôi muốn có kết quả giống như bạn đã làm về điều này :)
Robbie Averill

2
var timeOutSelect;
$("input[type=text]").focus(function() { 
        var save_this = $(this);
        clearTimeout(timeOutSelect);
        timeOutSelect = window.setTimeout (function(){ 
                save_this.select(); 
        }, 100);
});

Sử dụng ClearTimeout để bảo mật hơn nếu bạn chuyển nhanh giữa hai đầu vào .. ClearTimeout xóa thời gian chờ cũ ...


Vui lòng chỉnh sửa với nhiều thông tin hơn. Các câu trả lời chỉ dành cho mã và "thử cái này" không được khuyến khích, vì chúng không chứa nội dung có thể tìm kiếm và không giải thích lý do tại sao ai đó nên "thử cái này". Chúng tôi nỗ lực ở đây để trở thành một nguồn tài nguyên cho kiến ​​thức.
Brian Tompsett - 汤

2

Hoạt động tuyệt vời với JavaScript gốc select().

$("input[type=text]").focus(function(event) {
   event.currentTarget.select();
});

hoặc nói chung:

$("input[type=text]")[0].select()

1

Hoặc bạn chỉ có thể sử dụng <input onclick="select()">Works hoàn hảo.


không nó không. nó hoạt động để chọn toàn bộ. nhưng hãy cố gắng chọn một phần của văn bản theo cách thủ công, bạn sẽ không thể làm điều đó.
Sujay Phadke


0
<script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>

Điều này có thể sẽ được đánh dấu là một câu trả lời chất lượng thấp bởi vì nó không có bất kỳ lời giải thích nào về những gì đang xảy ra.
tumultous_rooster

Bạn $.readykhông đúng Bạn cần truyền một hàm cho nó để làm cho nó trì hoãn attrcho đến khi tài liệu sẵn sàng. Bạn đang làm nó ngay lập tức sau đó chuyển bộ sưu tập phần tử đến $.ready.
doug65536

Ngoài ra, tránh 'onclick', đặc biệt theo cách này. Sử dụng addEventListener.
doug65536

0

Tôi luôn sử dụng requestAnimationFrame()để vượt qua các cơ chế hậu sự kiện nội bộ và điều này hoạt động hoàn hảo trong Firefox. Chưa được thử nghiệm trong Chrome.

$("input[type=text]").on('focus', function() {
    requestAnimationFrame(() => $(this).select());
});
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.