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


198

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



@John:上面的链接是否回答了您的问题?如果不是这样,您可能想更详细地说明您的情况如何不同。
约恩·舒德罗德(JørnSchou-Rode)2010年

1
是的,它确实。但是,尽管答案是相同的,但该问题非常具体,因此考虑到更笼统的问题(如我所做的那样),许多人可能会错过该答案。
戴维·奥希亚

@Jhon:另一个问题也有jQuery解决方案。
奥马尔·阿比德

Answers:


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

13
@Omar:我很清楚。
SLaks 2010年


11
谢谢你 我正在使用拖动滑块,因此需要一种在此过程中不会选择文本的方式。
Spencer Ruport

35
对于那些对禁用文本选择(或在此问题上的其他事情)说“只是不做”的人,请稍微开放您的思想。人们经常出于美学原因将其禁用,例如避免双击带有标签的标签来选择文本等。因此,请回答问题或提供实际的对策,然后指定您要讨论的否定内容,不要不只是以一般的方式将想法弄清楚。
dudewad 2013年

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”,function(event){event.preventDefault();}); }
chrismarx 2011年

2
请注意,jQuery UI 1.9中已弃用disableSelection()
2013年

根据您的浏览器,它可能还需要.on('mousedown',false)才能工作。Hovewer,在默认情况下,杀死mousedown事件很危险,因为这可能会破坏现有功能
Dan Dan

1
精氨酸 令人讨厌的是它已经贬值了。您有很多时间可以合法地想要这个。
Chuck Le Butt 2013年

我正在一些锚文本上创建一个右键单击上下文菜单,但我不想单击该文本。是的,@ Monk,这将是一个合法的例子。
韦恩·史密曼

75

我发现此答案(防止文本表突出显示)最有帮助,也许可以将其与提供IE兼容性的另一种方式结合使用。

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

Chrome使用-webkit-user-select
蒂姆

3
总是欣赏CSS的处理方式,而不是通常使用jQuery或JS。就像jQuery动画与CSS过渡一样,浏览器内置的方式始终是最好,最高效的。
Brian Leishman

17

这是断开选择和取消某些热键(例如Ctrl+ aCtrl+ 的更全面的解决方案c测试: 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);

并调用示例:

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

jsfiddle.net/JBxnQ/

这对于旧版本的FireFox还是不够的(我不知道是哪个版本)。如果这一切都不起作用,请添加以下内容:

.on('mousedown', false)

3
你为什么打attr('unselectable', 'on')两次电话?是错字还是有用?
KajMagnus '02

这对我来说很棒,但是我不得不禁用“ .each(function(){$(this).attr('unselectable','on').bind('selectstart',function(){return false;} );});“ 我的特定Web应用程序(JQuery Mobile)部分,以防万一它对任何人
安东尼

13

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

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

1
不复杂-非常好!谢谢。适合残障人士;我添加了.attr('disabled','disabled')
自由意志

更新:我使用了.attr('readonly','readonly')而不是.attr('disabled','disabled')。禁用可防止在MVC中发布我的模型变量(模型变量为null)。只读仍然禁用外观(我使用引导程序),并且它允许发布项目值
自由意志2014年

优秀的兄弟,我使用此代码替换了“指针事件:无;”,这在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 2012年

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

3
该答案在2013
丹,

6

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

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

这一切都是为了防止mousedown()bodyhtml标签中用鼠标()单击时发生默认设置。你可以很容易只是通过改变文本之间的两个引号(如改变而改变的元素$('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+aCtrl+c测试: Cmd+aCmd+c

同样,通过使用以上弗拉基米尔答案的这一部分。(在这里找到他的帖子)


1

1条用于CHROME的解决方案

body.style.webkitUserSelect = "none";

和FF:

body.style.MozUserSelect = "none";

IE需要设置“ unselectable”属性(详细信息在底部)。

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

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

在适当情况下,一种解决方案是将a <button>用作您不想选择的文本。如果您要绑定到click某个文本块上的事件,并且不希望该文本是可选择的,则将其更改为按钮将改善语义,并且还会阻止选择文本。

<button>Text Here</button>

-1

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

$(document).bind("contextmenu cut copy",function(e){
    e.preventDefault();
    //alert('Copying is not allowed');
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.