더블 클릭 후 텍스트 선택 방지


294

내 웹 응용 프로그램의 범위에서 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
사실 이후에 선택을 제거하는 대신 선택을 실제로 방지 할 수있는 방법이 있습니까? 또한 두 번째 if 문은 가독성을 높이기 위해 else 안에있을 수 있습니다.
David

8
-moz-와 함께 -webkit- 접두사 (Webkit 기반 브라우저에 선호되는 접두사)를 사용하는 것이 가장 좋습니다 (및 Konqueror 사용자가 많은 경우 -khtml-).
eyelidlessness

3
이 같은 IE10에서 사용할 수 있습니다 -ms-user-select: none;참조 blogs.msdn.com/b/ie/archive/2012/01/11/...의 @PaoloBergantino
레몬

1
@TimHarper : 라이브러리를 사용하는 Javascript 솔루션까지는 확실합니다. 왜 이것이 공감대를 보장하는지 확실하지 않습니다.
Paolo Bergantino

14
두 번 클릭 할 때 선택을 비활성화하는 것과 완전히 비활성화하는 것에는 차이가 있습니다. 첫 번째는 유용성을 증가시킵니다. 두 번째는 줄어 듭니다.
Robo Robok

112

일반 자바 스크립트에서 :

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

또는 jQuery를 사용하여 :

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

26
그렇습니다. 마우스 다운에있을 수있는 다른 처리기를 죽이지 않는 대신 return false사용 event.preventDefault()했던 것과 동일한 문제 (+1)를 해결하기 위해 이것을 사용했습니다 .
Simon East

2
:( 페이지의이 휴식 텍스트 영역 요소
존 ktejik

1
element텍스트 영역 인 경우에만 @johnktejik 입니다.
fregante

11
이 이벤트 핸들러가 "dblclick"에 할당 될 것으로 예상되지만 작동하지 않습니다. 너무 이상합니다. "마우스 다운"을 사용하면 드래그하여 텍스트를 선택할 수 없습니다.
corwin.amber

74

두 번 클릭 한 후에 만 ​​텍스트를 선택하지 못하게하려면 :

당신은 MouseEvent#detail재산을 사용할 수 있습니다 . 마우스 다운 또는 마우스 업 이벤트의 경우 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 전용 솔루션입니다. 감사!
이안 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"클래스가있는 객체를 여러 번 클릭하면 텍스트 선택을 방지하고 싶습니다.

$(".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.