2011-03-25 43 views
52

Tôi đã thực hiện điều khiển phân trang và nhận thấy rằng trong khi nhấp vào các nút, rất dễ dàng vô tình chọn từng hình ảnh và văn bản. Có thể ngăn chặn điều này không?Làm cách nào để ngăn chặn lựa chọn văn bản/phần tử khi kéo con trỏ

Để làm rõ việc chọn tôi có nghĩa là làm nổi bật bằng chuột. (Thử kéo chuột từ một phía của màn hình sang màn hình khác.)

Nếu bạn cố gắng làm nổi bật văn bản/điều khiển trong lưới này, bạn không thể chọn văn bản/điều khiển trong lưới này. Làm thế nào là thực hiện? Link

+0

có thể trùng lặp với h ttp: //stackoverflow.com/questions/2700000/how-to-disable-text-selection-using-jquery – kapa

+0

một stackoverflow trùng lặp có thể có khác.com/questions/2326004/prevent-selection-in-html –

Trả lời

77

kéo và chọn cả khởi tạo trên sự kiện chuột xuống và cập nhật về di chuyển chuột tiếp theo. Khi bạn xử lý các sự kiện để bắt đầu kéo, hoặc đi theo con chuột, hủy bọt của sự kiện và ghi đè sự trở lại trình duyệt mặc định:

một cái gì đó như thế này trong của bạn bắt đầu kéo mousedown và di chuyển handlers-

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

tại sao chúng ta cần phải ngăn chặn các bong bóng cũng .... không phải là e.preventDefault() đủ? –

+4

Yeah e.preventDefault() phải là tất cả những gì bạn cần trong các trình duyệt hiện đại. Phần còn lại của mã là dư thừa: window.event là dành cho các phiên bản cũ của IE, nhưng vì những sự kiện đó không có phương thức preventDefault và trả về false không được trả về ở hàm gọi hàm pauseEvent ... nó không làm gì cả (thậm chí trong năm 2011). – Sjeiti

+0

CSS: 'user-select: none;' là những gì tôi sử dụng. Không cần JS để giải quyết vấn đề này nữa Tôi nên nghĩ rằng – Ryan

4

thử điều này:

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

làm cách nào tôi có thể sửa đổi để chỉ hoạt động trên một div cụ thể? –

+1

thử điều này: $ ('yourDivSelector') getSelection(). RemoveAllRanges() –

+1

Sự kiện 'selectstart' không tồn tại trong Firefox. –

7

này có thể đạt được sử dụng CSS trong hầu hết các trình duyệt và các unselectable expando trong IE. Xem câu trả lời của tôi ở đây: How to disable text selection highlighting using CSS?

+0

Đây là một câu trả lời tốt hơn nhiều so với chấp nhận, bỏ qua sự kiện hoàn toàn – rtpax

13

Tôi muốn nhận xét nhưng tôi không có đủ danh tiếng. Sử dụng chức năng được đề xuất từ ​​@kennebec giải quyết được sự cố của tôi trong thư viện kéo javascript của tôi. Nó hoạt động hoàn hảo.

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

tôi gọi nó trong chức năng tùy chỉnh chuột và chuột, ngay sau khi tôi có thể nhận ra tôi đã nhấp vào phần tử bên phải. Nếu tôi gọi nó chỉ là trên đầu trang của chức năng tôi chỉ cần giết bất kỳ nhấp chuột vào tài liệu. Chức năng của tôi được đăng ký dưới dạng sự kiện trên document.body.

+0

Bây giờ bạn có thêm 10 cái nữa :) – Adaptabi

33

Để kéo, bạn đang chụp các sự kiện mousedownmousemove. (Và hy vọng touchstarttouchmove sự kiện là tốt, để hỗ trợ giao diện cảm ứng.)

Bạn sẽ cần phải gọi event.preventDefault() ở cả downmove sự kiện để giữ cho trình duyệt từ chọn văn bản.

Ví dụ (sử dụng 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

Cảm ơn Robin, vì tò mò là có sự khác biệt giữa 'window.document' và' window' hay chỉ 'tài liệu'? Tôi khá chắc chắn 'tài liệu' là một con của' cửa sổ' .. –

+1

'cửa sổ' là phạm vi ngoài cùng trong đó Javascript chạy trong trình duyệt. Vì vậy, bất kỳ biến nào không được khai báo bên trong một hàm là một thuộc tính của 'window'. Tham chiếu 'tài liệu' trực tiếp thực sự là tham chiếu đến' window.document'. –

+2

Theo như tôi có thể nói nó đủ để hủy mặc định chỉ trên sự kiện "mousedown". – tremby

1

chỉ đơn giản là ngăn chặn nó bằng cách gọi blur() chức năng khi được chọn như sau:

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

Nếu bạn cần phải chặn lựa chọn văn bản cho một thành phần nào đó sử dụng JavaScript, thì phương pháp đơn giản nhất đối với tôi là gán kiểu người dùng chọn như sau:

var myElement = document.createElement('div'); 
myElement.style.userSelect = 'none'; 
Các vấn đề liên quan