เลือกเนื้อหาทั้งหมดของกล่องข้อความเมื่อได้รับการโฟกัส (Vanilla JS หรือ jQuery)


310

โซลูชัน Vanilla JS หรือ jQuery คืออะไรที่จะเลือกเนื้อหาทั้งหมดของกล่องข้อความเมื่อกล่องข้อความได้รับโฟกัส



3
@gdoron ด้วยเหตุผลบางอย่างที่ลิงก์เปลี่ยนเส้นทางไปยังคำถามนี้
Destrictor


ปัญหาของการแก้ปัญหาส่วนใหญ่คือพวกเขาทำงานไม่ถูกต้องเมื่อเปลี่ยนตำแหน่งเคอร์เซอร์ภายในช่องใส่ ลองดูคำตอบของฉันที่นี่: stackoverflow.com/a/20826207/641452
Colin Breame

คำตอบ:


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

23
นอกจากนี้สำหรับข้อมูลเพิ่มเติม: "อินพุต [type = text]" ตอนนี้สามารถเป็น "อินพุต: ข้อความ" ขอแสดงความนับถือ
Ricardo Vega

8
ดูเหมือนจะไม่เหมาะกับฉันบน Chrome และเว็บไซต์ jQuery บอกว่ามันขึ้นอยู่กับเบราว์เซอร์ ใครสามารถตรวจสอบได้หรือไม่
Kenny Wyland

71
ดูเหมือนว่าเบราว์เซอร์ WebKit รบกวนสิ่งนี้เนื่องจากเหตุการณ์การวางเมาส์ ฉันเพิ่มสิ่งนี้และใช้งานได้: $ ('อินพุต: ข้อความ'). mouseup (ฟังก์ชั่น (e) {return false;});
Kenny Wyland

5
Kenny ถูกต้อง แต่น่าเสียดายที่ 'การคลิกเมาส์' ยังส่งผลต่อการควบคุมตัวหมุนของ Chrome ด้วย การปิด 'คลิก' แทนที่จะเป็น 'โฟกัส' ดูเหมือนจะแก้ปัญหานั้น
Richard Kennard

24
ฉันใช้สิ่งนี้: $ ("อินพุต: ข้อความ"). select (). focus ();
Phuong

227

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


43
+ onmouseup = "return false" เพื่อหยุดการยกเลิกการเลือกเมื่อคลิก
Anthony Johnston

2
+1 สำหรับ stopEvent บางประเภทสำหรับการวางเมาส์หรือไม่ทำงานอย่างน่าเชื่อถือ ข้อเสียของการทำเช่นนั้นคือเมื่อเคอร์เซอร์อยู่ในฟิลด์การคลิกที่ตำแหน่งใด ๆ ภายในข้อความที่เลือกเพื่อวางตำแหน่งเคอร์เซอร์นั้นจะไม่ทำงาน การคลิกถูกปิดการใช้งานอย่างมีประสิทธิภาพ ถึงกระนั้นสำหรับสถานการณ์ที่การเลือกข้อความทั้งหมดในการโฟกัสนั้นเป็นที่น่าพอใจ
enigment

ฉันสามารถแก้ไขปัญหาที่เกิดขึ้นจากการ enigment ได้โดยการตั้งค่าตัวแปรส่วนกลาง doMouseUp เป็น false ระหว่างเหตุการณ์ onMouseDown ถ้าสิ่งนี้! = document.activeElement จากนั้นในระหว่าง onMouseUp ให้รีเซ็ต doMouseUp เป็น true และส่งคืนค่า doMouseUp ก่อนที่คุณจะรีเซ็ต นี่กำลังซับซ้อนและต้องการรหัส - ฉันจะโพสต์คำตอบเพื่ออธิบายให้ดีขึ้น
เทรวิส

