Cegah pemilihan teks setelah klik dua kali

294

Saya menangani acara dblclick pada rentang waktu di aplikasi web saya. Efek sampingnya adalah klik dua kali memilih teks pada halaman. Bagaimana saya bisa mencegah pemilihan ini terjadi?

David
sumber

Jawaban:

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

Anda juga dapat menerapkan gaya ini ke rentang untuk semua browser non-IE dan 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+ */
}
Paolo Bergantino
sumber
44
Apakah ada cara untuk benar-benar mencegah seleksi selain menghapus seleksi setelah fakta? Juga, pernyataan if kedua Anda bisa berada di dalam yang lain jika untuk keterbacaan yang lebih baik.
David
8
Paling baik menggunakan awalan -webkit- (ini adalah awalan yang lebih disukai untuk browser berbasis Webkit) selain -moz- (dan -khtml- jika Anda memiliki audiens Konqueror yang besar).
kelopak mata
3
Ini sekarang tersedia di IE10 sebagai -ms-user-select: none;lihat blogs.msdn.com/b/ie/archive/2012/01/11/... @PaoloBergantino
lemon
1
@TimHarper: Sejauh solusi Javascript menggunakan perpustakaan, tentu saja. Tidak begitu yakin mengapa hal itu menjamin downvote.
Paolo Bergantino
14
Ada perbedaan antara menonaktifkan pilihan pada klik ganda dan menonaktifkan sepenuhnya. Yang pertama meningkatkan kegunaan. Yang kedua menurun.
Robo Robok
112

Dalam javascript biasa:

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

Atau dengan jQuery:

jQuery(element).mousedown(function(e){ e.preventDefault(); });
Tom
sumber
26
Yap, saya menggunakan ini untuk memecahkan masalah yang sama dengan yang saya alami (+1), kecuali alih-alih return falsedigunakan event.preventDefault()yang tidak membunuh penangan lain yang mungkin Anda miliki di mousedown.
Simon East
2
Ini memecah elemen textarea pada halaman :(
john ktejik
1
@johnktejik hanya jika elementmerupakan textarea, ya.
gratis
11
Akan berharap untuk memiliki penangan acara ini ditugaskan untuk "dblclick" - tapi itu tidak berhasil, yang sangat aneh. Dengan "mousedown", Anda tentu saja juga dicegah memilih teks dengan menyeret.
corwin.amber
74

Untuk mencegah pemilihan teks HANYA setelah klik dua kali:

Anda bisa menggunakan MouseEvent#detailproperti. Untuk acara mousedown atau mouseup, ini adalah 1 ditambah jumlah klik saat ini.

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);

Lihat https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail

4esn0k
sumber
4
Ini luar biasa! Bekerja di Firefox 53.
Zaroth
6
Ini harus menjadi jawaban yang diterima. Segala sesuatu yang lain di sini mencegah pemilihan mouse (atau lebih buruk) daripada menjawab pertanyaan OP " Mencegah pemilihan teks setelah klik dua kali "
billynoah
1
Berfungsi di Chrome, juga
KS74
1
Bekerja juga di IE 11 Windows 10 =). Terima kasih telah berbagi ini.
Fernando Vieira
Gunakan (event.detail === 2)untuk benar-benar mencegah HANYA klik dua kali (dan bukan klik tiga kali dll.)
Robin Stewart
32

FWIW, saya setel user-select: noneke elemen induk dari elemen anak-anak yang saya tidak ingin entah bagaimana dipilih ketika mengklik dua kali di mana saja pada elemen induk. Dan itu berhasil! Yang keren adalah contenteditable="true", pemilihan teks dan lain-lain masih bekerja pada elemen anak!

Jadi seperti:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>
kyw
sumber
Terima kasih, merica di style="user-select: note"mana-mana mengurutkan masalah yang saya coba selesaikan :)
esaruoho
Solusi css-only yang bagus untuk kasus-kasus di mana Anda pada dasarnya tidak pernah menginginkan teks dipilih. Terima kasih!
Ian Lovejoy
11

Fungsi Javascript sederhana yang membuat konten di dalam elemen-halaman tidak dapat dipilih:

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";
  }
}

sumber
4

Bagi mereka yang mencari solusi untuk Angular 2+ .

Anda bisa menggunakan mousedownoutput dari sel tabel.

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

Dan mencegah jika 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 ...
}

The dblclickoutput terus bekerja seperti yang diharapkan.

bvdb
sumber
3

atau, di mozilla:

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

Di IE,

document.body.onmousedown = function() { return false; } // valid for any html object as well
José Leal
sumber
5
Solusi ini tidak memungkinkan memilih teks sama sekali.
jmav
1
@ jmav Anda harus menerapkan fungsi yang menimpa pada elemen yang lebih spesifik daripada document.body.
Cypher
2

Utas lama, tetapi saya menemukan solusi yang saya yakini lebih bersih karena tidak menonaktifkan setiap genap yang terikat pada objek, dan hanya mencegah pemilihan teks acak dan tidak diinginkan pada halaman. Sangat mudah, dan bekerja dengan baik untuk saya. Berikut ini sebuah contoh; Saya ingin mencegah pemilihan teks ketika saya mengklik beberapa kali pada objek dengan kelas "panah-kanan":

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

HTH!

tidak ada
sumber
1

Jika Anda mencoba untuk sepenuhnya mencegah pemilihan teks dengan metode apa pun serta hanya dengan klik ganda, Anda dapat menggunakan user-select: noneatribut css. Saya telah menguji di Chrome 68, tetapi menurut https://caniuse.com/#search=user-select itu seharusnya berfungsi di browser pengguna normal lainnya saat ini.

Secara kebiasaan, di Chrome 68 itu diwarisi oleh elemen anak, dan tidak mengizinkan pemilihan teks yang berisi elemen bahkan ketika teks di sekitar dan termasuk elemen dipilih.

stackuser83
sumber
0

Untuk mencegah IE 8 CTRL dan SHIFT klik pemilihan teks pada elemen individual

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

Untuk mencegah pemilihan teks pada dokumen

window.onload = function(){
  document.onselectstart = function(){
    return false;
  }
}
rajesh
sumber
-2

Saya memiliki masalah yang sama. Saya menyelesaikannya dengan beralih ke <a>dan menambahkan onclick="return false;"(sehingga mengkliknya tidak akan menambah entri baru ke riwayat browser).

minhle_r7
sumber