ダブルクリック後のテキスト選択を防止


294

Webアプリのスパンでdblclickイベントを処理しています。副作用として、ダブルクリックでページ上のテキストが選択されます。この選択が行われないようにするにはどうすればよいですか?

回答:


351
function clearSelection() {
    if(document.selection && document.selection.empty) {
        document.selection.empty();
    } else if(window.getSelection) {
        var sel = window.getSelection();
        sel.removeAllRanges();
    }
}

これらのスタイルを、IE以外のすべてのブラウザとIE10のスパンに適用することもできます。

span.no_selection {
    user-select: none; /* standard syntax */
    -webkit-user-select: none; /* webkit (safari, chrome) browsers */
    -moz-user-select: none; /* mozilla browsers */
    -khtml-user-select: none; /* webkit (konqueror) browsers */
    -ms-user-select: none; /* IE10+ */
}

44
実際に選択を削除するのではなく、選択を実際に防ぐ方法はありますか?また、読みやすくするために、2番目のifステートメントをelse内に置くこともできます。
デビッド

8
-moz-(およびKonquerorのオーディエンスが多い場合は-khtml-)に加えて、-webkit-プレフィックス(これはWebkitベースのブラウザーで推奨されるプレフィックス)を使用するのが最適です。
まぶたのなさ2009年

3
これは、IE10で利用可能になりました-ms-user-select: none;を参照してくださいblogs.msdn.com/b/ie/archive/2012/01/11/... @PaoloBergantino
レモン

1
@TimHarper:ライブラリを使用するJavaScriptソリューションに関しては、確かに。なぜそれが反対投票を正当化するのか本当にわかりません。
Paolo Bergantino 2012

14
ダブルクリックで選択を無効にすることと完全に無効にすることの間には違いがあります。1つ目は、使いやすさを向上させます。2番目が減少します。
Robo Robok、2015

112

プレーンなJavaScriptでは:

element.addEventListener('mousedown', function(e){ e.preventDefault(); }, false);

またはjQueryで:

jQuery(element).mousedown(function(e){ e.preventDefault(); });

26
うん、私はこれを使って、私が抱えていたのと同じ問題を解決しました(+1)。ただし、マウスダウン時に他のハンドラーを殺さない代わりにreturn false使用event.preventDefault()しました。
Simon East、

2
これにより、ページ上の
textarea

1
@johnktejik elementは、textareaの場合のみです(はい)。
fregante

11
このイベントハンドラーが "dblclick"に割り当てられることを期待しますが、これは機能しません。「マウスダウン」を使用すると、ドラッグによってテキストを選択することもできなくなります。
corwin.amber 2016年

74

ダブルクリック後にのみテキストが選択されないようにするには:

MouseEvent#detailプロパティを使用できます。mousedownイベントまたはmouseupイベントの場合、1に現在のクリック数を加えたものです。

document.addEventListener('mousedown', function (event) {
  if (event.detail > 1) {
    event.preventDefault();
    // of course, you still do not know what you prevent here...
    // You could also check event.ctrlKey/event.shiftKey/event.altKey
    // to not prevent something useful.
  }
}, false);

https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detailを参照してください


4
これはすごい!Firefoxの53で動作します
Zaroth

6
これは受け入れられる答えになるはずです。ここでの他のすべてではなく、OPの質問「に答えるのいずれかのマウス選択(またはさらに悪い)防止をダブルクリックした後に防ぎ、テキストの選択を
billynoah

1
Chromeでも動作します
KS74

1
IE 11 Windows 10 =)でも動作します。これを共有してくれてありがとう。
フェルナンドビエイラ

(event.detail === 2)ダブルクリックのみを防止するために使用します(トリプルクリックなどは不可)
Robin Stewart

32

FWIW、親要素のどこかをダブルクリックしたときに、どういうわけか選択したくない子要素の親要素に設定user-select: noneしました。そしてそれはうまくいきます!クールなことは、テキストの選択などがまだ子要素で機能することです!contenteditable="true"

以下のようなので:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>

おかげで、style="user-select: note"私が解決しようとしていた問題を並べ替えました:)
esaruoho

基本的にテキストを選択可能にしたくない場合の、CSSのみの優れたソリューション。ありがとう!
Ian Lovejoy

11

ページ要素内のコンテンツを選択不可にする単純なJavaScript関数:

function makeUnselectable(elem) {
  if (typeof(elem) == 'string')
    elem = document.getElementById(elem);
  if (elem) {
    elem.onselectstart = function() { return false; };
    elem.style.MozUserSelect = "none";
    elem.style.KhtmlUserSelect = "none";
    elem.unselectable = "on";
  }
}

4

Angular 2+のソリューションをお探しの方に。

mousedownテーブルセルの出力を使用できます。

<td *ngFor="..."
    (mousedown)="onMouseDown($event)"
    (dblclick) ="onDblClick($event)">
  ...
</td>

場合は防止しdetail > 1ます。

public onMouseDown(mouseEvent: MouseEvent) {
  // prevent text selection for dbl clicks.
  if (mouseEvent.detail > 1) mouseEvent.preventDefault();
}

public onDblClick(mouseEvent: MouseEvent) {
 // todo: do what you really want to do ...
}

dblclick期待通りの出力が仕事に続きます。


3

または、mozillaの場合:

document.body.onselectstart = function() { return false; } // Or any html object

IEでは、

document.body.onmousedown = function() { return false; } // valid for any html object as well

5
この解決策では、テキストを選択できません。
jmav

1
@jmavより具体的な要素に関数オーバーライドを適用する必要がありますdocument.body
Cypher

2

古いスレッドですが、オブジェクトにバインドされているすべての偶数を無効にするのではなく、ページ上のランダムで不要なテキストの選択のみを防ぐため、よりクリーンであると私は思いました。それは簡単で、私にはうまくいきます。以下に例を示します。「右矢印」クラスのオブジェクトを数回クリックしたときにテキストが選択されないようにしたい:

$(".arrow-right").hover(function(){$('body').css({userSelect: "none"});}, function(){$('body').css({userSelect: "auto"});});

HTH!


1

任意の方法で、またダブルクリックでのみテキストを選択しないようにする場合は、user-select: nonecss属性を使用できます。私はChrome 68でテストしましたが、https://caniuse.com/#search=user-selectによると、それは他の現在の通常のユーザーのブラウザーで動作するはずです。

動作上、Chrome 68では子要素によって継承され、要素を囲むテキストを含むテキストが選択された場合でも、要素に含まれるテキストを選択できませんでした。


0

IE 8のCTRLおよびSHIFTを防ぐには、個々の要素のテキスト選択をクリックします

var obj = document.createElement("DIV");
obj.onselectstart = function(){
  return false;
}

ドキュメントでテキストが選択されないようにするには

window.onload = function(){
  document.onselectstart = function(){
    return false;
  }
}

-2

同じ問題がありました。に切り替えて<a>追加することで解決しましたonclick="return false;"(クリックするとブラウザの履歴に新しいエントリが追加されません)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.