1
อย่าเพิ่มonmouseup="return false;"ถ้าคุณต้องการให้ผู้ใช้สามารถเลือกและแก้ไขข้อความได้อย่างอิสระหลังจากโฟกัสภายในกล่องข้อความ ด้วยรหัสนี้ข้อความจะถูกล็อคในสถานการณ์ "เลือกทั้งหมด" และผู้ใช้จะไม่สามารถแก้ไขได้ยกเว้นว่าผู้ใช้พิมพ์ข้อความใหม่หรือใช้ปุ่มลูกศรเพื่อเลื่อนไปมา ความจริงแล้วนี่เป็นพฤติกรรมที่แปลกมากและจะไม่เข้าท่าเว้นแต่ช่องข้อความมีวัตถุประสงค์ที่จะไม่สามารถแก้ไขได้อย่างถาวร (ดังนั้นจึงถูกปิดใช้งาน)
ADTC

1
ในทางเทคนิคแล้วคุณไม่ต้องการonmouseup="return false;"ถ้าคุณต้องการให้การเลือกเกิดขึ้นเมื่อผู้ใช้คลิกหรือแท็บเป็นครั้งแรก และ +1 สำหรับจาวาสคริปต์วานิลลา!
clabe45

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

3
ได้รับการยืนยัน ดูเหมือนว่าคำตอบที่ได้รับการโหวตและยอมรับสูงสุดในปัจจุบันจะไม่สามารถใช้งานได้กับ Chrome
Aron Boyette

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

1
ดีจัง. ขอบคุณ! ความคิดเห็นโดย enigment ถึงคำตอบของ Zach ให้ข้อเสียอย่างหนึ่งในการป้องกันไม่ให้mouseupเหตุการณ์เริ่มต้น: "เมื่อเคอร์เซอร์อยู่ในฟิลด์คลิกที่ตำแหน่งใด ๆ ภายในข้อความที่เลือกเพื่อวางตำแหน่งเคอร์เซอร์ที่นั่นไม่ทำงานการคลิกถูกปิดใช้งานอย่างมีประสิทธิภาพ สถานการณ์ที่การเลือกข้อความทั้งหมดในโฟกัสเป็นที่ต้องการน่าจะเป็นความชั่วร้ายที่น้อยกว่าสองข้อ "
JohnK

25

jQuery ไม่ใช่ JavaScript ซึ่งใช้งานง่ายกว่าในบางกรณี

ดูตัวอย่างนี้:

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

ที่มา: CSS Tricks , MDN


7
อาจจะไม่เป็นไรถ้าคุณไม่รังเกียจที่จะรับมาร์กอัปและโค้ดทั้งหมดปะปนอยู่ คนส่วนใหญ่พยายามที่จะทำให้สคริปต์ของพวกเขา 'ไม่สร้างความรำคาญ' ในปัจจุบัน โอ้ ... และ jQuery คือ Javascript
Andrew Barber เมื่อ

2
ขอบคุณสำหรับคำแนะนำของ onclick ใช้งานได้ดี ไม่ใช่ทุกคนที่ใช้ jQuery ดีใจที่เห็นตัวเลือกอื่น
Lukus

นี่ถือว่าผู้ใช้ใช้เม้าส์เท่านั้น
pcnate

สามารถใช้ onfocus = "this.focus (); this.select ()" สำหรับแป้นพิมพ์
Muhammad Nadeem

21

นี่ไม่ได้เป็นเพียงปัญหาของ Chrome / Safari ฉันมีประสบการณ์การทำงานที่คล้ายกันกับ Firefox 18.0.1 ส่วนที่ตลกคือมันไม่ได้เกิดขึ้นกับ MSIE! ปัญหานี่คือเหตุการณ์การวางเมาส์ครั้งแรกที่บังคับให้ยกเลิกการเลือกเนื้อหาอินพุตดังนั้นให้ละเว้นเหตุการณ์แรก

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

วิธี timeOut ทำให้เกิดพฤติกรรมที่แปลกและปิดกั้นเหตุการณ์การวางเมาส์ทุกครั้งที่คุณไม่สามารถลบการเลือกที่เลือกอีกครั้งในองค์ประกอบอินพุต


