Ngăn lựa chọn trong HTML


82

Tôi có một div trên một trang HTML và bất cứ khi nào tôi nhấn chuột và di chuyển nó, nó sẽ hiển thị rằng con trỏ "không thể thả" giống như nó đang chọn một thứ gì đó. Có cách nào để tắt lựa chọn không? Tôi đã thử CSS user-select mà không thành công.

Câu trả lời:


166

Các biến thể độc quyền của user-selectsẽ hoạt động trong hầu hết các trình duyệt hiện đại:

*.unselectable {
   -moz-user-select: -moz-none;
   -khtml-user-select: none;
   -webkit-user-select: none;

   /*
     Introduced in IE 10.
     See http://ie.microsoft.com/testdrive/HTML5/msUserSelect/
   */
   -ms-user-select: none;
   user-select: none;
}

Đối với IE <10 và Opera, bạn sẽ cần sử dụng unselectablethuộc tính của phần tử mà bạn muốn không được chọn. Bạn có thể đặt điều này bằng cách sử dụng một thuộc tính trong HTML:

<div id="foo" unselectable="on" class="unselectable">...</div>

Đáng buồn là thuộc tính này không được kế thừa, có nghĩa là bạn phải đặt một thuộc tính trong thẻ bắt đầu của mọi phần tử bên trong <div>. Nếu đây là sự cố, thay vào đó bạn có thể sử dụng JavaScript để thực hiện điều này một cách đệ quy cho phần tử con của một phần tử:

function makeUnselectable(node) {
    if (node.nodeType == 1) {
        node.setAttribute("unselectable", "on");
    }
    var child = node.firstChild;
    while (child) {
        makeUnselectable(child);
        child = child.nextSibling;
    }
}

makeUnselectable(document.getElementById("foo"));

nó không được chọn nhưng vẫn sao chép vào clipboard (theo spec MDC tại goo.gl/5P8uH )
ithkuil

@ithkuil: Thật thú vị. Có vẻ như -moz-nonelà con đường để đi. Tôi sẽ sửa đổi câu trả lời của tôi.
Tim Down

Trong Firefox 5, -moz-nonecó vẻ như không được tự động hoàn tất bởi Firebug mặc dù nonelà: -moz-user-select: none(hoạt động)
Lekensteyn

@Lekensteyn: Cả hai đều hoạt động để ngăn chặn sự lựa chọn, nhưng có một điểm khác biệt: developer.mozilla.org/en/CSS/-moz-user-select . Tuy nhiên, phần sau dường như không sao lưu điều này trong Firefox 5: jsfiddle.net/vhwJ5/2 .
Tim Down

tôi khá chắc chắn user-selectchỉ xử lý văn bản và không có loại yếu tố nào khác
oldboy

10

Có vẻ như CSS người dùng chọn không ngăn cản việc kéo và thả hình ảnh ... vì vậy ..

HTML:

<img src="ico.png" width="20" height="20" alt="" unselectable="on" /> Blabla bla blabla

CSS:

* {
     user-select: none;
    -khtml-user-select: none;
    -o-user-select: none;
    -moz-user-select: -moz-none;
    -webkit-user-select: none;
}

::selection { background: transparent;color:inherit; }
::-moz-selection { background: transparent;color:inherit; }

JS:

$(function(){
    $('*:[unselectable=on]').mousedown(function(event) {
        event.preventDefault();
        return false;
    });
});

Bạn có thể sử dụng bộ chọn "img" nhưng hãy cẩn thận với "event.preventDefault ();" bởi vì không có sự kiện nào khác được liên kết với "mousedown" sẽ hoạt động trên chúng trong trang của bạn ...
molokoloco

5

Tôi sử dụng cancelBubble=truestopPropagation()trong chuột xuống và di chuyển các trình xử lý.


2
Điều khiến tôi kinh ngạc là bạn cần nó ở cả trình điều khiển chuột xuống và di chuyển, không chỉ là di chuyển!
Matthew Schinckel,

4

event.preventDefault() dường như thực hiện thủ thuật (được thử nghiệm trong IE7-9 và Chrome):

jQuery('#slider').on('mousedown', function (e) {
    var handler, doc = jQuery(document);
    e.preventDefault();
    doc.on('mousemove', handler = function (e) {
        e.preventDefault();
        // refresh your screen here
    });
    doc.one('mouseup', function (e) {
        doc.off('mousemove', handler);
    });
});

Cảm ơn bạn vì điều này, đã tìm kiếm cách thích hợp để chặn một danh sách đã chọn Tôi đã chặn khi nhấp chuột, vì các giá trị bị vô hiệu hóa không đăng ..... haha
thekevshow 18/02/16

1

Bạn đã có một số loại hình ảnh trong suốt mà bạn chọn chưa? Thông thường, biểu tượng "không thể thả" xuất hiện khi bạn kéo hình ảnh. Nếu không, nó thường chọn văn bản khi bạn kéo. Nếu vậy, bạn có thể phải đặt hình ảnh đằng sau mọi thứ bằng cách sử dụng z-index.

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.