javascript: Tắt tính năng Chọn văn bản


84

Tôi đang sử dụng javascript để tắt lựa chọn văn bản trên webiste của mình.

Mã là:

<script type="text/JavaScript">

function disableselect(e) {
  return false
}

function reEnable() {
  return true
}

document.onselectstart = new Function ("return false")

if (window.sidebar) {
  document.onmousedown = disableselect
  document.onclick = reEnable
}
</script>

Tập lệnh tương tự có thể được tìm thấy ở đây

Trên máy chủ cục bộ của tôi: Tất cả các trình duyệt (Firefox, Chrome, IE và Safari) đều hoạt động tốt.

Trên trang Trực tiếp của tôi: Tất cả đều ổn TRỪ Firefox.

Câu hỏi của tôi là:

  1. Có ai có gợi ý về lý do tại sao Firefox hoạt động khác nhau đối với trang web trực tiếp và máy chủ cục bộ không. Lưu ý: Javascript được bật.

  2. Có lẽ tập lệnh của tôi quá đơn giản nên tôi đã thử cách sau với kết quả CHÍNH XÁC CÙNG


4
Hãy để tôi đề nghị bạn tránh sử dụng Javascript cho trường hợp này. Chỉ cần sử dụng CSS, bạn có thể tìm thêm thông tin về lựa chọn văn bản trong CSS tại câu hỏi này
RienNeVaPlu͢s

Kịch bản thứ hai có thể là quá cũ. Tháo document.all vì tôi tin rằng nó phá vỡ sự hỗ trợ fx!
mplungjan

9
Tôi ghét các trang web làm điều này. Nếu tôi muốn sao chép một số văn bản, tôi có thể mở các công cụ dành cho nhà phát triển và sao chép nó. Đây chỉ là một sự bất tiện không đáng có.
uylmz

4
Đúng như Reek nói. Đừng làm điều này trừ khi bạn có một lý do chính đáng. Nhiều người có thể chỉ muốn chọn một cái gì đó để tìm kiếm nó hoặc sử dụng từ điển để tra một từ. Cấm điều này chỉ là một sự khó chịu có thể khiến mọi người rời khỏi trang web của bạn về lâu dài.
Tiếng Séc

1
Thứ nhất, tôi cũng ghét các Trang cấm chọn (văn bản và nội dung không) chỉ vì "cho vui", nhưng tôi nghĩ đó là một câu hỏi hay, vì có một số lý do chính đáng khiến người ta muốn vô hiệu hóa nó ( ví dụ: để triển khai các cử chỉ chuột hoặc kéo và thả các khối văn bản trong một trò chơi nào đó). Tất nhiên, việc sử dụng JS để đạt được mục đích đó là không tốt, nhưng giải pháp CSS cũng có vấn đề (trong một số trình duyệt, user-selectmột mình sẽ không hoạt động, nó yêu cầu tiền tố "-vendor-", như -moz-user-select-webkit-user-select, vì vậy, để làm cho nó hoạt động , cần phải đặt tất cả các biến thể có thể thành none).
Cyberknight

Câu trả lời:


209

Chỉ cần sử dụng phương pháp css này:

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

Bạn có thể tìm thấy câu trả lời tương tự ở đây: Làm cách nào để tắt tính năng đánh dấu vùng chọn văn bản bằng CSS?


6
Ngoài ra, hãy thêm liên kết từ nơi bạn tìm thấy câu trả lời này: stackoverflow.com/questions/826782/…
Ron van der Heijden,

Cảm ơn rât nhiều. CSS trong nội dung hoạt động cho mọi trường hợp ngoại trừ IE. Có giải pháp CSS gọn gàng nào để giải quyết vấn đề này cho IE không? Bây giờ tôi đang sử dụng kết hợp Js và CSS để bao gồm tất cả các trình duyệt !! thk u.
arpeggio

1. Tại sao asnwer này không được gắn thẻ là giải pháp? ... Nó giải quyết vấn đề được đề cập theo cách chính xác và đơn giản nhất. 2. Cần lưu ý rằng việc định nghĩa CSS này có thể được thực hiện trên bất kỳ phần tử HTML nào chứ không chỉ BODY.
TheCuBeMan

1
@TheCuBeMan "user-select" là một tính năng không chuẩn và IMO, do đó không phải là giải pháp tốt nhất.
ndugger

1
Đây có lẽ là cách tiếp cận tốt nhất - các trình duyệt xử lý nó theo cách khác nhau vì nó phức tạp và tất cả chúng đều có những cách khác nhau. Cụ thể, họ muốn cung cấp UX dự định (không có lựa chọn) trong khi vẫn cho phép người dùng lựa chọn nếu họ thực sự muốn . Dự thảo W3C có nhiều ghi chú hơn và caniuse cho thấy sự hỗ trợ tuyệt vời. Không sao khi các trình duyệt xử lý nó theo cách khác nhau - người dùng sẽ nhận được trải nghiệm mà trình duyệt ưa thích của họ cung cấp.
Shawn Erquhart

