Chọn văn bản theo chương trình trong trường nhập liệu trên thiết bị iOS (Safari di động)


87

Làm cách nào để bạn lập trình chọn văn bản của trường nhập liệu trên thiết bị iOS, ví dụ như iPhone, iPad chạy Safari di động?

Thông thường, chỉ cần gọi .select()hàm trên <input ... />phần tử là đủ , nhưng điều này không hoạt động trên các thiết bị đó. Con trỏ chỉ được để ở cuối mục nhập hiện có mà không có lựa chọn nào được thực hiện.


10
Tôi không thấy lý do gì tại sao việc là một thiết bị cảm ứng lại thay đổi mức độ liên quan của việc chọn trước văn bản. Những gì bạn đã nói về một thiết bị cảm ứng cũng có thể nói về một thiết bị không cảm ứng. Tôi muốn chọn trước văn bản khi người dùng chọn chạm vào một mục để chỉnh sửa. Trong hầu hết các trường hợp, người dùng có thể muốn thay thế nội dung hiện có, trong trường hợp đó, họ có thể thực hiện việc đó mà không cần chạm và kéo thêm. Trong những trường hợp khác, khi họ muốn chỉnh sửa nội dung hiện có, họ có thể bỏ chọn hoặc thay đổi lựa chọn.
sroebuck

2
Rất tiếc .focus (). Select () không hoạt động.
sroebuck

2
Tôi đang bắt đầu nhận tiền thưởng về vấn đề này. Mục tiêu của tôi là giúp người dùng dễ dàng nhấp vào vùng văn bản của tôi và nhấn "Sao chép" để sao chép văn bản vào khay nhớ tạm.
Dan Fabulich

Tương tự ở đây .. dường như có rất nhiều phương thức không hoạt động trong Mobile Safari .select () và .focus () là hai trong số đó.

@sroebuck câu trả lời hay cho David W. Keith! thích!
eyurdakul

Câu trả lời:


95
input.setSelectionRange(0, 9999);

https://developer.mozilla.org/en/DOM/Input.select


3
Điều này làm việc cho tôi nhưng phải bao gồm việc dừng di chuột lên trên cùng một đầu vào.
DuStorm

8
Điều này không hoạt động đối với tôi trên iPad hoặc iPhone
Doug

4
Điều này chỉ làm việc cho tôi nếu tôi đã kích hoạt .focus()đầu vào trước khi gọi input.setSelectionRange. Nếu bạn đang nghe focussự kiện trên đầu vào, hãy nhớ tính đến vòng lặp vô hạn.
allieferr

10
Một gotcha đáng nói: điều này sẽ không hoạt động trên các textareas nếu chúng có readonlythuộc tính được đặt.
JayPea

5
Tôi đã dành hơn một giờ để chơi với nhiều giải pháp khác nhau. Gọi setSelectionRange()trong focustrình xử lý hoạt động khi bạn kích hoạt theo .focus()chương trình, nhưng khi bạn nhấn thủ công vào mục nhập văn bản trên iOS, lựa chọn không xảy ra. Nói một cách đầy đủ, tất cả những gì bạn cần làm là gọi setSelectionRange()trong setTimeout bằng 0 và nó hoạt động như mong đợi bất kể điều gì kích hoạt tiêu điểm.

30

Không có gì trong chuỗi này hiệu quả với tôi, đây là những gì hoạt động trên iPad của tôi:

// t is the input field
setTimeout(function() {
    t.setSelectionRange(0, 9999);
}, 1);

đây là trò lừa f ** kin! Cảm ơn bạn! hoạt động với sự kiện 'nhấp chuột'
saike

Cảm ơn bạn rất nhiều!!
Vaclav Kusak

26

Thật khó để chứng minh điều tiêu cực, nhưng nghiên cứu của tôi cho thấy đây là một lỗi trong Mobile Safari.

Lưu ý rằng tiêu điểm () hoạt động, dù ít hay nhiều — mặc dù nó có thể yêu cầu nhiều lần nhấn để thành công và không cần thiết nếu bạn đang cố gắng phản hồi người dùng nhấn vào trường được đề cập vì chính thao tác nhấn sẽ cung cấp cho trường tiêu điểm. Thật không may, select () chỉ đơn giản là không có chức năng trong Mobile Safari.

