วิธีปิดการเลือกข้อความโดยใช้ jQuery


198

jQuery หรือ jQuery-UI มีฟังก์ชั่นใด ๆ เพื่อปิดการใช้งานการเลือกข้อความสำหรับองค์ประกอบเอกสารที่กำหนดหรือไม่?


3
ซ้ำซ้อนที่เป็นไปได้ : stackoverflow.com/questions/1319126/prevent-highlight-of-text
Jørn Schou-Rode

@John: ลิงก์ด้านบนตอบคำถามของคุณหรือไม่ หากไม่เป็นเช่นนั้นคุณอาจต้องการรายละเอียดเพิ่มเติมว่าสถานการณ์ของคุณแตกต่างกันอย่างไร
Jørn Schou-Rode

1
ใช่แล้ว. แต่ถึงแม้ว่าคำตอบจะเหมือนกัน แต่คำถามนั้นจำเพาะเจาะจงมากดังนั้นหลายคนอาจพลาดคำตอบนั้นได้โดยคำนึงถึงคำถามทั่วไปที่มากกว่า (เหมือนที่ฉันทำ)
Dawid Ohia

@ จอน: คำถามอื่น ๆ ก็มีวิธีแก้ปัญหา jQuery ด้วย
Omar Abid

คำตอบ:


274

ใน jQuery 1.8 สามารถทำได้ดังนี้:

(function($){
    $.fn.disableSelection = function() {
        return this
                 .attr('unselectable', 'on')
                 .css('user-select', 'none')
                 .on('selectstart', false);
    };
})(jQuery);

1
ทางเลือก JavaScript ใช้งานได้กับ IE เท่านั้น "onselectstart" ใช้งานไม่ได้กับเบราว์เซอร์อื่น
Omar Abid

13
@ Omar: ฉันตระหนักดีว่า
SLAK


11
ขอบคุณสำหรับสิ่งนี้. ฉันกำลังทำงานกับแถบเลื่อนลากและต้องการวิธีที่ข้อความจะไม่ถูกเลือกในกระบวนการ
Spencer Ruport

35
สำหรับผู้ที่พูดว่า "ไม่ต้อง" เพื่อปิดใช้งานการเลือกข้อความ (หรืออย่างอื่นใน SO สำหรับเรื่องนั้น) ให้เปิดใจเล็กน้อย บ่อยครั้งที่ผู้คนปิดการใช้งานด้วยเหตุผลด้านสุนทรียภาพเช่นหลีกเลี่ยงการเลือกข้อความในการคลิกสองครั้งที่ป้ายกำกับที่มีข้อความอยู่ ฯลฯ ดังนั้นให้ตอบคำถามหรือให้จุดตอบโต้ที่แท้จริงและระบุสิ่งที่คุณกำลังพูดถึง ไม่เพียงเกาความคิดในลักษณะทั่วไป
dudewad

102

หากคุณใช้ jQuery UI มีวิธีการดังกล่าว แต่สามารถจัดการกับการเลือกเมาส์ได้ (เช่นCTRL+ Aยังคงใช้งานได้):

$('.your-element').disableSelection(); // deprecated in jQuery UI 1.9

รหัสง่ายจริง ๆ ถ้าคุณไม่ต้องการใช้ jQuery UI:

$(el).attr('unselectable','on')
     .css({'-moz-user-select':'-moz-none',
           '-moz-user-select':'none',
           '-o-user-select':'none',
           '-khtml-user-select':'none', /* you could also put this in a class */
           '-webkit-user-select':'none',/* and add the CSS class here instead */
           '-ms-user-select':'none',
           'user-select':'none'
     }).bind('selectstart', function(){ return false; });

1
ฟังก์ชั่น jquery ui นั้นยอดเยี่ยม แต่มันไม่มีการป้องกันในระดับเดียวกันมันป้องกันการเลือกสิ่งต่าง ๆ โดยตรง แต่ถ้าคุณเลือกสิ่งที่ต้องการจากวัตถุ dom ตัวอื่นคุณต้องใช้กฎ css เช่นกัน = function () {return this.bind (($ .support.selectstart? "selectstart": "mousedown") + ".ui-disableSelection", ฟังก์ชั่น (เหตุการณ์) {event.preventDefault ();}); }
chrismarx

