2017-12-15 97 views
5

Hãy nói rằng tôi có một văn bản với nhãn hiệu, chẳng hạn như:Làm thế nào để vô hiệu hóa lựa chọn một số văn bản trong div?

enter image description here

Và tôi muốn vô hiệu hoá chọn như vậy mà bắt đầu hoặc kết thúc lựa chọn không nằm trong dấu. Do đó, tất cả những lựa chọn nên có thể:

enter image description here
enter image description here
enter image description here

Mặt khác, những lựa chọn nên được vô hiệu hóa:

enter image description here
enter image description here

Cho đến nay, tôi chỉ cố gắng sử dụng một số css đơn giản,

mark { 
 
    -khtml-user-select: all; 
 
    -webkit-user-select: all; 
 
    -o-user-select: all; 
 
    user-select: all; 
 
}
This is <mark>marked text</mark>. I want to disable selecting only part of <mark>marked text</mark>.

jsfiddle link

Có cách nào để làm điều này? Bất kỳ câu trả lời sẽ được đánh giá cao!


Tôi đã đạt được những gì tôi muốn làm, vì vậy tôi chia sẻ ở đây.

function checkSelection() { 
 
    var sel = window.getSelection(); 
 
    var marks = document.getElementsByTagName('mark'); 
 
    for(var i = 1; i < sel.rangeCount; i++) { 
 
    sel.removeRange(sel.getRangeAt(i)); 
 
    } 
 
    var range = sel.getRangeAt(0); 
 
    var startnode = range.startContainer; 
 
    var endnode = range.endContainer; 
 
    for (var i = 0; i < marks.length; i++) { 
 
    \t if (marks[i].contains(startnode)) { 
 
     range.setStartBefore(startnode); 
 
    } 
 
    \t if (marks[i].contains(endnode)) { 
 
     range.setEndAfter(endnode); 
 
    } 
 
    } 
 
} 
 

 
document.addEventListener('mouseup', checkSelection) 
 
document.addEventListener('touchend', checkSelection)
This is <mark>marked text</mark>. I want to disable selecting only part of <mark>marked text</mark>.

jsfiddle link

+3

Tôi không thấy bất kỳ cách đơn giản nào để thực hiện việc này. Bạn sẽ phải phân tích cú pháp văn bản, sử dụng các sự kiện chuột, thêm các lớp học, v.v. – kemotoe

+0

Bạn có thể gửi một số báo cáo lỗi và hy vọng các nhà cung cấp trình duyệt sửa chữa nó. https://drafts.csswg.org/css-ui-4/#valdef-user-select-all "Nếu lựa chọn sẽ chứa một phần của phần tử, thì lựa chọn phải chứa toàn bộ phần tử bao gồm tất cả các phần tử con của nó" - nó không nói bất cứ điều gì về việc chọn phải bắt đầu bằng một cú nhấp chuột (MDN cho chúng tôi biết) –

+0

Về phần "Có cách nào để thực hiện việc này không", hãy xem https://stackoverflow.com/questions/985272/selecting- text-in-an-element-akin-to-highlight-với-chuột-bạn (có) –

Trả lời

1

Tôi không nghĩ rằng nó sẽ có thể làm với CSS một mình, bạn có nhiều khả năng sẽ cần JavaScript để phát hiện những yếu tố người dùng bắt đầu lựa chọn.


Những gì tôi đã làm là tôi đã sử dụng phương pháp containsNode từ API Selection Tool (một dự thảo Working, có thể không làm việc với tất cả các trình duyệt nào, và có thể được tán thành) để phát hiện xem các phạm vi lựa chọn một trong hai chứa toàn bộ phần tử được đánh dấu hoặc hoàn toàn không. Nếu lựa chọn chỉ chứa một phần của một phần tử được đánh dấu, nó sẽ xóa lựa chọn bằng cách sử dụng phương thức removeAllRanges.

function checkSelection() { 
 
    var sel = window.getSelection() 
 
    var marks = document.getElementsByTagName('mark') 
 
    for (var i = 0; i < marks.length; i++) { 
 
    if (sel.containsNode(marks[i], false) !== sel.containsNode(marks[i], true)) 
 
     sel.removeAllRanges() // clear selection 
 
    } 
 
} 
 

 
document.addEventListener('mouseup', checkSelection) 
 
document.addEventListener('touchend', checkSelection)
mark { 
 
    background: yellow; 
 
}
This is <mark>marked text</mark>. I want to disable selecting only part of <mark>marked text</mark>.

Lưu ý rằng bạn sẽ cần phải nắm bắt tất cả các phương pháp lựa chọn mà bạn muốn, cho dù bằng sự kiện chuột và các sự kiện liên lạc (tất cả những gì tôi bao gồm), lựa chọn caret bàn phím, hoặc lựa chọn chương trình.


Điều này có thể được mở rộng và điều chỉnh theo ý thích của bạn, nhưng đây là ảnh đẹp nhất của tôi khi sao chép hành vi bạn muốn từ thông số kỹ thuật của bạn. Đoạn mã trên không hoạt động chính xác mọi lúc nếu một trong các giới hạn của lựa chọn bắt đầu hoặc kết thúc ở rìa của một vùng được đánh dấu, nhưng đoạn mã phải thể hiện khái niệm cơ bản đằng sau những gì sẽ hoạt động, chỉ với một chút tinh chỉnh các trường hợp.

+0

+1 để cung cấp một số ý tưởng hữu ích! Tuy nhiên, nó không thành công khi lựa chọn bắt đầu hoặc kết thúc tại biên giới của nhãn hiệu. – didgogns

+0

@didgogns Tôi đã đề cập đến trường hợp đó trong câu trả lời của tôi. Tôi đã cung cấp cho bạn mã cơ bản để hoàn thành tác vụ bạn đã yêu cầu và giải thích lý do tại sao nó hoạt động. Để điều chỉnh nó theo sở thích cụ thể, bạn sẽ phải chỉnh sửa nó để hoạt động chính xác theo cách bạn muốn. – andrewgu

0

thuộc tính CSS sử dụng chọn chưa chính thức và nó chỉ được hỗ trợ bởi các trình duyệt mới nhất.

Anyways bạn có thể sử dụng user-select: none; và kèm theo tất cả các văn bản mà không thể được lựa chọn bên trong một thẻ

https://developer.mozilla.org/en-US/docs/Web/CSS/user-select

span Nhưng bạn có thể thử một cái gì đó như thế này

.unselectable { 
 
    -moz-user-select: none; 
 
    -webkit-user-select: none; 
 
    -ms-user-select: none; 
 
    user-select: none; 
 
}
<p>This text can be selected, But <span class="unselectable">this</span> can only be <span class="unselectable">partially se</span>lected</p>

https://developer.mozilla.org/en-US/docs/Web/CSS/user-select

+1

Anh ấy không muốn Không thể chọn, không thể chọn một phần. – Keith

Các vấn đề liên quan