jQueryを使用してテキスト選択を無効にする方法は?


198

jQueryまたはjQuery-UIには、特定のドキュメント要素のテキスト選択を無効にする機能がありますか?



@ジョン:上のリンクはあなたの質問に答えますか?そうでない場合は、状況がどのように異なるかについて、もう少し詳しく説明することをお勧めします。
–JørnSchou-Rode、2010

1
はい、そうです。しかし、答えは同じですが、その質問は非常に具体的であるため、より一般的な質問を念頭に置いて(多くの場合)多くの人がその答えを見逃す可能性があります。
Dawid Ohia

@Jhon:他の質問にも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
@オマール:私はそれをよく知っています。
SLak、


11
これをありがとう。スライダーをドラッグする作業をしていて、その過程でテキストが選択されないようにする方法が必要でした。
Spencer Ruport

35
テキストの選択を無効にすることを「やめて」と言っている人(またはそのことについてはSOの他の何か)には、あなたの心を少しだけ開いてください。多くの場合、テキストが含まれているラベルのダブルクリックでのテキスト選択を回避するなど、審美的な理由でそれを無効にします。そのため、質問に答えるか、実際のカウンターポイントを提供して、否定について話していることを指定してください。一般的な方法でアイデアを一掃するだけではありません。
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 '08

2
disableSelection()はjQuery UI 1.9
mar10

また、ブラウザによっては、.on( 'mousedown'、false)が機能する必要があります。Hovewer、デフォルトでマウスダウンイベントを強制終了することは危険です。これはおそらく既存の機能を停止させる可能性があるためです
Dan

1
Arg。それが減価償却されているのは不愉快です。これを正当にしたいときはたくさんあります。
チャックルバット

一部のアンカーテキストで右クリックコンテキストメニューを作成していますが、クリックでテキストを選択したくありません。つまり、@ Monk、これは正当な例と見なされます。
ウェインスモールマン2014年

75

私はこの回答(テキストテーブルのハイライトを防ぐ)が最も役に立ち、おそらくIEとの互換性を提供する別の方法と組み合わせることができます。

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

Chromeは-webkit-user-selectを使用
tim

3
一般的にjQueryやJSを使用するのではなく、CSSで実行する方法に常に感謝します。jQueryアニメーションとCSSトランジションのように、ブラウザーに組み込まれている方法が常に最良かつ最も効率的です。
ブライアンリーシュマン2015年

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

これは私にとってはうまくいきましたが、 "。each(function(){$(this).attr( 'unselectable'、 'on').bind( 'selectstart'、function(){return false;}を無効にする必要がありました);});」私の特定のWebアプリ(JQuery Mobile)のセクション。誰かを助けるために..
アンソニー

13

次の例では、すべての一般的なブラウザー(IE、Chrome、Mozilla、Opera、Safari)ですべてのクラス「item」の選択を無効にします。

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

1
複雑ではない-すばらしい!ありがとうございました。身体障害者向け; 私は.attr( 'disabled'、 'disabled')を追加しました
freewill

更新:.attr( 'disabled'、 'disabled')の代わりに、.attr( 'readonly'、 'readonly')を使用しました。無効にすると、モデル変数がMVCに投稿されなくなります(モデル変数がnull)。読み取り専用はまだ探しを無効にしており(私はブートストラップを使用しています)、アイテムの値を投稿できます
freewill

優秀な仲間、私はこのコードを使用して "pointer-events:none;"を置き換えますが、IE 11では機能しません。よろしく
お願いします

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>

これは素晴らしい!しかし、どうすればその「焦点」を止めることができるでしょうか。
2013

3
この回答は、2013年までに古くなっ
ダン・

6

これは実際には非常に簡単です。テキストの選択を無効にするには(また、テキストをクリックしてドラッグすると(例:Chromeのリンク))、次のjQueryコードを使用します。

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

これmousedown()により、bodyおよびhtmlタグ内でマウス()をクリックしたときにデフォルトが発生しなくなります。2つの引用符の間のテキストを変更するだけで、要素を非常に簡単に変更できます(たとえば、divを選択不可にするためにに変更$('body, html')します)。$('#myUnselectableDiv')myUnselectableDiv

これを表示/証明する簡単なスニペット:

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

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

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

これに対する適切なケースの1つの解決策は、<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.