2
โปรดทราบว่า disableSelection () เลิกใช้แล้วใน jQuery UI 1.9
มีนาคม 10

นอกจากนี้ยังอาจต้องการ. on ('mousedown', false) ในการทำงานขึ้นอยู่กับเบราว์เซอร์ของคุณ โดยปกติแล้วมันมีอันตรายที่จะฆ่าเหตุการณ์ที่เกิดขึ้นกับ mousedown เนื่องจากอาจทำให้ฟังก์ชันการทำงานที่มีอยู่เดิมหยุดชะงัก
Dan

1
หาเรื่อง มันน่ารำคาญมันถูกคิดค่าเสื่อมราคา มีเวลาอีกมากเมื่อคุณต้องการสิ่งนี้อย่างถูกกฎหมาย
Chuck Le Butt

ฉันกำลังสร้างเมนูบริบทคลิกขวาบนสมอข้อความและฉันไม่ต้องการให้ข้อความเลือกเมื่อคลิก ดังนั้นใช่ @Monk สิ่งนี้จะถือว่าเป็นตัวอย่างที่ถูกต้องตามกฎหมาย
Wayne Smallman

75

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

#yourTable
{
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  user-select: none;
}

Chrome ใช้ -webkit ผู้ใช้เลือก
ทิม

3
ขอขอบคุณวิธี CSS ในการทำสิ่งต่างๆแทนที่จะใช้ jQuery หรือ JS โดยทั่วไป เช่นเดียวกับภาพเคลื่อนไหว jQuery เทียบกับการเปลี่ยน CSS วิธีที่สร้างไว้ในเบราว์เซอร์จะดีที่สุดและมีประสิทธิภาพมากที่สุด
Brian Leishman

17

นี่เป็นทางออกที่ครอบคลุมมากขึ้นในการเลือกตัดการเชื่อมต่อและยกเลิกบางส่วนของปุ่มลัด (เช่นCtrl+ aและCtrl+ c. การทดสอบ: Cmd + aและCmd+ c)

(function($){

  $.fn.ctrlCmd = function(key) {

    var allowDefault = true;

    if (!$.isArray(key)) {
       key = [key];
    }

    return this.keydown(function(e) {
        for (var i = 0, l = key.length; i < l; i++) {
            if(e.keyCode === key[i].toUpperCase().charCodeAt(0) && e.metaKey) {
                allowDefault = false;
            }
        };
        return allowDefault;
    });
};


$.fn.disableSelection = function() {

    this.ctrlCmd(['a', 'c']);

    return this.attr('unselectable', 'on')
               .css({'-moz-user-select':'-moz-none',
                     '-moz-user-select':'none',
                     '-o-user-select':'none',
                     '-khtml-user-select':'none',
                     '-webkit-user-select':'none',
                     '-ms-user-select':'none',
                     'user-select':'none'})
               .bind('selectstart', false);
};

})(jQuery);

และตัวอย่างการโทร:

$(':not(input,select,textarea)').disableSelection();

jsfiddle.net/JBxnQ/

สิ่งนี้อาจไม่เพียงพอสำหรับ FireFox รุ่นเก่า (ฉันไม่สามารถบอกได้) หากสิ่งนี้ไม่ได้ผลให้เพิ่มรายการต่อไปนี้:

.on('mousedown', false)

3
ทำไมคุณโทรattr('unselectable', 'on')สองครั้ง มันพิมพ์ผิดหรือมีประโยชน์หรือไม่?
KajMagnus

สิ่งนี้ใช้ได้ผลดีสำหรับฉัน แต่ฉันต้องปิดการใช้งาน ".each (function () {$ (this) .attr ('unselectable', 'on') .bind ('selectstart', function () {return false;} );}); " ส่วนสำหรับแอปพลิเคชันเว็บโดยเฉพาะของฉัน (JQuery Mobile) ในกรณีที่มันช่วยทุกคน ..
Anthony

