การเลือกข้อความโดยใช้โปรแกรมในช่องป้อนข้อมูลบนอุปกรณ์ iOS (Safari บนมือถือ)


88

คุณจะเลือกข้อความของช่องป้อนข้อมูลบนอุปกรณ์ iOS เช่น iPhone, iPad โดยใช้โปรแกรม Safari บนมือถือได้อย่างไร

โดยปกติจะเพียงพอที่จะเรียกใช้.select()ฟังก์ชันบน<input ... />องค์ประกอบ แต่จะไม่ทำงานบนอุปกรณ์เหล่านั้น เคอร์เซอร์จะถูกทิ้งไว้ที่ท้ายรายการที่มีอยู่โดยไม่มีการเลือก


10
ฉันไม่เห็นเหตุผลว่าทำไมการเป็นอุปกรณ์สัมผัสจึงเปลี่ยนความเกี่ยวข้องของข้อความที่เลือกไว้ล่วงหน้า สิ่งที่คุณพูดเกี่ยวกับอุปกรณ์สัมผัสสามารถพูดถึงอุปกรณ์ที่ไม่ใช่ระบบสัมผัสได้ดีพอ ๆ กัน ฉันต้องการเลือกข้อความล่วงหน้าเมื่อผู้ใช้เลือกที่จะแตะรายการเพื่อแก้ไข ในกรณีส่วนใหญ่ผู้ใช้มีแนวโน้มที่จะต้องการแทนที่เนื้อหาที่มีอยู่ซึ่งในกรณีนี้พวกเขาจะสามารถทำได้โดยไม่ต้องแตะและลากอีกต่อไป ในกรณีอื่น ๆ เมื่อต้องการแก้ไขเนื้อหาที่มีอยู่ก็สามารถยกเลิกการเลือกหรือเปลี่ยนแปลงการเลือกได้
sroebuck

2
ขออภัย. focus (). select () ไม่ทำงาน
sroebuck

2
ฉันเริ่มมีความสุขกับปัญหานี้ เป้าหมายของฉันคือทำให้ผู้ใช้คลิกที่พื้นที่ข้อความของฉันได้ง่ายมากและแตะ "คัดลอก" เพื่อคัดลอกข้อความไปยังคลิปบอร์ด
Dan Fabulich

เหมือนกันที่นี่ .. ดูเหมือนจะมีหลายวิธีที่ใช้ไม่ได้ใน Mobile Safari .select () และ. focus () เป็นสองวิธี

@sroebuck คำตอบที่ดีสำหรับ David W.Keith! ยกนิ้วให้!
eyurdakul

คำตอบ:


95
input.setSelectionRange(0, 9999);

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


3
สิ่งนี้ใช้ได้ผลสำหรับฉัน แต่ต้องรวมถึงการหยุดการวางเมาส์บนอินพุตเดียวกัน
DuStorm

8
สิ่งนี้ใช้ไม่ได้สำหรับฉันทั้งบน iPad หรือ iPhone
Doug

4
นี้จะทำงานให้ฉันถ้าผมเรียกการป้อนข้อมูลก่อนที่จะกล่าวอ้าง.focus() input.setSelectionRangeหากคุณกำลังฟังfocusเหตุการณ์ในอินพุตอย่าลืมคำนึงถึงการวนซ้ำที่ไม่มีที่สิ้นสุด
allieferr

10
gotcha ที่ควรค่าแก่การกล่าวถึง: สิ่งนี้จะใช้ไม่ได้กับ textareas หากมีreadonlyชุดแอตทริบิวต์
JayPea

5
ฉันใช้เวลากว่าหนึ่งชั่วโมงในการเล่นกับโซลูชันต่างๆ การโทรsetSelectionRange()ในfocusตัวจัดการจะทำงานเมื่อคุณทริกเกอร์โดยใช้.focus()โปรแกรม แต่เมื่อคุณแตะที่อินพุตข้อความบน iOS ด้วยตนเองการเลือกจะไม่เกิดขึ้น พอจะพูดได้สิ่งที่คุณต้องทำคือโทรsetSelectionRange()ภายใน setTimeout เป็น 0 และทำงานได้ตามที่คาดไว้ไม่ว่าอะไรจะกระตุ้นโฟกัสก็ตาม

30

ไม่มีสิ่งใดในหัวข้อนี้ที่ใช้ได้ผลสำหรับฉันนี่คือสิ่งที่ใช้ได้กับ iPad ของฉัน:

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

นี่คือเคล็ดลับ f ** kin! ขอขอบคุณ! ทำงานร่วมกับเหตุการณ์ 'คลิก'
saike

ขอบคุณมาก!!
Vaclav Kusak

26

เป็นการยากที่จะพิสูจน์ว่าเป็นลบ แต่งานวิจัยของฉันชี้ให้เห็นว่านี่เป็นข้อบกพร่องใน Mobile Safari

