カーソルドラッグでテキスト/要素が選択されないようにするにはどうすればよいですか


83

ページングコントロールを作成しましたが、ボタンをクリックしているときに、個々の画像やテキストを誤って選択してしまうことが非常に簡単であることに気付きました。これを防ぐことは可能ですか?

選択を明確にするために、私はマウスで強調表示することを意味します。(画面の片側から反対側にマウスをドラッグしてみてください。)

このグリッドのテキスト/コントロールを強調表示しようとすると、選択できません。それはどのように行われますか? リンク



回答:


108

ドラッグして選択すると、マウスダウンイベントで初期化され、その後のマウス移動で更新されます。イベントを処理してドラッグを開始するか、マウスを追跡する場合は、イベントのバブリングをキャンセルし、デフォルトのブラウザリターンを上書きします。

このようなもので、マウスを下にドラッグしてハンドラーを移動し始めます-

e=e || window.event;
pauseEvent(e);
function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}

11
ええ、e.preventDefault()はあなたが現代のブラウザで必要とするすべてであるはずです。コードの残りの部分は冗長です。window.eventは古いバージョンのIE用ですが、これらのイベントにはpreventDefaultメソッドがなく、pauseEvent関数呼び出しでfalseが返されないため、何も実行されません。 (2011年でもありません)。
Sjeiti 2015年

17
CSS:user-select: none;私が使用しているものです。JSがこれを解決する必要はもうありません
Drenai 2017

53

ドラッグする場合は、mousedownmousemoveイベントをキャプチャします。(そして、うまくいけばtouchstarttouchmoveイベントも、タッチインターフェイスをサポートするために。)

ブラウザがテキストを選択しないようにするにevent.preventDefault()downmoveイベントとイベントの両方を呼び出す必要があります。

例(jQueryを使用):

var mouseDown = false;
$(element).on('mousedown touchstart', function(event) {
  event.preventDefault();
  mouseDown = true;
});
$(element).on('mousemove touchmove', function(event) {
  event.preventDefault();
  if(mouseDown) {
    // Do something here.
  }
});
$(window.document).on('mouseup touchend', function(event) {
  // Capture this event anywhere in the document, since the mouse may leave our element while mouse is down and then the 'up' event will not fire within the element.
  mouseDown = false;
});

おかげでロビン、好奇心との間に差があるwindow.documentwindowか、ただのdocument?私はかなり確信しているdocumentの子であるwindow...
マフィンマン

1
windowJavascriptがブラウザで実行される最も外側のスコープです。したがって、関数内で宣言されていない変数はすべて、のプロパティですwindowdocument直接参照することは、実際にはを参照することwindow.documentです。
Robin Daugherty 2013年

4
私が知る限り、「mousedown」イベントのみでデフォルトをキャンセルするだけで十分です。
震え2017

24

これは非常に古い投稿です。それはその状況に正確に答えないかもしれませんが、私は私の解決策にCSSを使用しています:

-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;

これは私がまさに必要だった
リュック-Olsthoorn

19

コメントしたかったのですが、評判がよくありません。@kennebecから提案された関数を使用すると、JavaScriptドラッグライブラリの問題が解決しました。それは完璧に動作します。

function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}

右の要素をクリックしたことを認識した直後に、mousedownおよびmousemoveカスタム関数で呼び出しました。関数のすぐ上で呼び出すと、ドキュメントのクリックをすべて強制終了します。私の関数はdocument.bodyにイベントとして登録されています。


2
もう10個あります:)
Adaptabi



0

次のように選択したときにblur()関数を呼び出すことで、それを防ぐだけです。

 <input Value="test" onSelect="blur();">

0

JavaScriptを使用して特定の要素のテキスト選択をブロックする必要がある場合、私にとって最も簡単な方法は、次のようなuserSelectスタイルを割り当てることでした。

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