13

ต่อไปนี้จะปิดการเลือก 'รายการ' คลาสทั้งหมดในเบราว์เซอร์ทั่วไปทั้งหมด (IE, Chrome, Mozilla, Opera และ Safari):

$(".item")
        .attr('unselectable', 'on')
        .css({
            'user-select': 'none',
            'MozUserSelect': 'none'
        })
        .on('selectstart', false)
        .on('mousedown', false);

1
ไม่ซับซ้อน - ยอดเยี่ยม! ขอบคุณ. สำหรับผู้พิการมอง ฉัน addded .attr ( 'คนพิการ', 'คนพิการ')
ด้วยใจสมัคร

อัปเดต: แทนที่. atr ('ปิดใช้งาน', 'ปิดใช้งาน') ฉันใช้. atrr ('อ่านอย่างเดียว', 'อ่านอย่างเดียว') Disabled ป้องกันการโพสต์ model model ของฉันใน MVC (ตัวแปร model เป็นโมฆะ) อ่านได้อย่างเดียวยังคงปิดการใช้งานมอง (ผมใช้บูต) และจะช่วยให้การโพสต์มูลค่ารายการ
ฟรีวิลล์

พี่ชายยอดเยี่ยมฉันใช้รหัสนี้เพื่อแทนที่ "ตัวชี้เหตุการณ์: none;" ที่ไม่ทำงานใน IE 11 ขอแสดงความนับถือ
Shortys Oberto Dutari

8
        $(document).ready(function(){
            $("body").css("-webkit-user-select","none");
            $("body").css("-moz-user-select","none");
            $("body").css("-ms-user-select","none");
            $("body").css("-o-user-select","none");
            $("body").css("user-select","none");
        });

คุณสามารถเขียนสรุปย่อของคำตอบเพิ่มเติมจากรหัสได้หรือไม่
jonsca

6

สามารถทำได้อย่างง่ายดายโดยใช้ JavaScript ซึ่งสามารถใช้ได้กับเบราว์เซอร์ทั้งหมด

<script type="text/javascript">

/***********************************************
* Disable Text Selection script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
***********************************************/

function disableSelection(target){
if (typeof target.onselectstart!="undefined") //For IE 
    target.onselectstart=function(){return false}
else if (typeof target.style.MozUserSelect!="undefined") //For Firefox
    target.style.MozUserSelect="none"
else //All other route (For Opera)
    target.onmousedown=function(){return false}
target.style.cursor = "default"
}
 </script>

เรียกฟังก์ชั่นนี้

<script type="text/javascript">
   disableSelection(document.body)
</script>

อันนี้ดีมาก! แต่เราจะหยุด "โฟกัส" บนมันได้อย่างไร
Mutanic

3
คำตอบนี้ล้าสมัยในปี 2013
Dan

6

อันนี้ง่ายมากจริงๆ หากต้องการปิดใช้งานการเลือกข้อความ (และคลิก + ข้อความลาก (เช่นลิงก์ใน Chrome)) ให้ใช้รหัส jQuery ต่อไปนี้:

$('body, html').mousedown(function(event) {
    event.preventDefault();
});