โปรดทราบว่า focus () ใช้งานได้ไม่มากก็น้อยแม้ว่าจะต้องแตะมากกว่าหนึ่งครั้งเพื่อให้สำเร็จและก็ไม่จำเป็นหากคุณพยายามตอบสนองต่อการแตะของผู้ใช้ในฟิลด์ที่เป็นปัญหาเนื่องจากการแตะจะให้ฟิลด์ โฟกัส. แต่น่าเสียดายที่เลือก () เป็นเพียงไม่ทำงานใน Mobile Safari

ทางออกที่ดีที่สุดของคุณอาจจะรายงานข้อผิดพลาดกับแอปเปิ้ล


1
การทดสอบของเราบ่งชี้เหมือนกัน เป็นข้อบกพร่อง / คุณลักษณะที่ขาดหายไปในซาฟารีมือถือ
Nir Levy

2
FWIW ทำงานใน Chrome Desktop และเบราว์เซอร์ Android ซึ่งใช้ WebKit ด้วย
jrummell

24

ดูซอนี้ : (ป้อนข้อความในช่องป้อนข้อมูลและคลิก 'เลือกข้อความ')

เป็นการเลือกข้อความใน inputbox บน iPod ของฉัน (iOS6.0.1 เจนเนอเรชั่นที่ 5) เปิดคีย์บอร์ดและแสดงเมนู Cut / Copy / Suggest ...

ใช้จาวาสคริปต์ธรรมดา ไม่ได้ลองกับ jQuery

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

โปรดทราบว่าตัวเลข 999 เป็นเพียงตัวอย่างเท่านั้น คุณควรตั้งค่าตัวเลขเหล่านี้เป็นจำนวนอักขระที่คุณต้องการเลือก

อัพเดท:

  • iPod5 - iOS6.0.1 - ใช้งานได้ดี
  • iPad1 - iOS5.1.1 - เลือกเฉพาะข้อความ แตะการเลือกหนึ่งครั้งเพื่อเปิดเมนูตัด / คัดลอก
  • iPad2 - iOS4.3.3 - เลือกเฉพาะข้อความ แตะการเลือกหนึ่งครั้งเพื่อเปิดเมนูตัด / คัดลอก

สำหรับสองข้อสุดท้ายคุณอาจทดลองโดยการทริกเกอร์เหตุการณ์คลิกบนinputองค์ประกอบ

อัพเดท: (07-10-2556)

  • iPod5 - iOS7.0.2 - การใช้ซอในลิงค์: ไม่เห็นข้อความที่พิมพ์ในช่องป้อนข้อมูล การกดเลือกจะเปลี่ยนเส้นทางฉันไปที่ facebook.com (??? wtf ???) ไม่รู้ว่าเกิดอะไรขึ้น

อัพเดท: (14-11-2556)

  • iOS 7.0.3: ขอบคุณความคิดเห็นจากBinkiปรับปรุงว่า .selectionStartและ.selectionEnd ไม่ทำงาน

อัพเดท: (15-01-2558)

  • iOS 8.xx: ขอบคุณความคิดเห็นจากไมเคิลเบิร์ท นำมาจากความคิดเห็น: ฉันต้องฟังทั้งโฟกัสและคลิกเหตุการณ์จากนั้น setTimeout / _. debounce เพื่อให้ทำงานได้ในทั้งสองกรณี: คลิกอินพุตหรือโฟกัสผ่านการแท็บ

คุณคือฮีโร่ของฉันสำหรับวันนี้! ใช้งานได้เหมือนมีเสน่ห์! ;-)
andi1984

3
@ andi1984 ฉันจะรับตราฮีโร่ได้ที่ไหน?
บาร์ต

1
คุณรู้เกี่ยวกับความเข้ากันได้กับ iOS เวอร์ชันอื่น ๆ หรือไม่? มันทำงานบน iOS5 และ iOS4 หรือไม่
andi1984

1
ใช้งานได้สำหรับฉันบน iOS6 แต่ a) ไม่ทำงานบน Chrome บนเดสก์ท็อป b) ไม่ทำงานเมื่อปิดใช้งานการป้อนข้อความ :( กรณีการใช้งานของฉัน: ฉันสร้าง URL ที่ไม่ซ้ำกันและต้องการการแบ่งปันแบบ faciliate
Mars Robertson

1
@barts ฉันจะเดาว่าคุณลงเอยบน Facebook เพราะเมนู "แบ่งปัน" ที่ jsfiddle จะต้องยุ่งเหยิงและไม่สามารถแตะได้ในขณะที่มองไม่เห็น ฉันคลิกปุ่ม Twitter ที่มองไม่เห็นด้วยตัวเองเมื่อทดสอบกับ iOS-7.0.3 บน iPad ฉันยังพบว่าเมื่อฉันคิดว่าฉันกำลังแตะที่ของคุณ<input/>iPad ก็คิดว่าฉันกำลังแตะในบานหน้าต่าง "CSS" ของ jsfiddle (ซึ่งสิ่งที่ฉันพิมพ์จะมองไม่เห็น) เมื่อฉันได้รับการแตะที่ถูกต้อง<input/>แล้วปุ่ม“ เลือกข้อความ” ของคุณจะทำงานได้ดีอย่างสมบูรณ์บน iOS-7.0.3 :-)
binki