1
+1 สำหรับการใช้งานเพื่อป้องกันการคลิกเมาส์ครั้งเดียว ฉันไม่ชอบที่จะเลือกข้อความด้วยเมาส์หลังจากคลิกเริ่มต้นจริงๆ
Pluc

13

HTML:

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

ใช้ JS:

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

ใช้ JQuery:

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

ใช้ React JS:

ในองค์ประกอบที่เกี่ยวข้องภายในฟังก์ชั่นการแสดงผล -

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

2
สิ่งนี้ใช้ได้กับฉันใน React:onFocus={(e) => e.target.select()}
Paito

11

ทางออกของฉันคือใช้หมดเวลา ดูเหมือนว่าจะทำงานได้ดี

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

นี่เป็นวิธีที่ฉันใช้และชอบ ฉันใช้ค่าการหมดเวลาเป็น 0 เนื่องจากจะทำให้มันถูกเพิ่มลงในตอนท้ายของคิวเหตุการณ์ปัจจุบันซึ่งหมายความว่ามันจะทำงานหลังจากเหตุการณ์ "เมาส์"
DavidM


4

ฉันรู้ว่าโค้ดแบบอินไลน์เป็นรูปแบบที่ไม่ดี แต่ฉันไม่ต้องการที่จะใส่มันลงในไฟล์. js ทำงานได้โดยไม่ต้อง 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

คำตอบที่นี่ช่วยฉันได้ถึงจุดหนึ่ง แต่ฉันมีปัญหาในฟิลด์ป้อนข้อมูลหมายเลข HTML5 เมื่อคลิกปุ่มขึ้น / ลงใน Chrome

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

ฉันแก้ไขมันได้โดยการลบตัวจัดการเม้าส์อัพทันทีที่มันถูกทริกเกอร์ดังต่อไปนี้:

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

หวังว่านี่จะช่วยผู้คนในอนาคต ...


Nopes คุณกำลังให้ทางออกกับปัญหาที่สร้างขึ้นเอง ถ้าคุณมองอย่างถูกต้องในคำตอบที่พวกเขาจะมีผลผูกพันmouseupกับข้อความช่องใส่เท่านั้นและไม่numbers ปัญหานี้ไม่ควรเกิดขึ้น
Om Shankar

ปัญหาเกี่ยวกับการผูกเม้าส์เม้าส์คือมันรบกวนเมื่อเลื่อนเคอร์เซอร์ภายในสนาม นี่เป็นทางออกที่ดีกว่า แต่ถ้าคุณแท็บลงในช่องแล้วเมาส์ถัดไปจะหายไป (และผู้ใช้จะไม่สามารถเลื่อนเคอร์เซอร์ด้วยเมาส์) นั่นดีกว่าการสูญเสีย mousedowns ทั้งหมด!
โคลิน Breame

3

ใช้งานได้ลองนี้ -

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

ทำงานได้ใน Safari / IE 9 และ Chrome ฉันไม่ได้รับโอกาสทดสอบใน Firefox


3

ฉันรู้ว่ามีคำตอบมากมายที่นี่ - แต่คำตอบนี้หายไปแล้ว โซลูชันที่ใช้งานได้กับ ajax ที่สร้างเนื้อหา:

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

2

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

นี่คือรหัสของฉัน:

<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>

นี่คือการปรับปรุงเล็กน้อยกับคำตอบของซัค มันทำงานได้อย่างสมบูรณ์แบบใน IE ไม่ทำงานเลยใน Chrome และทำงานร่วมกับการสลับความสำเร็จใน FireFox (แท้จริงทุกครั้ง) หากใครบางคนมีความคิดเกี่ยวกับวิธีทำให้มันทำงานได้อย่างน่าเชื่อถือใน FF หรือ Chrome โปรดแบ่งปัน

อย่างไรก็ตามฉันคิดว่าฉันจะแบ่งปันสิ่งที่ฉันสามารถทำได้เพื่อให้ดีขึ้นเล็กน้อย


มีข้อผิดพลาดในรหัสของคุณ - วิธีที่สองควรเรียกว่า "TextBoxMouseUp" ลองดูที่คำตอบของฉันซึ่งใช้วิธีการที่คล้ายกัน
โคลิน Breame