สิ่งทั้งหมดนี้เป็นการป้องกันการเริ่มต้นที่เกิดขึ้นเมื่อคุณคลิกด้วยเมาส์ ( mousedown()) ในbodyและhtmlแท็ก คุณสามารถเปลี่ยนองค์ประกอบได้อย่างง่ายดายเพียงแค่เปลี่ยนข้อความที่อยู่ในระหว่างเครื่องหมายคำพูดทั้งสอง (เช่นเปลี่ยน$('body, html')เป็น$('#myUnselectableDiv')เพื่อให้myUnselectableDivdiv เป็นดีไม่สามารถเลือกได้

ตัวอย่างสั้น ๆ เพื่อแสดง / พิสูจน์สิ่งนี้ต่อคุณ:

$('#no-select').mousedown(function(event) {
  event.preventDefault();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span id="no-select">I bet you can't select this text, or drag <a href="#">this link</a>, </span>
<br/><span>but that you can select this text, and drag <a href="#">this link</a>!</span>

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

ยกเลิกบางส่วนของปุ่มลัด (เช่นCtrl+aและCtrl+c. การทดสอบ: Cmd+aและCmd+c)

เช่นกันโดยใช้ส่วนของคำตอบของ Vladimir ด้านบน (ไปที่โพสต์ของเขาที่นี่ )


1

โซลูชัน 1 บรรทัดสำหรับโครม:

body.style.webkitUserSelect = "none";

และ FF:

body.style.MozUserSelect = "none";

IE ต้องการการตั้งค่าคุณลักษณะ "ไม่สามารถเลือกได้" (รายละเอียดด้านล่าง)

ฉันทดสอบสิ่งนี้ใน Chrome แล้วก็ใช้งานได้ คุณสมบัตินี้ได้รับการสืบทอดดังนั้นการตั้งค่าองค์ประกอบร่างกายจะปิดใช้งานการเลือกในเอกสารทั้งหมดของคุณ

รายละเอียดที่นี่: http://help.dottoro.com/ljrlukea.php

หากคุณกำลังใช้การปิดอยู่ให้เรียกใช้ฟังก์ชันนี้:

goog.style.setUnselectable(myElement, true);

จัดการกับเบราว์เซอร์ทั้งหมดอย่างโปร่งใส

เบราว์เซอร์ที่ไม่ใช่ IE ได้รับการจัดการเช่นนี้:

goog.style.unselectableStyle_ =
    goog.userAgent.GECKO ? 'MozUserSelect' :
    goog.userAgent.WEBKIT ? 'WebkitUserSelect' :
    null;

กำหนดไว้ที่นี่: http://closure-library.googlecode.com/svn/!svn/bc/4/trunk/closure/goog/docs/closure_goog_style_style.js.source.html

ส่วน IE ได้รับการจัดการเช่นนี้:

if (goog.userAgent.IE || goog.userAgent.OPERA) {
// Toggle the 'unselectable' attribute on the element and its descendants.
var value = unselectable ? 'on' : '';
el.setAttribute('unselectable', value);
if (descendants) {
  for (var i = 0, descendant; descendant = descendants[i]; i++) {
    descendant.setAttribute('unselectable', value);
  }
}

1

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

เพิ่ม CSS:

.no_select { user-select: none; -o-user-select: none; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; -ms-user-select:none;}

เพิ่ม jQuery:

(function($){
    $.fn.disableSelection = function() 
    {       
        $(this).addClass('no_select');              
        if($.browser.msie)
        {
            $(this).attr('unselectable', 'on').on('selectstart', false);            
        }
    return this;            
};
})(jQuery);

ทางเลือก: เมื่อต้องการปิดใช้งานการเลือกสำหรับองค์ประกอบลูกทั้งหมดด้วยคุณสามารถเปลี่ยนบล็อก IE เป็น:

$(this).each(function() {
    $(this).attr('unselectable','on')
    .bind('selectstart',function(){ return false; });
});

การใช้งาน:

$('.someclasshere').disableSelection();

1

ฉันได้ลองวิธีการทั้งหมดแล้วและวิธีนี้ง่ายที่สุดสำหรับฉันเพราะฉันใช้ IWebBrowser2 และไม่มีเบราว์เซอร์ 10 รายการที่จะโต้แย้ง:

document.onselectstart = new Function('return false;');

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


0

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

<button>Text Here</button>

-1

วิธีที่ดีที่สุดและง่ายที่สุดที่ฉันพบคือป้องกัน ctrl + c คลิกขวา ในกรณีนี้ฉันบล็อกทุกอย่างดังนั้นฉันจึงไม่ต้องระบุอะไรเลย

$(document).bind("contextmenu cut copy",function(e){
    e.preventDefault();
    //alert('Copying is not allowed');
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.