Đặt cược tốt nhất của bạn có thể là một báo cáo lỗi với Apple .


1
Thử nghiệm của chúng tôi chỉ ra như vậy. Đó là một lỗi / thiếu tính năng trong safari di động.
Nir Levy

2
FWIW, nó hoạt động trong Chrome Desktop và Trình duyệt Android, cũng dựa trên WebKit.
jrummell

24

Xem trò chơi này : (nhập một số văn bản vào hộp nhập liệu và nhấp vào 'chọn văn bản')

Nó đang chọn văn bản trong hộp nhập liệu trên iPod của tôi (iOS6.0.1 thế hệ thứ 5), mở bàn phím và cũng hiển thị menu Cắt / Sao chép / Đề xuất ...

Sử dụng javascript đơn giản. Không thử điều này với jQuery

document.getElementById("p1").selectionStart = 0
document.getElementById("p1").selectionEnd = 999

Lưu ý rằng số 999 chỉ là một mẫu. Bạn nên đặt các số này thành số ký tự bạn muốn chọn.

CẬP NHẬT:

  • iPod5 - iOS6.0.1 - Hoạt động tốt.
  • iPad1 - iOS5.1.1 - Chỉ văn bản được chọn. Nhấn vào lựa chọn một lần để mở menu Cắt / Sao chép
  • iPad2 - iOS4.3.3 - Chỉ chọn văn bản. Nhấn vào lựa chọn một lần để mở menu Cắt / Sao chép

Đối với hai phần cuối cùng, bạn có thể thử nghiệm bằng cách kích hoạt sự kiện nhấp chuột vào inputphần tử

CẬP NHẬT: (07-10-2013)

  • iPod5 - iOS7.0.2 - Sử dụng fiddle trong liên kết: Không thể nhìn thấy văn bản đã nhập trong hộp nhập liệu. Nhấn chọn sẽ chuyển hướng tôi đến facebook.com (??? wtf ???) không biết chuyện gì đang xảy ra ở đó.

CẬP NHẬT: (14-11-2013)

  • iOS 7.0.3: Nhờ những nhận xét từ binki cập nhật rằng .selectionStart.selectionEnd thực hiện công việc.

CẬP NHẬT: (15-01-2015)

  • iOS 8.xx: Cảm ơn nhận xét từ Michael Siebert . Trích từ nhận xét: Tôi đã phải lắng nghe cả sự kiện tiêu điểm VÀ nhấp chuột và sau đó gỡ lỗi setTimeout / _. Để làm cho nó hoạt động trong cả hai trường hợp: nhấp vào đầu vào hoặc tiêu điểm thông qua tab

Bạn là người hùng của tôi cho ngày hôm nay! Hoạt động như một sự quyến rũ! ;-)
andi1984

3
@ andi1984 Tôi xin huy hiệu anh hùng ở đâu?
bart s

1
Bạn có biết về khả năng tương thích với các phiên bản iOS khác không? Nó có hoạt động trên iOS5 và iOS4 không?
andi1984, 7/12/12

1
Công trình đối với tôi trên iOS6 NHƯNG a) không làm việc trên Chrome desktop b) không làm việc khi nhập văn bản bị vô hiệu hóa :( trường hợp sử dụng của tôi: tôi tạo URL duy nhất và muốn chia sẻ thuận tiện cho.
Mars Robertson

1
@barts Tôi đoán rằng bạn đã kết thúc trên Facebook bởi vì menu "Chia sẻ" tại jsfiddle phải bị lộn xộn và có thể được chạm vào trong khi có thể ẩn. Tôi đã tự mình nhấp vào nút Twitter ẩn khi thử nghiệm với iOS-7.0.3 trên iPad. Tôi cũng nhận thấy rằng khi tôi nghĩ rằng tôi đang nhấn vào của bạn <input/>, iPad nghĩ rằng tôi đang nhấn vào ngăn “CSS” của jsfiddle (trong đó bất kỳ thứ gì tôi nhập đều ẩn). Khi tôi đã nhấn đúng hướng <input/>, nút “chọn văn bản” của bạn hoạt động hoàn toàn tốt trên iOS-7.0.3 :-).
binki