7

ขออภัยในโพสต์ก่อนหน้าของฉันฉันไม่สังเกตเห็น Javascript ที่บ่งบอกว่าคุณต้องการคำตอบใน Javascript

เพื่อให้ได้สิ่งที่คุณต้องการในUIWebViewด้วยจาวาสคริปต์ฉันได้จัดการรวบรวมข้อมูลสำคัญสองส่วนเข้าด้วยกันเพื่อให้ใช้งานได้ ไม่แน่ใจเกี่ยวกับเบราว์เซอร์มือถือ

  1. element.setSelectionRange(0,9999); ทำในสิ่งที่เราต้องการ

  2. เหตุการณ์ mouseUp กำลังยกเลิกการเลือก

ดังนั้น (โดยใช้ Prototype):

    input.observe ('โฟกัส', ฟังก์ชัน () {
      this.setSelectionRange (0, 9999);
    });
    input.observe ('mouseup', ฟังก์ชัน (เหตุการณ์) {
      event.stop ();
    });

เคล็ดลับไม่

ม ธ


3
เราประสบปัญหาเดียวกันและพบว่าโซลูชันของคุณใช้งานได้ - แต่เราใช้ jquery (มือถือจริง) / * เลือกข้อความในช่องเติม * / $ ("input") focus (function () {this.setSelectionRange (0, 9999); return false;}) .mouseup (function () {return false;} );
DuStorm

1
ฉันใช้ iOS 8 บน iPad และ iPhone และรหัสจาก @DuStorm (แสดงความคิดเห็นด้านบนนี้) เป็นสิ่งเดียวที่เหมาะกับฉันจากคำตอบทั้งหมดที่ให้ไว้ที่นี่ เพื่อย้ำอีกครั้งว่าอย่างน้อยต่อไปนี้ใช้ได้บน iOS 8 ใน Chrome และ Safari: $("input").focus(function () { this.setSelectionRange(0, 9999); return false; } ).mouseup( function () { return false; });
Aaron Jessen

ฉันต้องใช้focusinแทนที่จะโฟกัสเพื่อให้สิ่งนี้ทำงานได้ iOS 7
Lucas

3

ดูเหมือนว่าโฟกัสจะใช้ได้ แต่เมื่อถูกเรียกโดยตรงจากเหตุการณ์ที่เกิดขึ้นเอง โฟกัสการโทรโดยใช้บางอย่างเช่น SetTimeout ไม่ปรากฏเรียกแป้นพิมพ์ การควบคุมแป้นพิมพ์ ios ทำได้แย่มาก มันไม่ใช่สถานการณ์ที่ดี


1

สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉันบน Webkit ที่มาพร้อมกับ Android 2.2:

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

ดูโครเมียมฉบับที่ 32865


1

ด้วย iOS 7 บน iPad วิธีเดียวที่ฉันสามารถทำงานนี้ได้คือการใช้งานจริง<textarea></textarea>แทน<input>ภาคสนาม

เช่น

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

วิธีป้องกันไม่ให้ผู้ใช้เปลี่ยนข้อความภายในพื้นที่นั้นยากกว่าเนื่องจากคุณสร้าง textarea แบบอ่านอย่างเดียวเคล็ดลับการเลือกจะไม่ทำงานอีกต่อไป


1

ฉันเริ่มมองหาวิธีแก้ปัญหานี้ในขณะที่คำตอบทั้งหมดของคุณช่วยเปิดเวิร์มอีกกระป๋องให้ฉัน

ลูกค้าต้องการให้ผู้ใช้สามารถคลิกและเลือกทั้งหมดได้และยังให้ผู้ใช้'แท็บ' และเลือกทั้งหมดบน iPad (ด้วยแป้นพิมพ์ภายนอกฉันรู้ว่าบ้า ... )

วิธีแก้ปัญหาของฉันคือจัดเรียงเหตุการณ์ใหม่ โฟกัสแรกจากนั้นคลิกจากนั้นแตะเริ่มต้น

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

ฉันหวังว่านี่จะช่วยใครสักคนเพราะคุณช่วยฉันมาแล้วนับครั้งไม่ถ้วน


-4

หากคุณใช้เบราว์เซอร์ที่รองรับ HTML5 คุณสามารถใช้placeholder="xxx"ในinputแท็กของคุณ ที่ควรทำ


8
ฉันไม่คิดว่านี่คือสิ่งที่ถาม
caitriona
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.