jQuery - เลือกข้อความทั้งหมดจาก textarea


130

ฉันจะทำมันได้อย่างไรเมื่อคุณคลิกภายในพื้นที่ข้อความเนื้อหาทั้งหมดจะถูกเลือก

และในที่สุดเมื่อคุณคลิกอีกครั้งเพื่อยกเลิกการเลือก



5
@ Blender: ไม่คำถามนั้นเกี่ยวข้องกับการเน้นข้อความในองค์ประกอบไม่ใช่ textarea ทั้งสองแตกต่างกันมาก
Tim Down

คำตอบ:


194

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

jsFiddle: http://jsfiddle.net/NM62A/

รหัส:

<textarea id="foo">Some text</textarea>

<script type="text/javascript">
    var textBox = document.getElementById("foo");
    textBox.onfocus = function() {
        textBox.select();

        // Work around Chrome's little problem
        textBox.onmouseup = function() {
            // Prevent further mouseup intervention
            textBox.onmouseup = null;
            return false;
        };
    };
</script>

jQuery เวอร์ชัน:

$("#foo").focus(function() {
    var $this = $(this);
    $this.select();

    // Work around Chrome's little problem
    $this.mouseup(function() {
        // Prevent further mouseup intervention
        $this.unbind("mouseup");
        return false;
    });
});

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

2
สิ่งนี้ล้มเหลวสำหรับฉันใน Chrome วิธีแก้ปัญหาคือ: stackoverflow.com/a/6201757/126600
zack

@zack: ตัวอย่าง jsFiddle ในคำตอบนี้ใช้ได้กับฉันใน Chrome มันไม่ใช่สำหรับคุณ? ฉันยอมรับว่าคำตอบที่คุณเชื่อมโยงนั้นเข้าใจผิดได้มากกว่า
Tim Down

@TimDown: คุณพูดถูกฉันรู้สึกกระตือรือร้นเล็กน้อย - จริงๆแล้วมันทำงานได้อย่างถูกต้องเมื่อ 'คลิก' แต่จะล้มเหลวหากคุณtabเข้าไปใน textarea - วิธีอื่นของคุณใช้ได้กับทั้งสองกรณี :)
zack

เปลี่ยนรหัสข้างบนเล็กน้อยแล้วจะได้ผลเหมือนมีเสน่ห์ .. $("#foo").mouseup(function() { $("#foo").unbind("mouseup"); return false; }); คุณต้องอ้างอิง textbox โดยไม่ใช้thisเพียงแค่อ้างอิงกับเส้นทางแบบเต็ม .. แล้วมันจะได้ผล ..
pratikabu

14

วิธีที่ดีกว่าด้วยวิธีแก้ปัญหาแท็บและ Chrome และวิธี jquery ใหม่

$("#element").on("focus keyup", function(e){

        var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
        if(keycode === 9 || !keycode){
            // Hacemos select
            var $this = $(this);
            $this.select();

            // Para Chrome's que da problema
            $this.on("mouseup", function() {
                // Unbindeamos el mouseup
                $this.off("mouseup");
                return false;
            });
        }
    });

11

ฉันลงเอยด้วยการใช้สิ่งนี้:

$('.selectAll').toggle(function() {
  $(this).select();
}, function() {
  $(this).unselect();
});

แต่ฉันไม่รู้วิธีตรวจสอบว่าข้อความนั้นถูกเลือกไว้แล้วหรือไม่ดังนั้นฉันจึงสามารถย้อนกลับการกระทำสองอย่างได้ :(
Alex

1
@ อเล็กซ์: ฉันจะไม่ยุ่งกับเรื่องนี้มากเกินไปถ้าฉันเป็นคุณ ผู้ใช้คาดหวังพฤติกรรมมาตรฐานจาก textareas
Tim Down

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

@ อเล็กซ์: อาใช่ คุณอาจต้องการทำให้เป็นแบบอ่านอย่างเดียวโดยเพิ่มreadonlyแอตทริบิวต์แล้ว
Tim Down

1
@Hollister: ไม่เป็นไปได้อย่างสมบูรณ์แบบสำหรับผู้ใช้หรือสคริปต์ในการเลือกเนื้อหาภายใน div คุณอาจกำลังคิดถึงการคัดลอกไปยังคลิปบอร์ดซึ่งเป็นไปไม่ได้ในสคริปต์หากไม่มีไลบรารีที่ใช้ Flash เช่น ZeroClipboard
Tim Down


5

เวอร์ชัน jQuery ที่สั้นกว่าเล็กน้อย:

$('your-element').focus(function(e) {
  e.target.select();
  jQuery(e.target).one('mouseup', function(e) {
    e.preventDefault();
  });
});

จัดการเคสเข้ามุม Chrome ได้อย่างถูกต้อง ดูhttp://jsfiddle.net/Ztyx/XMkwm/สำหรับตัวอย่าง


4

การเลือกข้อความในองค์ประกอบ (คล้ายกับการไฮไลต์ด้วยเมาส์ของคุณ)

:)

เมื่อใช้คำตอบที่ยอมรับในโพสต์นั้นคุณสามารถเรียกใช้ฟังก์ชันดังนี้:

$(function() {
  $('#textareaId').click(function() {
    SelectText('#textareaId');
  });
});

บางทีการตั้งค่าสถานะคำถามนี้ว่าซ้ำกันอาจมีประโยชน์มากกว่า มันไม่ใช่คำตอบของคุณจริงๆดังนั้นจึงเป็นการดีกว่าที่จะรวมสองคำถามเข้าด้วยกัน
Blender

เห็นด้วย - แม้ว่า OP จะได้รับประโยชน์จากคำอธิบายเพิ่มเติมสำหรับการนำไปใช้งานของเธอ :)
ทอดด์

คำถามนั้นเกี่ยวข้องกับการเน้นข้อความในองค์ประกอบไม่ใช่พื้นที่ข้อความ ทั้งสองแตกต่างกันมาก
Tim Down

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