2011-03-25 14 views
52

ページングコントロールを作成しましたが、ボタンをクリックしている間に個々の画像やテキストを誤って選択するのは非常に簡単です。これを防ぐことはできますか?カーソルのドラッグでテキスト/要素の選択を防止するには

選択を明確にするために、私はマウスでハイライトを意味します。

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

+0

可能なhの複製ttp://stackoverflow.com/questions/2700000/how-to-disable-text-selection-using-jquery – kapa

+0

別の重複可能なhttp:// stackoverflow。com/questions/2326004/prevent-selection-in-html –

答えて

77

マウスダウンイベントでの初期化と後続のマウスの動きでの更新の両方をドラッグして選択する。あなたはドラッグを開始するために、またはマウスに従うように、イベントのバブリングをキャンセルし、デフォルトのブラウザの復帰を上書きするイベントを処理する場合:このような

何かがあなたの中でマウスダウンをドラッグし始めると

e=e || window.event; 
pauseEvent(e); 
をhandlers-移動します
function pauseEvent(e){ 
    if(e.stopPropagation) e.stopPropagation(); 
    if(e.preventDefault) e.preventDefault(); 
    e.cancelBubble=true; 
    e.returnValue=false; 
    return false; 
} 
+7

なぜバブリングも止める必要がありますか?e.preventDefault()で十分ですか? –

+4

ええ、e.preventDefault()は現代のブラウザで必要なものでなければなりません。その他のコードは冗長です:window.eventはIEの古いバージョンですが、これらのイベントにはpreventDefaultメソッドがなく、pauseEvent関数呼び出しでfalseが返されないため、何もしません(2011年でさえも)。 – Sjeiti

+0

CSS: 'user-select:none;'は私が使っているものです。 JSをこれ以上解決する必要はありません。 – Ryan

4

はこれを試してみてください。

document.onselectstart = function() 
{ 
    window.getSelection().removeAllRanges(); 
}; 
+0

特定のdivでのみ動作するように修正する方法はありますか? –

+1

これを試してください:$( 'yourDivSelector')。getSelection()。removeAllRanges() –

+1

'selectstart'イベントはFirefoxでは存在しません。 –

7

これは、ほとんどのブラウザとIEでunselectableはExpandoにCSSを使用して達成することができます。ここで私の答えを参照してください:How to disable text selection highlighting using CSS?

+0

これは受け入れられているよりもはるかに良い答えです。イベントを完全にバイパスしてください – rtpax

13

私はコメントしたかったが、評判が足りませんでした。 @kennebecからの示唆された機能を使用すると、私のJavaScriptのドラッグライブラリの問題が解決しました。 それは完璧に動作します。

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

私は右の要素をクリック認識することができた直後に、私のマウスダウンとのMouseMoveカスタム機能でそれを呼びました。私は関数の上にちょうどそれを呼び出す場合は、私はちょうど文書の任意のクリックを殺す。 私の関数はdocument.bodyにイベントとして登録されています。

+0

あなたは今10を持っています:) – Adaptabi

33

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

は、テキストを選択すると、ブラウザを保つために、両方のdownmoveイベントでevent.preventDefault()を呼び出す必要があります。 (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; 
}); 
+0

ありがとうRobinは、 'window.document'と' window'または単に 'document'の間に違いがありますか? 'document'は' window'の子であると確信しています。 –

+1

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

+2

"mousedown"イベントだけでデフォルトを取り消すことができます。 – tremby

1

単に次のように選択したときにぼかし()関数を呼び出すことによってそれを防ぐ:

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

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

var myElement = document.createElement('div'); 
myElement.style.userSelect = 'none'; 
関連する問題