24

Tôi đang viết điều khiển ui thanh trượt để cung cấp tính năng kéo, đây là cách của tôi để ngăn nội dung chọn khi người dùng đang kéo:

function disableSelect(event) {
    event.preventDefault();
}

function startDrag(event) {
    window.addEventListener('mouseup', onDragEnd);
    window.addEventListener('selectstart', disableSelect);
    // ... my other code
}

function onDragEnd() {
    window.removeEventListener('mouseup', onDragEnd);
    window.removeEventListener('selectstart', disableSelect);
    // ... my other code
}

ràng buộc startDragtrên dom của bạn:

<button onmousedown="startDrag">...</button>

Nếu bạn muốn vô hiệu hóa tĩnh chọn văn bản trên tất cả phần tử, hãy thực thi mã khi các phần tử được tải:

window.addEventListener('selectstart', function(e){ e.preventDefault(); });

      

2
Đây là giải pháp tốt nhất, vì giải pháp CSS không hoạt động đối với các div có contenteditablethuộc tính (chẳng hạn như nếu bạn muốn tắt lựa chọn văn bản trong khi điều khiển đang được thay đổi kích thước bằng chuột của người dùng).
mbomb007

12

Đối với JavaScript, hãy sử dụng hàm này:

function disableselect(e) {return false}
document.onselectstart = new Function (return false)
document.onmousedown = disableselect

để kích hoạt lựa chọn, hãy sử dụng cái này:

function reEnable() {return true}

và sử dụng chức năng này ở bất cứ đâu bạn muốn:

document.onclick = reEnable

Ngoại trừ new Function (return false)không phải là mã javascript hợp lệ. Chỉ sử dụng document.onselectstart = disableselect.
amik

@amik thì sao: document.oncontextmenu = new Function("return false;");hoặc cái này bằng CSS:<body onselectstart="return false">
Hassan Azimi

new Function("return false;")sẽ hoạt động, nhưng phức tạp không cần thiết so với chỉ sử dụng disableselectcái mà bạn đã có. onselectstart="return false"cũng sẽ hoạt động, nhưng không liên quan gì đến CSS. Ngoài ra, tôi nhận thấy phần còn lại của câu trả lời của bạn cũng sai - reEnablechức năng sẽ không hoạt động.
amik

@amik haha ​​không có gì là cần thiết trong JavaScript nhưng chúng tôi vẫn làm. Chắc chắn, mã có thể được cấu trúc lại nhưng hãy xem câu hỏi, câu trả lời, trả lời câu hỏi không cố gắng làm bài tập về nhà.
Hassan Azimi

Nhưng SO là một nơi dành cho giáo dục, vì vậy tôi cho rằng việc đưa ra một câu trả lời vừa sai về mặt kỹ thuật vừa không giải thích được chút nào không phải là một ý kiến ​​hay.
amik

4

Nếu bạn có một trang html như thế này:

    <cơ thể
    onbeforecopy = "return false"
    ondragstart = "return false" 
    onselectstart = "return false" 
    oncontextmenu = "return false" 
    onselect = "document.selection.empty ()" 
    oncopy = "document.selection.empty ()">

Có một cách đơn giản để tắt tất cả các sự kiện:

document.write(document.body.innerHTML)

Bạn có nội dung html và mất những thứ khác.


4

Một cũng có thể sử dụng, hoạt động tốt trong tất cả các trình duyệt, yêu cầu javascript:

onselectstart = (e) => {e.preventDefault()}

Thí dụ:

onselectstart = (e) => {
  e.preventDefault()
  console.log("nope!")
  }
Select me!


Một giải pháp thay thế js khác, bằng cách kiểm tra hỗ trợ CSS và vô hiệu hóa userSelect, hoặc MozUserSelectcho Firefox.

let FF
if (CSS.supports("( -moz-user-select: none )")){FF = 1} else {FF = 0}
(FF===1) ? document.body.style.MozUserSelect="none" : document.body.style.userSelect="none"
Select me!


Css thuần túy, cùng logic. Cảnh báo rằng bạn sẽ phải mở rộng các quy tắc đó cho mọi trình duyệt, điều này có thể dài dòng.

@supports (user-select:none) {
  div {
    user-select:none
  }
}

@supports (-moz-user-select:none) {
  div {
    -moz-user-select:none
  }
}
<div>Select me!</div>


0

Đơn giản Sao chép văn bản này và đặt trước </body>

function disableselect(e) {
  return false
}

function reEnable() {
  return true
}

document.onselectstart = new Function ("return false")

if (window.sidebar) {
  document.onmousedown = disableselect
  document.onclick = reEnable
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.