Làm cách nào để tắt lựa chọn văn bản bằng jQuery?


198

JQuery hoặc jQuery-UI có chức năng nào để vô hiệu hóa lựa chọn văn bản cho các thành phần tài liệu đã cho không?



@ John: Liên kết trên có trả lời câu hỏi của bạn không? Nếu không, bạn có thể muốn đưa ra một số chi tiết hơn về tình hình của bạn khác nhau như thế nào.
Jørn Schou-Rode

1
Có nó làm. Nhưng mặc dù câu trả lời là như nhau, nhưng câu hỏi đó rất cụ thể để nhiều người có thể bỏ lỡ câu trả lời đó trong tâm trí câu hỏi chung chung hơn (như tôi đã làm).
Dawid Ohia

@Jhon: Câu hỏi khác cũng có giải pháp jQuery.
Omar Abid

Câu trả lời:


274

Trong jQuery 1.8, điều này có thể được thực hiện như sau:

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

1
JavaScript thay thế chỉ hoạt động cho IE. "onselectstart" không khả dụng cho các trình duyệt khác
Omar Abid

13
@Omar: Tôi biết rõ điều đó.
SLaks


11
Cảm ơn vì điều đó. Tôi đã làm việc trên một thanh trượt kéo và cần một cách mà văn bản sẽ không được chọn trong quy trình.
Spencer Ruport

35
Đối với những người nói "chỉ không" để vô hiệu hóa lựa chọn văn bản (hoặc bất cứ điều gì khác về SO cho vấn đề đó), hãy mở rộng tâm trí của bạn một chút. Thông thường mọi người vô hiệu hóa nó vì lý do thẩm mỹ như tránh chọn văn bản khi nhấp đúp vào nhãn có văn bản trong đó, v.v. Vì vậy, hãy trả lời câu hỏi hoặc cung cấp một điểm truy cập thực tế và chỉ định những gì bạn đang nói về phủ định, không Không chỉ gãi ý tưởng một cách chung chung.
dudewad

102

Nếu bạn sử dụng jQuery UI, có một phương pháp cho điều đó, nhưng nó chỉ có thể xử lý lựa chọn chuột (tức là CTRL+ Avẫn hoạt động):

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

Mã này thực sự đơn giản, nếu bạn không muốn sử dụng 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
Hàm jquery ui sẽ rất tuyệt, nhưng nó không cung cấp cùng một mức độ bảo vệ, nó sẽ ngăn việc chọn trực tiếp mọi thứ, nhưng nếu bạn đang mang một lựa chọn từ một đối tượng dom khác, bạn cũng cần các quy tắc css - đây là chức năng = function () {return this.bind (($ .support.selectstart? "selectstart": "mousedown") + ".ui -eacSelection", function (event) {event.preventDefault ();}); }
chrismarx

2
Lưu ý rằng vô hiệu hóaSelection () không được dùng trong jQuery UI 1.9
mar10

Nó cũng có thể yêu cầu .on ('mousedown', false) hoạt động, tùy thuộc vào trình duyệt của bạn. Hovewer, thật nguy hiểm khi giết các sự kiện mousedown theo mặc định bởi vì điều này có thể có thể phá vỡ chức năng hiện có
Dan

1
Luận điểm Thật khó chịu, nó đã bị mất giá. Có nhiều thời gian khi bạn muốn điều này một cách hợp pháp.
Chuck Le Mông

Tôi đang tạo một menu ngữ cảnh nhấp chuột phải vào một số văn bản neo và tôi không muốn văn bản chọn khi nhấp. Vì vậy, có, @Monk, điều này sẽ đủ điều kiện là một ví dụ hợp pháp.
Wayne Smallman

75

Tôi thấy câu trả lời này ( Ngăn chặn làm nổi bật bảng văn bản ) hữu ích nhất và có lẽ nó có thể được kết hợp với một cách khác để cung cấp khả năng tương thích IE.

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

Chrome sử dụng -webkit-user-select
tim

3
Luôn đánh giá cao cách CSS để thực hiện mọi việc thay vì sử dụng jQuery hoặc JS nói chung. Cũng giống như hoạt hình jQuery so với chuyển đổi CSS, cách tích hợp vào trình duyệt luôn luôn là tốt nhất và hiệu quả nhất.
Brian Leishman

17

Đây là một giải pháp toàn diện hơn cho lựa chọn ngắt kết nối và hủy một số phím nóng (như Ctrl+ aCtrl+ c. Kiểm tra: Cmd + aCmd+ 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);

và gọi ví dụ:

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

jsfiddle.net/JBxnQ/

Điều này cũng có thể không đủ cho các phiên bản cũ của FireFox (tôi không thể biết được). Nếu tất cả điều này không hoạt động, thêm vào như sau:

.on('mousedown', false)

3
Tại sao bạn gọi attr('unselectable', 'on')hai lần? Nó là một lỗi đánh máy hay nó hữu ích?
KajMagnus

Điều này làm việc rất tốt cho tôi, nhưng tôi đã phải vô hiệu hóa ".each (function () {$ (this) .attr ('không thể chọn', 'on') .bind ('selectstart', function () {return false;} );}); " phần dành cho ứng dụng web cụ thể của tôi (JQuery Mobile), chỉ trong trường hợp nó giúp được bất cứ ai ..
Anthony

13