1
ควรสังเกตว่าonMouseUp=""และonMouseDown=""ไม่ใช่มาตรฐาน w3 ที่ถูกต้อง พวกเขาควรจะและonmouseup="" onmousedown=""เช่นเดียวกับแอตทริบิวต์ html อื่น ๆ ควรเขียนเป็นตัวพิมพ์เล็กไม่ใช่ในกรณีของอูฐ
DrewT

2

เช่น @Travis และ @Mari ฉันต้องการเลือกอัตโนมัติเมื่อผู้ใช้คลิกซึ่งหมายถึงการป้องกันพฤติกรรมเริ่มต้นของmouseupเหตุการณ์ แต่ไม่ได้ป้องกันไม่ให้ผู้ใช้คลิก วิธีแก้ปัญหาที่ฉันพบซึ่งทำงานใน IE11, Chrome 45, Opera 32 และ Firefox 29 (นี่คือเบราว์เซอร์ที่ฉันติดตั้งอยู่ในปัจจุบัน) ขึ้นอยู่กับลำดับเหตุการณ์ที่เกี่ยวข้องในการคลิกเมาส์

เมื่อคุณคลิกที่การป้อนข้อความที่ไม่มีโฟกัสคุณจะได้รับเหตุการณ์เหล่านี้ (รวมถึงอื่น ๆ ):

  • mousedown: เพื่อตอบสนองต่อการคลิกของคุณ การจัดการเริ่มต้นจะเพิ่มขึ้นfocusหากจำเป็นและกำหนดการเริ่มต้นการเลือก
  • focus: mousedownเป็นส่วนหนึ่งของการจัดการเริ่มต้นของ
  • mouseup: ความสมบูรณ์ของการคลิกของคุณซึ่งการจัดการเริ่มต้นจะเป็นการสิ้นสุดการเลือก

เมื่อคุณคลิกที่ตัวอักษรที่มีโฟกัสอยู่แล้วfocusเหตุการณ์จะถูกข้ามไป ในฐานะที่เป็น @Travis และ @Mari ทั้งสองสังเกตเห็นอย่างชาญฉลาดการจัดการmouseupความต้องการเริ่มต้นที่จะต้องป้องกันเฉพาะในfocusกรณีที่เกิดเหตุการณ์ อย่างไรก็ตามเนื่องจากไม่มีfocusเหตุการณ์ "ไม่เกิดขึ้น" เราจึงต้องสรุปเรื่องนี้ซึ่งเราสามารถทำได้ภายในmousedownตัวจัดการ

@ วิธีแก้ปัญหาของ Mari ต้องการ jQuery ที่ต้องนำเข้าซึ่งฉันต้องการหลีกเลี่ยง @ document.activeElementวิธีการแก้ปัญหาของเทรวิสไม่นี้โดยการตรวจสอบ ฉันไม่รู้ว่าทำไมโซลูชันของเขาไม่ทำงานในเบราว์เซอร์ แต่มีวิธีอื่นในการติดตามว่าการป้อนข้อความมีจุดสนใจหรือไม่: เพียงติดตามfocusและblurกิจกรรม

นี่คือรหัสที่เหมาะกับฉัน:

    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;
      };

ฉันหวังว่านี่จะช่วยให้ใครบางคน :-)


+1 ขอบคุณ แต่สิ่งนี้สามารถเขียนใหม่ได้อย่างไรเพื่อที่คุณจะไม่ได้รหัสยาก ๆ สำหรับการควบคุม 'txtCustomer' ในสคริปต์? มีวิธีการส่งผ่านวัตถุนี้หรือไม่?
Fandango68

วิธีหนึ่งก็คือการสร้างฟังก์ชั่นยูทิลิตี้เพื่อใช้พฤติกรรมกับองค์ประกอบใด ๆ ที่ส่งผ่านเป็นพารามิเตอร์ ภายในฟังก์ชั่นนั้นการอ้างอิงองค์ประกอบจะฮาร์ดโค้ด - พารามิเตอร์ จากนั้นคุณสามารถเรียกมันว่าองค์ประกอบการป้อนข้อมูลใด ๆ ที่ระบุด้วยวิธีการที่คุณมี :-)
Jonathan Gilbert