7

Xin lỗi, trong bài viết trước đó của tôi, tôi không nhận thấy Javascript ngụ ý rằng bạn muốn có câu trả lời trong Javascript.

Để có được những gì bạn muốn trong UIWebView bằng javascript , tôi đã cố gắng thu thập hai phần thông tin quan trọng để làm cho nó hoạt động. Không chắc chắn về trình duyệt di động.

  1. element.setSelectionRange(0,9999); làm những gì chúng tôi muốn

  2. Sự kiện mouseUp đang hoàn tác lựa chọn

Do đó (sử dụng Prototype):

    input.observe ('focus', function () {
      this.setSelectionRange (0, 9999);
    });
    input.observe ('mouseup', function (event) {
      event.stop ();
    });

thực hiện thủ thuật.

Matt


3
Chúng tôi đang gặp vấn đề tương tự và nhận thấy giải pháp của bạn có hiệu quả - nhưng chúng tôi đang sử dụng jquery (thực tế là thiết bị di động). / * chọn văn bản bên trong phần điền * / $ ("input"). focus (function () {this.setSelectionRange (0, 9999); return false;}) .mouseup (function () {return false;} );
DuStorm

1
Tôi đang sử dụng iOS 8 trên iPad và iPhone và mã từ @DuStorm (bình luận ở trên cái này) là thứ duy nhất phù hợp với tôi trong số tất cả các câu trả lời được đưa ra ở đây. Nói cách khác, những điều sau đây tại công trình ít nhất trên iOS 8 trong Chrome và Safari: $("input").focus(function () { this.setSelectionRange(0, 9999); return false; } ).mouseup( function () { return false; });
Aaron Jessen

Tôi đã phải sử dụng focusinthay vì tập trung để điều này hoạt động, iOS 7
Lucas

3

Có vẻ như tiêu điểm sẽ hoạt động nhưng chỉ khi được gọi trực tiếp từ một sự kiện gốc. gọi tiêu điểm bằng cách sử dụng một cái gì đó như SetTimeout không xuất hiện gọi lên bàn phím. Khả năng kiểm soát của bàn phím ios rất kém. Đó không phải là một tình huống tốt.


1

Một cái gì đó như sau đang làm việc cho tôi trên Webkit đi kèm với Android 2.2:

function trySelect(el) {
    setTimeout(function() {
        try {
            el.select();
        } catch (e) {
        }
    }, 0);
}

Xem Sự cố Chromium 32865 .


1

Với iOS 7 trên iPad, cách duy nhất mà tôi có thể làm cho công việc này là sử dụng thực sự <textarea></textarea>thay vì <input>trường.

ví dụ

<textarea onclick="this.setSelectionRange(0, 9999);">My text will be selected when textarea is clicked.</textarea>

Làm thế nào để ngăn người dùng thay đổi văn bản bên trong khu vực khó hơn, vì bạn làm cho vùng văn bản chỉ đọc, thủ thuật lựa chọn sẽ không hoạt động nữa.


1

Tôi đã điên đầu tìm kiếm giải pháp này, trong khi tất cả các câu trả lời của bạn đã giúp nó mở ra một hộp giun khác cho tôi.

Khách hàng muốn người dùng có thể nhấp và chọn tất cả , đồng thời cho phép người dùng 'tab' và chọn tất cả trên iPad (với bàn phím bên ngoài. Tôi biết, thật điên rồ ...)

Giải pháp của tôi cho vấn đề này là sắp xếp lại các sự kiện. Tiêu điểm đầu tiên , sau đó nhấp vào , sau đó chạm vào bắt đầu .

$('#myFUBARid').on('focus click touchstart', function(e){
  $(this).get(0).setSelectionRange(0,9999);
  //$(this).css("color", "blue");
  e.preventDefault();
});

Tôi hy vọng điều này sẽ giúp ích cho ai đó, vì bạn đã giúp tôi rất nhiều lần.


-4

Nếu bạn đang sử dụng các trình duyệt tuân thủ HTML5, bạn có thể sử dụng placeholder="xxx"trong inputthẻ của mình . Điều đó sẽ làm công việc.


8
Tôi không nghĩ rằng đây là những gì các câu hỏi đã được hỏi
Caitriona
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.