Sau đây sẽ vô hiệu hóa lựa chọn của tất cả các 'mục' trong tất cả các trình duyệt phổ biến (IE, Chrome, Mozilla, Opera và Safari):

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

1
Không phức tạp - Tuyệt vời! Cảm ơn bạn. Đối với người khuyết tật tìm kiếm; Tôi addded .attr ( 'khuyết tật', 'khuyết tật')
ý chí tự do

Cập nhật: thay vì .attr ('khuyết tật', 'bị vô hiệu hóa'), tôi đã sử dụng .attr ('chỉ đọc', 'chỉ đọc'). Vô hiệu hóa ngăn chặn đăng mô hình biến của tôi trong MVC (biến mô hình là null). Readonly vẫn đã vô hiệu hóa tìm kiếm (tôi sử dụng bootstrap) và nó cho phép đăng giá trị mục
ý chí tự do

Tuyệt vời, tôi sử dụng mã này để thay thế "sự kiện con trỏ: không có gì", không hoạt động trong IE 11. liên quan
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");
        });

Bạn có thể viết một bản tóm tắt ngắn gọn về câu trả lời ngoài mã không?
jonsca

6

Điều này có thể dễ dàng được thực hiện bằng JavaScript Điều này có thể áp dụng cho tất cả các Trình duyệt

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

Gọi cho chức năng này

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

Điều này là tuyệt vời! Nhưng làm thế nào để chúng ta ngừng "tập trung" vào nó?
mutanic

3
Câu trả lời này đã lỗi thời vào năm 2013
Dan

6

Điều này thực sự rất đơn giản. Để tắt lựa chọn văn bản (và cũng nhấp vào + kéo văn bản (ví dụ: liên kết trong Chrome)), chỉ cần sử dụng mã jQuery sau:

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

Tất cả điều này là ngăn chặn mặc định xảy ra khi bạn nhấp bằng chuột (mousedown() ) trong thẻ bodyhtml. Bạn có thể dễ dàng thay đổi phần tử chỉ bằng cách thay đổi các văn bản ở giữa hai dấu ngoặc kép (ví dụ như thay đổi $('body, html')để $('#myUnselectableDiv')làm cho các myUnselectableDivdiv là, tốt, unselectable.

Một đoạn nhanh để hiển thị / chứng minh điều này với bạn:

$('#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>

Xin lưu ý rằng hiệu ứng này không hoàn hảo và hoạt động tốt nhất trong khi không thể chọn toàn bộ cửa sổ. Bạn cũng có thể muốn thêm

việc hủy một số phím nóng (chẳng hạn như Ctrl+aCtrl+c. Kiểm tra: Cmd+aCmd+c)

đồng thời, bằng cách sử dụng phần đó trong câu trả lời của Vladimir ở trên. (đến bài viết của anh ấy ở đây )


1

Giải pháp 1 dòng cho CHROME:

body.style.webkitUserSelect = "none";

và FF:

body.style.MozUserSelect = "none";

IE yêu cầu thiết lập thuộc tính "không thể chọn" (chi tiết ở phía dưới).

Tôi đã thử nghiệm điều này trong Chrome và nó hoạt động. Thuộc tính này được kế thừa nên việc đặt nó trên phần tử cơ thể sẽ vô hiệu hóa lựa chọn trong toàn bộ tài liệu của bạn.

Chi tiết tại đây: http://help.dottoro.com/ljrlukea.php

Nếu bạn đang sử dụng Đóng, chỉ cần gọi chức năng này:

goog.style.setUnselectable(myElement, true);

Nó xử lý tất cả các trình duyệt trong suốt.

Các trình duyệt không phải IE được xử lý như thế này:

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

Xác định ở đây: http // clenses-l Library.googlecode.com/svn/!svn/bc/4/trunk/clenses/goog/docs/clenses_goog_style_style.js.source.html

Phần IE được xử lý như thế này:

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

Tôi nghĩ rằng mã này hoạt động trên tất cả các trình duyệt và yêu cầu ít chi phí nhất. Nó thực sự là một sự kết hợp của tất cả các câu trả lời ở trên. Hãy cho tôi biết nếu bạn tìm thấy một lỗi!

Thêm 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;}

Thêm jQuery:

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

Tùy chọn: Để vô hiệu hóa lựa chọn cho tất cả các thành phần con, bạn có thể thay đổi khối IE thành:

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

Sử dụng:

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

1

Tôi đã thử tất cả các cách tiếp cận và đây là cách đơn giản nhất đối với tôi vì tôi đang sử dụng IWebBrowser2 và không có 10 trình duyệt để tranh luận:

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

Hoạt động hoàn hảo cho tôi!


0

Một giải pháp cho vấn đề này, đối với các trường hợp thích hợp, là sử dụng một <button>văn bản mà bạn không muốn chọn. Nếu bạn liên kết với clicksự kiện trên một số khối văn bản và không muốn văn bản đó có thể được chọn, việc thay đổi nó thành một nút sẽ cải thiện ngữ nghĩa và cũng ngăn văn bản được chọn.

<button>Text Here</button>

-1

Cách tốt nhất và đơn giản nhất tôi đã tìm thấy nó, ngăn ctrl + c, nhấp chuột phải. Trong trường hợp này, tôi đã chặn mọi thứ, vì vậy tôi không phải chỉ định bất cứ điều gì.

$(document).bind("contextmenu cut copy",function(e){
    e.preventDefault();
    //alert('Copying is not allowed');
});
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.