如何使用jQuery禁用文本选择?

时间:2010-04-23 15:54:21

标签: javascript jquery jquery-ui

jQuery或jQuery-UI是否具有禁用给定文档元素的文本选择的任何功能?

13 个答案:

答案 0 :(得分:271)

在jQuery 1.8中,可以按如下方式完成:

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

答案 1 :(得分:101)

如果你使用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; });

答案 2 :(得分:73)

我发现这个答案(Prevent Highlight of Text Table)最有帮助,也许它可以与另一种提供IE兼容性的方式相结合。

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

答案 3 :(得分:16)

这是一个更全面的断开选择解决方案,并取消了一些热键(例如 Ctrl + a Ctrl + c Test: 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)

答案 4 :(得分:12)

以下将禁用所有常见浏览器(IE,Chrome,Mozilla,Opera和Safari)中所有类“item”的选择:

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

答案 5 :(得分: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");
        });

答案 6 :(得分: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>

答案 7 :(得分:6)

这实际上非常简单。 要禁用文本选择(还单击+拖动文本(例如Chrome中的链接)),只需使用以下jQuery代码:

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

所有这一切都可以防止在mousedown()body标记中点击鼠标(html)时发生默认设置。您可以通过更改两个引号之间的文本来轻松更改元素(例如,将$('body, html')更改为$('#myUnselectableDiv'),以使myUnselectableDiv div成为,不可选择。

向您展示/证明这一点的快速摘要:

$('#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 Test: Cmd + a Cmd + c

同样,使用上面弗拉基米尔的回答。 (到他的帖子here

答案 8 :(得分:1)

CHROME的1行解决方案:

body.style.webkitUserSelect = "none";

和FF:

body.style.MozUserSelect = "none";

IE需要设置“不可选择”属性(详见底部)。

我在Chrome中对此进行了测试,但它确实有效。此属性是继承的,因此在body元素上设置它将禁用整个文档中的选择。

详细信息:http://help.dottoro.com/ljrlukea.php

如果您正在使用Closure,请调用此函数:

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

答案 9 :(得分: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();

答案 10 :(得分:0)

对于适当的情况,对此的一个解决方案是使用<button>作为您不希望选择的文本。如果您绑定某些文本块上的click事件,并且不希望该文本可选,则将其更改为按钮将改善语义并防止文本被选中。

<button>Text Here</button>

答案 11 :(得分:0)

我已经尝试了所有的方法,这个对我来说最简单,因为我使用的是IWebBrowser2并且没有10个浏览器可以应对:

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

完美适合我!

答案 12 :(得分:-1)

我发现它的最佳和最简单的方法,防止ctrl + c,右键单击。在这种情况下,我阻止了所有内容,因此我无需指定任何内容。

$(document).bind("contextmenu cut copy",function(e){
    e.preventDefault();
    //alert('Copying is not allowed');
});