ขอโทษนะฉันเป็น noob คุณช่วยปรับปรุงคำตอบด้วยตัวอย่างได้ไหม ขอบคุณ
Fandango68

1
เพียงห่อโค้ดที่ฉันเขียนไว้ในการประกาศฟังก์ชั่นที่รับพารามิเตอร์ที่เรียกว่า "txtCustomer" ฉันแนะนำให้เปลี่ยนชื่อ "txtCustomer" เป็นอย่างอื่น แต่ถ้าคุณไม่มั่นใจในการทำเช่นนั้นมันจะทำงานกับตัวแปรชื่อ "txtCustomer" ในทางเทคนิค กล่าวคือ: ฟังก์ชั่น MakeTextBoxAutoSelect (txtCustomer) { สิ่งที่ฉันเขียนด้านบน }
Jonathan Gilbert


1

เป็นวิธีการแก้ปัญหา JavaScript หรือ jQuery อะไรที่จะเลือกเนื้อหาทั้งหมดของช่องเมื่อช่องที่ได้รับการมุ่งเน้น ?

คุณจะต้องเพิ่มคุณสมบัติต่อไปนี้:

onfocus="this.select()"

ตัวอย่างเช่น:

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

(จริงๆแล้วฉันไม่มีเงื่อนงำว่าทำไมคุณต้องการอะไรอีก)


1

สิ่งนี้ใช้ได้สำหรับฉัน (การโพสต์เนื่องจากไม่ใช่คำตอบ แต่อยู่ในความคิดเห็น)

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

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

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


โปรดอธิบายคำตอบของคุณแทนที่จะวางในโค้ดบางส่วน
DavidG

0

หากคุณโยงเหตุการณ์เข้าด้วยกันฉันเชื่อว่ามันไม่จำเป็นต้องใช้.oneตามคำแนะนำที่อื่นในหัวข้อนี้

ตัวอย่าง:

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

0

หมายเหตุ: หากคุณกำลังเขียนโปรแกรมใน ASP.NET คุณสามารถเรียกใช้สคริปต์โดยใช้ ScriptManager.RegisterStartupScript ใน C #:

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

หรือเพียงพิมพ์สคริปต์ในหน้า HTML ที่แนะนำในคำตอบอื่น ๆ


คำถามไม่มี ASP.NET ทุกที่ : |
Mohamed Thaufeeq

จริงฉันโพสต์นี้ในกรณีที่โปรแกรมเมอร์ใช้ ASP.NET มันจะมีประโยชน์สำหรับคนที่มองหาคำตอบโดยใช้กรอบ (เช่นนี้ช่วยฉัน) ฉันแค่แบ่งปันและหวังว่าบางคนจะพบว่ามีประโยชน์
Exel Gamboa

ในกรณีที่โปรแกรมเมอร์กำลังใช้ ASP.NET เขาจะเพิ่มแท็ก 'asp.net' ให้กับคำถาม : |
Mohamed Thaufeeq

0

ฉันหว่านสิ่งนี้ที่ทำงานได้อย่างสมบูรณ์แบบ!

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

0

ฉันไปงานปาร์ตี้ช้า แต่ก็ใช้งานได้ดีใน IE11, Chrome, Firefox โดยไม่ต้องทำเม้าส์ (และไม่มี 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);
        });
    }
});

ใช่ แต่ถ้าคุณfocusกด tab ลงในช่องคุณจะพบผู้ฟังเหตุการณ์ mouseup หลายคนกำลังแนบ ...
Sebastian Scholle

-1

ทางออกของฉันคือต่อไป:

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;
     });
});

ดังนั้นการวางเมาส์จะทำงานได้ตามปกติ แต่จะไม่ทำการยกเลิกการเลือกหลังจากได้รับโฟกัสโดยการป้อนข้อมูล

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